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)
よろしくお願いします。
相手がポインタの場合、
アドレスの番地は ByVal 〜 As Integer で取れるでしょうから、
あとはRtlMoveMemory使うとか。
Say さん、ありがとうございます。
RtlMoveMemoryでstructの中身を1つづつ取り出すのが大変でした。
特に文字列や、配列などに時間が掛かってしまい、
今日1日疲れましたが、全てを確認できました。
何か良い方法があったらご教示下さい。
アラインメントさえ注意すれば、
C側と同等の構造体をVB側で定義して、
ByRefで受け渡し可能ですが、
受け側がポインタのポインタになっているところをみると、
C側では構造体の配列か何かになっているのでしょうか?
(メモリ構造さえ同じなら、それでも受け渡し可能ですが)
RtlMoveMemoryを使うにしても、
プレーンなバイト配列などにコピーして解析するよりも、
C側と同等の構造体(配列)変数を定義しておいて、
そこにコピーしたほうが楽なのではないかと。
構造体の受け渡しに関しては、既存のAPI(GetPrinterとか)の
使用例などを参考にしてはいかがでしょう?
受け渡しは、構造体の配列の構造体になっています。
*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の単位で行おうと思っています。
そして、配列と文字列の取得は個別の処理
でないとダメではないかと考えています。
単純に済めばうれしいのですが・・・
ツイート | ![]() |