■75357 |
Re[8]: VB.netからVC++6.0のへの構造体配列参照渡し |
□投稿者/ とら -(2015/03/18(Wed) 16:21:20)
| ■No75355 (774RR さん) に返信 > えっと、提示 C コードは全面的にどうにもならない感じなんだけどどこまで解説がいるのかな? > ということで、現在のコードはまるっきり意味が無い感じ。
紛らわしくて誠に申し訳御座いません、提示したソースはあくまで「改修【イメージ】」のつもりでした。 前述した通り、当方にはVC++に関する知識が殆ど御座いませんので、VC++のお勉強をして下さいというご指摘でしたら 大変申し上げ難いのですが、今回はあまり時間的な余裕が御座いませんのでまた別の機会にしたく考えております。
> VB (というかマネージ側) でどういう marshal をしたいのかが(少なくとも俺には)わからないのでまずはそこから。 > 仕様を先に決めて、実装はそれに合致するようにするもんだ。
これまでのやり取りには目を通されてますか?過去のやりとりを見てそれでも解らない、または情報がばらばらで読み難い ということであれば再度まとめ直させて頂きます。 それとも毎回きっちりまとめ直した方が宜しいのですか?こちらの掲示板はそういった方針なのでしょうか。 如何せんこのような掲示板にて質問するのは初なもので、色々と不慣れでご迷惑をお掛けしてしまい誠に申し訳御座いません。
> C/C++ 使ったこと無いんだよね・・・ > とりあえず http://www.pinvoke.net の何か適当な Win32API の関数でわかるものある? > http://www.pinvoke.net/default.aspx/hid.HidD_GetAttributes > とか読める?
何を以て読めるという判断になるか解りませんが、構造体の宣言を行っている例なのかなと 当方では認識しましたが如何でしょうか。
■No75356 (魔界の仮面弁士 さん) に返信 > C++ 側の実装に自信が無いのなら、元の DLL はそのままにしておいて、 > その DLL を呼ぶための中継役として、VB6 で ActiveX DLL を作っておき、 > それを VB2008 側で参照設定するという逃げ方とか。(泣)
当方の知識的にはその方法が一番良いのですが、VB6.0を残すのはだめだそうです。
>>TEST_API int __stdcall FuncTest(LPSAFEARRAY *Type1, int AryUBound) > セーフ配列の受け渡しでトラブっているですから、 > LPSAFEARRAY 型のままにしておいたら意味が無いですよ。
>>VC++にて構造体配列の先頭データ1つと配列の要素数を受け取るように変更する。 > TEST_API int __stdcall Test1(T_Struct*type1, int length)
なるほど、配列の先頭だけというのは要素数1の配列を受け取らせるのではなく、 1つの構造体として受け取らせるという事なのですね。
VB側は配列の先頭である「構造体配列(0)」と「構造体配列の要素数」を渡し、 VC++側は「構造体」と「構造体配列の要素数」を受け取ってから、構造体配列を作成して 作成した構造体配列の先頭のポインタ?に対して受け取った構造体のポインタ?を設定する 感じになるのですかね……。 イメージは解るのですが手法がさっぱり……、まぁイメージが間違ってる可能性も多々ありますが。
なお、VC++側が構造体配列を受け取った後に次の関数へ渡していたのですが、その受け先はvoid型となっていました。 TestSub_API int __stdcall FuncTestSub (void *Type1);
VC++側において、今のところも書き方が良く解っておらず難航しております。 解決に向けたアドバイスが頂ければとても助かります。
|
|