2015/04/21(Tue) 10:15:52 編集(投稿者)
■75641 (魔界の仮面弁士 さん) に返信
返信が遅れて申し訳御座いません。
> この部分のコードと、C++側の構造体定義は公開できますか?
> こちらでも検証してみたいので…。
下記のようになっていると思われます。
-- 宣言部 ----
typedef struct {
BSTR wstr1;
BSTR wstr2;
int wint1;
} testStruct1
-- 処理 ----
Test1_API int __stdcall Test1(LPSAFEARRAY *Data1, LPSAFEARRAY *Data2)
testStruct1 oTestStruct1;
int nCnt;
long idx,lb,ub;
LPSAFEARRAY psa = *Data1;
SafeArrayLock(psa);
SafeArrayGetLBound(psa, 1, &lb);
SafeArrayGetUBound(psa, 1, &ub);
for( idx = lb; idx <= ub; idx++ ){
SafeArrayGetElement(psa, &idx, &testStruct1);
−何か処理−
SafeArrayPutElement(psa, &idx, &testStruct1);
}
SafeArrayUnlock(psa);
}
■No75643 (通りすがり さん) に返信
> ということで、CあるいはC++で記述されたDLLを扱う場合はVB6.0が生成
> していたBSTRをきちんと渡せば期待通りに動作するはずです。
> DLL側がバグっててSysFreeStringを呼んでいる場合は絶対に改善できない
> メモリリークに悩むことになるでしょう。
もう少し試行錯誤してみます。
現状ではCom公開を行わず下記のようにやってみたところ、値は渡せていますが変更の反映がされていない模様
(<[In], [Out]> も試しましたが変わらずでした)
Declare Function Test1 Lib "Test.DLL" (<[In], Out> ByVal oStructure() As Structure1
<[In], Out> ByVal oStructure() As Structure2) As Integer
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
Public Structure Structure1
<MarshalAs(UnmanagedType.BStr)> Dim Str1 As String
<MarshalAs(UnmanagedType.BStr)> Dim Str2 As String
Dim Int1 As Integer
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
Public Structure Structure2
<MarshalAs(UnmanagedType.BStr)> Dim Str3 As String
Dim Int2 As Integer
Dim Int3 As Integer
End Structure
Public oStructure1(9) As Structure1
Public oStructure2(9) As Structure2
-- 処理 ----
Dim iRet As Integer = -1
iRet = Test1(oStructure1, oStructure2)