ユーザー定義の構造をVB6アプリケーションからC++DLLに渡す方法を理解しようとしています。
これが私のVB6コードのサンプルです:
Private Type ObjetVB
Rank As Integer
Id As String
End Type
Private Declare Sub testLObj Lib "D:\TestDLL.dll" (Tab_Obj() As ObjetVB)
Private Declare Sub testObj Lib "D:\TestDLL.dll" (ByRef Obj As ObjetVB)
Private Sub Command1_Click()
Dim elements(1 To 4) As ObjetVB, i As Long
For i = 1 To 4
elements(i).Rank = i
elements(i).Id = "Pouet"
Next
testLObj elements()
End Sub
Private Sub Command2_Click()
Dim ObjCrash As ObjetVB
ObjCrash.Rank = 1
ObjCrash.Id = "Pouet"
testObj ObjCrash
End Sub
そして私のC++コードのサンプル:
struct ObjetVB
{
short Rank;
char* Id;
};
void videFichier()
{
ofstream fichier("../../../log.txt", ios::out | ios::trunc);
if(fichier)
{
fichier.close();
}
}
int Log(ObjetVB ObjInput)
{
ofstream fichier("../../../log.txt", ios::out | ios::app);
if(fichier)
{
fichier << ObjInput.Rank << endl << "Id : " << ObjInput.Id << endl << endl;
fichier.close();
}
return 0;
}
void __stdcall testObj (ObjetVB* ObjInput)
{
videFichier();
log(*ObjInput);
}
void __stdcall testLObj (SAFEARRAY **Tab_Obj)
{
ObjetVB *elt;
HRESULT ret;
unsigned long i;
videFichier();
if ((ret = SafeArrayAccessData(*Tab_Obj,(void **) &elt))==S_OK)
{
for (i = 0; i < (*Tab_Obj)->rgsabound->cElements; i++)
{
Log(elt[i]);
}
SafeArrayUnaccessData(*Tab_Obj);
}
}
私の問題は、「Command2」をクリックすると、ログファイルが次のようになることです。
1
Id : Pouet
一方、「Command1」をクリックすると、次のようになります。
1
Id : P
2
Id : P
3
Id : P
4
Id : P
単一のアイテムを渡すと、C++DLLが「char*Id」を文字のチェーンとして認識するのに、アイテムの配列を使用すると、最初の文字へのポインターとして認識されるように見えるのはなぜですか?
そして、最も注目すべきことに、どうすればそれを修正できますか?c++構造体でchar*の代わりにLBSTRを使用しようとしましたが、修正されませんでした。また、VB6文字列を初期化する前に、「elements(i).Id = String(255、vbNullChar)」を追加しようとしましたが、どちらかが役立つことがわかります。
いつものように、読んで助けようとしてくれた皆さんに感謝したいと思います。
ちなみに、英語は私にとって外国語なので、ほぼ理解できるといいのですが、そうでない場合はもちろんお詫びします。
編集 :
それが役立つかどうかはわかりませんが、Mark Bertenshawが提案したことを試した後、これも試しました:VB6で:
Id As String * 10
C ++の場合:
char Id[10];
これはこの奇妙な結果をもたらしました:
Objet :
32
Id : P
Objet :
1
Id :
Objet :
32
Id : P
Objet :
2
Id :