C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 127 を表示中)
■75394 / )  Re[10]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ 魔界の仮面弁士 (254回)-(2015/03/19(Thu) 20:05:29)
No75392 (とら さん) に返信
> 一括表示で2ページ目になっていたため気付くのが遅れました、すみません!
> こちらでも同じようにやってみたのですが、タイプライブラリの生成に失敗しましたといったエラーが発生してしまいました。

型公開は必要ですが、タイプライブラリを明示的に作る必要は無さそうです。

もし、ComVisible を True にしても駄目なようならば、VS を管理者起動してみてください。
レジストリ登録のためには管理者権限が必要なので。


>> LPSAFEARRAY psa = *Type1;
> 今回成功したパターンは、VC++で受け取った後にLPSAFEARRAY型に代入しているという事は
いえ、説明文では C++ 側の関数定義を書いていなかったので、
それが分かるにしただけです。引数自体は LPSAFEARRAY *Type1 のままですね。


>> <ComVisible(True), Guid("8D60602D-452A-48A1-ACEF-AF148A6E41B8")> _
> GUIDの部分が少々理解が追い付きませんでしたが、
GUID は、『ネットワーク上で必ず一意であることが保障される128ビットの数値』です。

ここでは、「クラス」「インターフェイス」「タイプライブラリ」などといった
それぞれの COM オブジェクトに付けられた 128bit の識別番号だと思ってください。


たとえば、ActiveX Data Object のタイプライブリには 00000205-0000-0010-8000-00AA006D2EA4 という
GUID 値(LIBID) が割り当てられていますし、Excel の Application オブジェクトであれば、
00024500-0000-0000-C000-000000000046 という GUID値(CLSID)が割り当てられているといった具合に。


今回は、自作したデータ型なので、既存のGUID値ではなく、新規に用意した GUID 値を割り当てることになります。
もし、構造体が複数あるのなら、それぞれに違う GUID を用意してください。Assmbly 側も然り。



>> Guid.NewGuid().ToString("D")等で生成した値を指定
> とありましたが、この値はこの関数を実行するたびに変化するのでしょうか
はい。生成するたびに変わります。そして、同じ値は二度と生成されません。
「重複しないランダムな値」を生成するものだと思ってください。


> >(2) 構造体側にも、また別の GUID を割り当てておきます。
> とありましたが、AssemblyInfo.vbに設定するGUIDと構造体に設定するGUIDは違うものにしておくのですか?
重複する GUID 値を指定してはいけません。
すべて別の値を使用する必要があります。

複数の箇所で同じ GUID 値を使うことがあるとすれば、たとえば
A.DLL と B.DLL と C.EXE が「同じ構造体」を再定義する場合などです。

もっとも、そういう場合は、共有用のタイプライブラリを用意して、
それを各プロジェクトで参照設定した方が分かりやすいですけれどね。
返信 編集キー/


管理者用

- Child Tree -