実現したいこと
C#から、COM登録したC++のメソッドを呼び出しています。
VARIANT型の出力引数を取得したいです。
発生している問題
VARIANT型をレイアウトした構造体を引数としていますが、メソッドの呼び出し前後で出力引数が変化していません。
該当のソースコード
C++のメソッドの定義
1bool FooClass::GetField( 2 _bstr_t foo, 3 _bstr_t bar, 4 _bstr_t baz, 5 short foobar, 6 VARIANT *pvarData 7)
C++のVARIANT型の定義
1typedef /* [wire_marshal] */ struct tagVARIANT VARIANT; 2 3struct tagVARIANT 4 { 5 union 6 { 7 struct __tagVARIANT 8 { 9 VARTYPE vt; 10 WORD wReserved1; 11 WORD wReserved2; 12 WORD wReserved3; 13 union 14 { 15 LONGLONG llVal; 16 LONG lVal; 17 BYTE bVal; 18 SHORT iVal; 19 FLOAT fltVal; 20 DOUBLE dblVal; 21 VARIANT_BOOL boolVal; 22 _VARIANT_BOOL bool; 23 SCODE scode; 24 CY cyVal; 25 DATE date; 26 BSTR bstrVal; 27 IUnknown *punkVal; 28 IDispatch *pdispVal; 29 SAFEARRAY *parray; 30 BYTE *pbVal; 31 SHORT *piVal; 32 LONG *plVal; 33 LONGLONG *pllVal; 34 FLOAT *pfltVal; 35 DOUBLE *pdblVal; 36 VARIANT_BOOL *pboolVal; 37 _VARIANT_BOOL *pbool; 38 SCODE *pscode; 39 CY *pcyVal; 40 DATE *pdate; 41 BSTR *pbstrVal; 42 IUnknown **ppunkVal; 43 IDispatch **ppdispVal; 44 SAFEARRAY **pparray; 45 VARIANT *pvarVal; 46 PVOID byref; 47 CHAR cVal; 48 USHORT uiVal; 49 ULONG ulVal; 50 ULONGLONG ullVal; 51 INT intVal; 52 UINT uintVal; 53 DECIMAL *pdecVal; 54 CHAR *pcVal; 55 USHORT *puiVal; 56 ULONG *pulVal; 57 ULONGLONG *pullVal; 58 INT *pintVal; 59 UINT *puintVal; 60 struct __tagBRECORD 61 { 62 PVOID pvRecord; 63 IRecordInfo *pRecInfo; 64 } __VARIANT_NAME_4; 65 } __VARIANT_NAME_3; 66 } __VARIANT_NAME_2; 67 DECIMAL decVal; 68 } __VARIANT_NAME_1; 69 } ;
C++のメソッドの抜粋
1if ( ( pvarData->vt & VT_BSTR ) && ( pvarData->vt & VT_BYREF ) ) { 2 *(pvarData->pbstrVal) = Copy(); 3} 4 5※VT_BSTR=8、VT_BYREF=16384
C#、VisualStudioでカーソルを当てたときに表示されるポップアップから飛んだC++のメソッドの定義
1bool GetField([In][MarshalAs(UnmanagedType.BStr)] string Foo, 2 [In][MarshalAs(UnmanagedType.BStr)] string Bar = "", 3 [In][MarshalAs(UnmanagedType.BStr)] string Baz = "", 4 [In] int FooBar = 0, 5 [In][Out][MarshalAs(UnmanagedType.Struct)] ref object pData);
C#、現在のコードの抜粋
1var data = new VARIANT { vt = (ushort)(VarEnum.VT_BSTR | VarEnum.VT_BYREF) }; 2var pData = Marshal.AllocCoTaskMem(Marshal.SizeOf(data)); 3Marshal.StructureToPtr(data, pData, true); 4var result = foo.GetField(foo, bar, baz, 0, pData); 5 6 [StructLayout(LayoutKind.Sequential, Pack = 8)] 7 private struct VARIANT 8 { 9 public ushort vt; 10 public IntPtr pVal; 11 }
調べたこと
メソッドの呼び出し前後の構造体を確認しました。
初期化後:pVal=0x00000000、vt=16392
メソッドの呼び出し後:pVal=0x00000000、vt=16392
pDataにも適当な値が設定されています(例えば、0x0b1fd248)。
補足
VisualStudio2022、.NET8.0、C#12.0を使用しています。
何か気づいたことがあれば、ご教授いただけると助かります。
よろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー