■91268 |
Re[5]: VB.NETからC++のdll関数への参照渡しについて |
□投稿者/ まる -(2019/06/09(Sun) 23:38:16)
| 2019/06/09(Sun) 23:38:54 編集(投稿者) 2019/06/09(Sun) 23:38:46 編集(投稿者)
返信が遅れてしまい申し訳ございません。投稿者(まる)です。
■No91224 (とっちゃん さん) に返信 > VB6のCOM呼び出しは、当時のVB自身の仕組みの効果もあり信じられないくらい > それで行けるのか?という項目があるので、ちょっと怪しい独自COMの場合 > 移植不可能というのがあります。 とっちゃんさん、ご回答いただきありがとうございます。 そうだったのですね。VB6ではなぜ可能だったのにvb.netでは駄目になったのか、少し納得できたような気がします。
■No91223 (魔界の仮面弁士 さん) に返信 >intPinned をどうやって DLL に渡すのかが読み取れなかったのですが、 すみません。まだGCHandleに対して勉強不足な部分があり、 GCHandle.Alloc(shtArray(0),GCHandleType.Pinned) でshtArray(0)を固定したら、intPinnedをAAAに渡さずshtArray(0)を渡しても、固定されたまま渡せるのかな?と 浅い知識で書いてしまいました。仮面弁士さんに書いて頂いたわかりやすいソースコードのおかげで、 アドレス固定の方法について、より理解することができました。ご丁寧に説明して頂き、ありがとうございます。 ただ、 GCHandle.Alloc(shtArray,GCHandleType.Pinned) と書いた上で再度挑んでみましたが、エラーを解消することはできませんでした。
あの後、vb.net側が駄目ならC++のソースコードを少し変えてみよう、と自分なりに視点を変えて挑み、 以下のURLを参考にC++の内容を変えてみたところ、とりあえずはエラーなく上手くいくようになりました。 ・https://limbioliong.wordpress.com/2011/06/08/passing-a-managed-array-to-a-c-activex-via-a-pointer/ ・https://social.msdn.microsoft.com/Forums/ja-JP/254aadda-5558-4076-b598-95aebc208f43/65315652831236312425653276531565336124081250912452125311247912?forum=csharpgeneralja
(c++ .odlファイル) [id(xx)] AAA(SHORT *add,SHORT size) ↓ [id(xx)] AAA([in, out] SAFEARRAY(Short)*varData,Short data)
(c++ .hpp) Long AAA(Short Far* sAdd,Short sSize) ↓ Long AAA(VARIANT &varData,Short sSize)
(C++ .cppファイル) ※ディスマッチマップの部分 DISP_FUNCTION_ID(xxx, "AAA", AAA, VT_I4, VTS_PI2, VTS_I2) ↓ DISP_FUNCTION_ID(xxx, "AAA", AAA, VT_I4, VTS_VARANT, VTS_I2)
※AAA関数処理の部分 LONG AAA(VARIANT &varData, sSize) { Short bufSize = sSize * 2; Char *buf; Char *strValue; SAFEARRAY *pSA = NULL; SAFEARRAYBOUND bd; Short HUGEP *p;
bd.lLbound = 0; bd.cElements = 12; pSA = SafeArrayCreate(VT_I2, 1, &bd); SafeArrayAccessData(pSA, (void HUGEP **)&p); buf = (Char *)p;
memset(buf,0,bufSize);
(省略)※strValueに値を格納;
memcpy(buf,strValue,bufSize);
pSA->pvData = (LPVOID)p; SafeArrayUnaccessData(pSA); *pVarData.pparray = pSA;
return bufSize; }
(VB.Net) sub Sample() Dim shtArray(999) As Short Dim objTest As New TestClass Dim intReturn As Integer Dim intSize As Integer = 368
(省略) ※省略した中でshtArrayの全ての要素に0を設定しています。
intReturn = objTest.AAA(shtArray,intSize) '※visualstudioでAAAにカーソルをあてて引数の型を確認したところ、 ' AAA(Byref sBuf As System.Array,ByVal sSize As Short) As Integer ' となっておりました。
Msgbox(intReturn) end sub
しかし、この件についてメンバーに相談したところ、結局、ActiveXは古いので、この機会にC++をvb.netにするところからはじめよう、ということになり、 この件は保留となってしまいました。 ですが、個人的には今回の件の中で、皆さまのおかげで色々な知見を得られ、成長することができたので、エラー解決に挑んだことは無駄ではなかったと感じております。 ご回答頂いた仮面弁士さん、とっちゃんさん、目を通していただいた方々、本当にありがとうございました。 またの機会がございましたら、どうぞよろしくお願いいたします。 |
|