Cの関数からパラメータでアドレスを受取るには

解決


やおきな  2005-03-12 18:04:31  No: 120210  IP: [192.*.*.*]

Cで作成したDLL関数から構造体のアドレスを、
VB.NETで受け取りたいのですが方法が分かりません。

---DLL--------------
int  __stdcall ARetrieve(int id, AINFO** stResult)
{
  *stResult = &stRetrieve1;
  
  return 9999;
}
---Cでcallの場合--------------
  AINFO *rsltinfo=NULL;

  ARetrieve( 1, &rsltinfo);

Objectでなら可能かと思って次のようにしたのですがダメでした。

---VB.NET--------------
   Private Declare Function ARetrieve Lib "testDll" _
         (ByVal id As Integer, ByRef oResult As Object) As Integer

    Dim oRslt As Object

    iRetVal = ARetrieve(n, oRslt)

よろしくお願いします。

編集 削除
Say  2005-03-12 19:39:27  No: 120211  IP: [192.*.*.*]

相手がポインタの場合、
アドレスの番地は ByVal 〜 As Integer で取れるでしょうから、
あとはRtlMoveMemory使うとか。

編集 削除
やおきな  2005-03-13 19:50:22  No: 120212  IP: [192.*.*.*]

Say さん、ありがとうございます。

RtlMoveMemoryでstructの中身を1つづつ取り出すのが大変でした。
特に文字列や、配列などに時間が掛かってしまい、
今日1日疲れましたが、全てを確認できました。
何か良い方法があったらご教示下さい。

編集 削除
Say  2005-03-13 21:12:51  No: 120213  IP: [192.*.*.*]

アラインメントさえ注意すれば、
C側と同等の構造体をVB側で定義して、
ByRefで受け渡し可能ですが、
受け側がポインタのポインタになっているところをみると、
C側では構造体の配列か何かになっているのでしょうか?
(メモリ構造さえ同じなら、それでも受け渡し可能ですが)

RtlMoveMemoryを使うにしても、
プレーンなバイト配列などにコピーして解析するよりも、
C側と同等の構造体(配列)変数を定義しておいて、
そこにコピーしたほうが楽なのではないかと。

構造体の受け渡しに関しては、既存のAPI(GetPrinterとか)の
使用例などを参考にしてはいかがでしょう?

編集 削除
やおきな  2005-03-14 09:48:10  No: 120214  IP: [192.*.*.*]

受け渡しは、構造体の配列の構造体になっています。
*resultにresultNum個のARSLTがあります。
*detInfoも同様です。

typedef struct arslt {
  char*  resultWord;
  char*  result;
  INT32  resultType;
} ARSLT;
typedef struct rsltinfo {
  INT32  resultNum;
  ARSLT  *result;
  INT32  detInfoNum;
  DETINFO  *detInfo;
} AINFO;

VB側ではAINFOのARSLTとDETINFOの行を
Integerに変えてアドレスを格納させました。
昨日は個別にRtlMoveMemoryしましたが、
Structの単位で行おうと思っています。
そして、配列と文字列の取得は個別の処理
でないとダメではないかと考えています。

単純に済めばうれしいのですが・・・

編集 削除