タイトル : DLLへの文字列ポインタについて 投稿日 : 2008/05/15(Thu) 22:17 投稿者 : cc
VB6.0 sp6からVC++6.0で作成したDLL内関数(以下のような仕様)へデータを渡したいです。 その中で、構造体内の文字列先頭ポインタの扱いがよく分からず困っております。 DLL内関数 Declare Function Func Lib "cmakelib" Alias "_DllFunc@4" (strct_dat As STRCT) As Long STRCTは、独自の構造体でCでは typedef struct { int ldat; // データ char *lptr; // ファイル名 } STRCT, *PSTRCT; と定義されています。 Funcでは、lptrの参照のみするようです。(変更はしない) Q1.VBでは Type STRCT ldat_A As Long ' データA lptr As Long ' ファイル名 ldat_B As Long ' データB End Type の様に定義するのでしょうか? それとも Type STRCT ldat_A As Long ' データA lptr As String ' ファイル名 ldat_B As Long ' データB End Type の様に定義するのでしょうか? Q2. Longとして定義した場合、 Dim strct_d As STRCT strct_d.ldat_A = 5 ' データA StrPtr(StrConv("test.txt", vbFromUnicode)) ' ファイル名 strct_d.ldat_B = 6 ' データB ret = DllFunc(strct_d) の様に処理を書く事は、問題ないのでしょうか? Q3−1. stringとして定義した場合、 "String"と"char*"でサイズが異なり、 データBが間違ってDLLへ伝わる事は無いですか? (API等でchar*を単独で渡す場合は、stringのByVal渡しで良いかと思いますが、 ユーザ定義型の場合はどうなのでしょうか?) Q3−2. DLL内でlptrへアクセスしたときに、正常に文字列を取得できるのでしょうか? Q3−3. stringとして定義した場合は、 Dim strct_d As STRCT strct_d.ldat_A = 5 ' データA strct_d.lptr = "test.txt" ' ファイル名 strct_d.ldat_B = 6 ' データB ret = DllFunc(strct_d) の様に処理を書く事は、問題ないのでしょうか? 以上、どなたかご存じの方いらっしゃいましたら、 アドバイス頂けますでしょうか。 よろしくお願いします。 |