私は、ac# ライブラリからエクスポートされた構造体の配列を C++ コードに渡そうとしています。目的は、構造体の SAFEARRAY を C++ から C# に渡すことです。
私はからの指示に従いました
しかし、 GetRecordInfoFromTypeInfo の呼び出しでこのエラーが発生します
0x80028019 古い形式または無効なタイプ ライブラリです。
私は、ac# ライブラリからエクスポートされた構造体の配列を C++ コードに渡そうとしています。目的は、構造体の SAFEARRAY を C++ から C# に渡すことです。
私はからの指示に従いました
しかし、 GetRecordInfoFromTypeInfo の呼び出しでこのエラーが発生します
0x80028019 古い形式または無効なタイプ ライブラリです。
構造体に文字列が含まれていますか? その場合は、[MarshalAs(UnmanagedType.BStr)] でタグ付けしてください。COM には制限があります。構造体の配列内の文字列は BSTR でなければなりません。TLBExp のデフォルトは LPWSTR であり、呼び出しは終了します。ここを参照してください: http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.100).aspx
ディスパッチ インターフェイスが必要ない場合は、次のようにします。
void MyMethod([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] MyStruct[] data, long size);
SAFEARRAY を使用する必要がある場合は、次のように動作することを期待します (ただし、現時点で Windows マシンを使用できないため、100% 確実ではありません)。
void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] MyStruct[] data);
struct
に変更する余裕がある場合はclass
、これも機能し、UDT の手間を省くことができます。
void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)] MyStruct[] data);