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

解決


やおきな  2005-03-13 03:04:31  No: 120210

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-13 04:39:27  No: 120211

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


やおきな  2005-03-14 04:50:22  No: 120212

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

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


Say  2005-03-14 06:12:51  No: 120213

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

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

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


やおきな  2005-03-14 18:48:10  No: 120214

受け渡しは、構造体の配列の構造体になっています。
*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の単位で行おうと思っています。
そして、配列と文字列の取得は個別の処理
でないとダメではないかと考えています。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加