質問編集履歴
7
言い回しの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,11 +4,11 @@
|
|
4
4
|
|
5
5
|
### 発生している問題・分からないこと
|
6
6
|
VARIANT型の出力引数を取得できていません。
|
7
|
-
VARIANT型を模倣した構造体を引数として与えていますが、出力
|
7
|
+
VARIANT型を模倣した構造体を引数として与えていますが、出力が代入されることを期待しているプロパティがメソッドの呼び出し前後で変化していません。
|
8
8
|
|
9
9
|
### 該当のソースコード
|
10
10
|
|
11
|
-
```C++メソッドの定義
|
11
|
+
```C++ベースのメソッドの定義
|
12
12
|
bool SDBServiceClass::GetField(
|
13
13
|
_bstr_t bstrKey, // In : key
|
14
14
|
_bstr_t bstrDestinationNetworkName, // In : 要求先ネットワーク名
|
@@ -18,7 +18,7 @@
|
|
18
18
|
)
|
19
19
|
```
|
20
20
|
|
21
|
-
```VARIANT型の定義
|
21
|
+
```C++ベースのVARIANT型の定義
|
22
22
|
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
|
23
23
|
|
24
24
|
struct tagVARIANT
|
@@ -90,7 +90,7 @@
|
|
90
90
|
} ;
|
91
91
|
```
|
92
92
|
|
93
|
-
```C++メソッドの抜粋
|
93
|
+
```C++ベースのメソッドの抜粋
|
94
94
|
case 5: // char型 //
|
95
95
|
// ----------- ■ 文字列(char)型の場合
|
96
96
|
if ( ( pvarData->vt & VT_BSTR ) &&
|
@@ -106,11 +106,11 @@
|
|
106
106
|
※VT_BSTR=8、VT_BYREF=16384
|
107
107
|
```
|
108
108
|
|
109
|
-
```VisualStudioでカーソルを当てたときに表示されるポップアップから飛んだメソッドの定義
|
109
|
+
```C#、VisualStudio上でカーソルを当てたときに表示されるポップアップから飛んだC++ベースのDLLのメソッドの定義
|
110
110
|
bool GetField([In][MarshalAs(UnmanagedType.BStr)] string Key, [In][MarshalAs(UnmanagedType.BStr)] string NetworkName = "", [In][MarshalAs(UnmanagedType.BStr)] string FieldName = "", [In] int FieldNo = 0, [In][Out][MarshalAs(UnmanagedType.Struct)] ref object pData);
|
111
111
|
```
|
112
112
|
|
113
|
-
```現在の
|
113
|
+
```C#、現在のコードの抜粋
|
114
114
|
var data1 = new VARIANT { vt = (ushort)(VarEnum.VT_BSTR | VarEnum.VT_BYREF) };
|
115
115
|
var pData1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(data1));
|
116
116
|
Marshal.StructureToPtr(data1, pData1, true);
|
6
言い回しの修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
C# C++
|
1
|
+
C# C++DLLメソッド呼出(COMコンポーネント) VARIANT型出力引数の取得
|
test
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
### 実現したいこと
|
2
2
|
あるアプリケーションをVB6ベースからC#ベースへ移行しています。
|
3
|
-
その中で、COMコンポーネントとして登録したC++ベースの
|
3
|
+
その中で、COMコンポーネントとして登録したC++ベースのDLLのメソッドを呼び出しているのですが、そのメソッドのVARIANT型の出力引数を取得したいです。
|
4
4
|
|
5
5
|
### 発生している問題・分からないこと
|
6
6
|
VARIANT型の出力引数を取得できていません。
|
7
|
-
|
7
|
+
VARIANT型を模倣した構造体を引数として与えていますが、出力として代入されることを期待しているプロパティがメソッドの呼び出し前後で変化していません。
|
8
8
|
|
9
9
|
### 該当のソースコード
|
10
10
|
|
5
pData1にも逐次適当な値が設定されています(例えば、0x0b1fd248)。
test
CHANGED
File without changes
|
test
CHANGED
@@ -111,17 +111,17 @@
|
|
111
111
|
```
|
112
112
|
|
113
113
|
```現在のC#コードの抜粋
|
114
|
+
var data1 = new VARIANT { vt = (ushort)(VarEnum.VT_BSTR | VarEnum.VT_BYREF) };
|
115
|
+
var pData1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(data1));
|
116
|
+
Marshal.StructureToPtr(data1, pData1, true);
|
117
|
+
var result1 = _netMSDBService.GetField(key, networkName, "TAG", 0, pData1);
|
118
|
+
|
114
119
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
115
120
|
private struct VARIANT
|
116
121
|
{
|
117
122
|
public ushort vt;
|
118
123
|
public IntPtr pVal;
|
119
124
|
}
|
120
|
-
|
121
|
-
var data1 = new VARIANT { vt = (ushort)(VarEnum.VT_BSTR | VarEnum.VT_BYREF) };
|
122
|
-
var pData1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(data1));
|
123
|
-
Marshal.StructureToPtr(data1, pData1, true);
|
124
|
-
var result1 = _netMSDBService.GetField(key, networkName, "TAG", 0, pData1);
|
125
125
|
```
|
126
126
|
|
127
127
|
### 試したこと・調べたこと
|
@@ -131,10 +131,11 @@
|
|
131
131
|
②デバッガでメソッドの呼び出し前後の構造体の中身を確認しました。
|
132
132
|
初期化後:pVal=0x00000000、vt=16392
|
133
133
|
メソッドの呼び出し後:pVal=0x00000000、vt=16392
|
134
|
+
pData1にも逐次適当な値が設定されています(例えば、0x0b1fd248)。
|
134
135
|
|
135
136
|
### 補足
|
136
137
|
VisualStudio2022、.Net8.0、C#12.0を使用しています。
|
137
138
|
C++内部の状態を確認するための仕込みをし再コンパイルしようと思いましたが、optional parameters must come after required parameters等、多くのエラーが発生している状態です。
|
138
|
-
そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには問題はないのか、何か勘違いをしていないか等を知り、原因を絞りたい次第です。
|
139
|
+
そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないのですが、現在のC#コードには問題はないのか、何か勘違いをしていないか等を知り、少しでも原因を絞りたい次第です。
|
139
140
|
何か気づいたことがあれば、ご教授いただけると助かります。些細なことでも構いません。
|
140
141
|
よろしくお願いいたします。
|
4
言い回し修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -126,14 +126,15 @@
|
|
126
126
|
|
127
127
|
### 試したこと・調べたこと
|
128
128
|
①当該メソッドを通っているかを確認しました。
|
129
|
-
別の引数によりswitch文のルートが決まります(C++メソッドの抜粋を参照)。期待している値の場合は戻り値としてtrue、期待していない値の場合は戻り値としてfalseが返るようになっており、true/falseが切り替わることは確認済みです。
|
129
|
+
別の引数によりswitch文のルートが決まります(C++メソッドの抜粋を参照)。期待している値の場合は戻り値としてtrue、期待していない値の場合は戻り値としてfalseが返るようになっており、true/falseが切り替わることは確認済みです。
|
130
|
+
現在のC#コードの場合は、case 5を通ることも問題ありません。
|
130
131
|
②デバッガでメソッドの呼び出し前後の構造体の中身を確認しました。
|
131
132
|
初期化後:pVal=0x00000000、vt=16392
|
132
133
|
メソッドの呼び出し後:pVal=0x00000000、vt=16392
|
133
134
|
|
134
135
|
### 補足
|
135
136
|
VisualStudio2022、.Net8.0、C#12.0を使用しています。
|
136
|
-
C++内の状態を確認するための仕込みをし
|
137
|
+
C++内部の状態を確認するための仕込みをし再コンパイルしようと思いましたが、optional parameters must come after required parameters等、多くのエラーが発生している状態です。
|
137
|
-
そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには
|
138
|
+
そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには問題はないのか、何か勘違いをしていないか等を知り、原因を絞りたい次第です。
|
138
139
|
何か気づいたことがあれば、ご教授いただけると助かります。些細なことでも構いません。
|
139
140
|
よろしくお願いいたします。
|
3
VARIANT型の追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
### 発生している問題・分からないこと
|
6
6
|
VARIANT型の出力引数を取得できていません。
|
7
|
-
新たに定義した構造体を引数として与えていますが、出力が格納されると期待しているプロパティがメソッドの呼び出し前後で変化していません。
|
7
|
+
新たに定義した構造体を引数として与えていますが、出力が格納されることを期待しているプロパティがメソッドの呼び出し前後で変化していません。
|
8
8
|
|
9
9
|
### 該当のソースコード
|
10
10
|
|
@@ -16,6 +16,78 @@
|
|
16
16
|
short shFieldNo, // In : フィールド番号
|
17
17
|
VARIANT *pvarData // Out : データ
|
18
18
|
)
|
19
|
+
```
|
20
|
+
|
21
|
+
```VARIANT型の定義
|
22
|
+
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
|
23
|
+
|
24
|
+
struct tagVARIANT
|
25
|
+
{
|
26
|
+
union
|
27
|
+
{
|
28
|
+
struct __tagVARIANT
|
29
|
+
{
|
30
|
+
VARTYPE vt;
|
31
|
+
WORD wReserved1;
|
32
|
+
WORD wReserved2;
|
33
|
+
WORD wReserved3;
|
34
|
+
union
|
35
|
+
{
|
36
|
+
LONGLONG llVal;
|
37
|
+
LONG lVal;
|
38
|
+
BYTE bVal;
|
39
|
+
SHORT iVal;
|
40
|
+
FLOAT fltVal;
|
41
|
+
DOUBLE dblVal;
|
42
|
+
VARIANT_BOOL boolVal;
|
43
|
+
_VARIANT_BOOL bool;
|
44
|
+
SCODE scode;
|
45
|
+
CY cyVal;
|
46
|
+
DATE date;
|
47
|
+
BSTR bstrVal;
|
48
|
+
IUnknown *punkVal;
|
49
|
+
IDispatch *pdispVal;
|
50
|
+
SAFEARRAY *parray;
|
51
|
+
BYTE *pbVal;
|
52
|
+
SHORT *piVal;
|
53
|
+
LONG *plVal;
|
54
|
+
LONGLONG *pllVal;
|
55
|
+
FLOAT *pfltVal;
|
56
|
+
DOUBLE *pdblVal;
|
57
|
+
VARIANT_BOOL *pboolVal;
|
58
|
+
_VARIANT_BOOL *pbool;
|
59
|
+
SCODE *pscode;
|
60
|
+
CY *pcyVal;
|
61
|
+
DATE *pdate;
|
62
|
+
BSTR *pbstrVal;
|
63
|
+
IUnknown **ppunkVal;
|
64
|
+
IDispatch **ppdispVal;
|
65
|
+
SAFEARRAY **pparray;
|
66
|
+
VARIANT *pvarVal;
|
67
|
+
PVOID byref;
|
68
|
+
CHAR cVal;
|
69
|
+
USHORT uiVal;
|
70
|
+
ULONG ulVal;
|
71
|
+
ULONGLONG ullVal;
|
72
|
+
INT intVal;
|
73
|
+
UINT uintVal;
|
74
|
+
DECIMAL *pdecVal;
|
75
|
+
CHAR *pcVal;
|
76
|
+
USHORT *puiVal;
|
77
|
+
ULONG *pulVal;
|
78
|
+
ULONGLONG *pullVal;
|
79
|
+
INT *pintVal;
|
80
|
+
UINT *puintVal;
|
81
|
+
struct __tagBRECORD
|
82
|
+
{
|
83
|
+
PVOID pvRecord;
|
84
|
+
IRecordInfo *pRecInfo;
|
85
|
+
} __VARIANT_NAME_4;
|
86
|
+
} __VARIANT_NAME_3;
|
87
|
+
} __VARIANT_NAME_2;
|
88
|
+
DECIMAL decVal;
|
89
|
+
} __VARIANT_NAME_1;
|
90
|
+
} ;
|
19
91
|
```
|
20
92
|
|
21
93
|
```C++メソッドの抜粋
|
@@ -31,10 +103,10 @@
|
|
31
103
|
m_cscSDBService.Unlock(); // ロック解除(SDBMSデータサービスクラス用)
|
32
104
|
return false; // 異常終了
|
33
105
|
|
34
|
-
※VT_BSTR=8、VT_BYREF=16384
|
106
|
+
※VT_BSTR=8、VT_BYREF=16384
|
35
107
|
```
|
36
108
|
|
37
|
-
```VisualStudioで
|
109
|
+
```VisualStudioでカーソルを当てたときに表示されるポップアップから飛んだメソッドの定義
|
38
110
|
bool GetField([In][MarshalAs(UnmanagedType.BStr)] string Key, [In][MarshalAs(UnmanagedType.BStr)] string NetworkName = "", [In][MarshalAs(UnmanagedType.BStr)] string FieldName = "", [In] int FieldNo = 0, [In][Out][MarshalAs(UnmanagedType.Struct)] ref object pData);
|
39
111
|
```
|
40
112
|
|
@@ -53,12 +125,6 @@
|
|
53
125
|
```
|
54
126
|
|
55
127
|
### 試したこと・調べたこと
|
56
|
-
- [x] teratailやGoogle等で検索した
|
57
|
-
- [x] ソースコードを自分なりに変更した
|
58
|
-
- [x] 知人に聞いた
|
59
|
-
- [ ] その他
|
60
|
-
|
61
|
-
##### 上記の詳細・結果
|
62
128
|
①当該メソッドを通っているかを確認しました。
|
63
129
|
別の引数によりswitch文のルートが決まります(C++メソッドの抜粋を参照)。期待している値の場合は戻り値としてtrue、期待していない値の場合は戻り値としてfalseが返るようになっており、true/falseが切り替わることは確認済みです。現在のC#コードの場合は、case 5を通ることも問題ありません。
|
64
130
|
②デバッガでメソッドの呼び出し前後の構造体の中身を確認しました。
|
2
冗長箇所の削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,12 +5,6 @@
|
|
5
5
|
### 発生している問題・分からないこと
|
6
6
|
VARIANT型の出力引数を取得できていません。
|
7
7
|
新たに定義した構造体を引数として与えていますが、出力が格納されると期待しているプロパティがメソッドの呼び出し前後で変化していません。
|
8
|
-
|
9
|
-
|
10
|
-
### エラーメッセージ
|
11
|
-
```error
|
12
|
-
エラーメッセージは発生していません。
|
13
|
-
```
|
14
8
|
|
15
9
|
### 該当のソースコード
|
16
10
|
|
1
開発環境の追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -72,6 +72,7 @@
|
|
72
72
|
メソッドの呼び出し後:pVal=0x00000000、vt=16392
|
73
73
|
|
74
74
|
### 補足
|
75
|
+
VisualStudio2022、.Net8.0、C#12.0を使用しています。
|
75
76
|
C++内の状態を確認するための仕込みをして再コンパイルしようと思いましたが、optional parameters must come after required parameters等、多くのエラーが発生している状態です。
|
76
77
|
そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには誤りがないのか、何か勘違いをしていないか等を知り、原因を絞りたい次第です。
|
77
78
|
何か気づいたことがあれば、ご教授いただけると助かります。些細なことでも構いません。
|