質問編集履歴

7

言い回しの修正

2024/09/12 11:13

投稿

OhaseO
OhaseO

スコア3

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
- ```現在のC#コードの抜粋
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

言い回しの修正

2024/09/12 09:39

投稿

OhaseO
OhaseO

スコア3

test CHANGED
@@ -1 +1 @@
1
- C# C++dllメソッド呼出(COMコンポーネント) VARIANT型出力引数の取得
1
+ C# C++DLLメソッド呼出(COMコンポーネント) VARIANT型出力引数の取得
test CHANGED
@@ -1,10 +1,10 @@
1
1
  ### 実現したいこと
2
2
  あるアプリケーションをVB6ベースからC#ベースへ移行しています。
3
- その中で、COMコンポーネントとして登録したC++ベースのdllのメソッドを呼び出していすが、そのメソッドのVARIANT型の出力引数を取得したいです。
3
+ その中で、COMコンポーネントとして登録したC++ベースのDLLのメソッドを呼び出しているのですが、そのメソッドのVARIANT型の出力引数を取得したいです。
4
4
 
5
5
  ### 発生している問題・分からないこと
6
6
  VARIANT型の出力引数を取得できていません。
7
- 新たに定義した構造体を引数として与えていますが、出力が格納されることを期待しているプロパティがメソッドの呼び出し前後で変化していません。
7
+ VARIANT型を模倣した構造体を引数として与えていますが、出力として代入されることを期待しているプロパティがメソッドの呼び出し前後で変化していません。
8
8
 
9
9
  ### 該当のソースコード
10
10
 

5

pData1にも逐次適当な値が設定されています(例えば、0x0b1fd248)。

2024/09/10 11:18

投稿

OhaseO
OhaseO

スコア3

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

言い回し修正

2024/09/10 08:16

投稿

OhaseO
OhaseO

スコア3

test CHANGED
File without changes
test CHANGED
@@ -126,14 +126,15 @@
126
126
 
127
127
  ### 試したこと・調べたこと
128
128
  ①当該メソッドを通っているかを確認しました。
129
- 別の引数によりswitch文のルートが決まります(C++メソッドの抜粋を参照)。期待している値の場合は戻り値としてtrue、期待していない値の場合は戻り値としてfalseが返るようになっており、true/falseが切り替わることは確認済みです。現在のC#コードの場合は、case 5を通ることも問題ありません。
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++内の状態を確認するための仕込みをし再コンパイルしようと思いましたが、optional parameters must come after required parameters等、多くのエラーが発生している状態です。
137
+ C++内の状態を確認するための仕込みをし再コンパイルしようと思いましたが、optional parameters must come after required parameters等、多くのエラーが発生している状態です。
137
- そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには誤りがないのか、何か勘違いをしていないか等を知り、原因を絞りたい次第です。
138
+ そもそも、代入する値(bstrData(C++メソッドの抜粋を参照))が正しく設定されていない可能性も否めないですが、現在のC#コードには問題はないのか、何か勘違いをしていないか等を知り、原因を絞りたい次第です。
138
139
  何か気づいたことがあれば、ご教授いただけると助かります。些細なことでも構いません。
139
140
  よろしくお願いいたします。

3

VARIANT型の追記

2024/09/10 08:10

投稿

OhaseO
OhaseO

スコア3

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

冗長箇所の削除

2024/09/10 08:03

投稿

OhaseO
OhaseO

スコア3

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

開発環境の追記

2024/09/10 08:01

投稿

OhaseO
OhaseO

スコア3

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
  何か気づいたことがあれば、ご教授いただけると助かります。些細なことでも構いません。