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

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

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

Re[8]: DLLからの構造体の受け渡し


(過去ログ 18 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■6929 / inTopicNo.1)  DLLからの構造体の受け渡し
  
□投稿者/ しぐち (1回)-(2007/08/27(Mon) 15:46:37)

分類:[VB.NET/VB2005] 

いつもお世話になります。
Win2000、VB.NET2005です。

C++で作成されたDLLがあるのですが、VB.NETからの呼び出し方がわからず困っています。

[DLLのヘッダ]

typedef struct pdata {
int cnt;
CStringArray ca;
CStringArray cb;
} pdat,*prdat;

prdat WINAPI GetData();

[VB.NET]

Private Structure pData
Dim cnt As Integer
Dim a() As String
Dim b() As String
End Structure

Private Declare Function GetData Lib "hoge.dll" () As pData

……

Dim aAA As pData
aAA = GetData()

上のVBを実行すると「メソッドの型署名は PInvoke と互換していません。」のエラーになります。
CStringArrayをVBでどう置き換えるかがわかっていないのだと思いますが、よろしくお願いします。

引用返信 編集キー/
■6930 / inTopicNo.2)  Re[1]: DLLからの構造体の受け渡し
□投稿者/ Blue (336回)-(2007/08/27(Mon) 15:49:16)
MFCのクラスを梱包している構造体はおそらくVB側で受け取ることは不可能でしょう。
C++のDLLが変更不可能であるならば、C++/CLIでデータを変換できるDLLを作るぐらいでしょうか。
引用返信 編集キー/
■6932 / inTopicNo.3)  Re[2]: DLLからの構造体の受け渡し
□投稿者/ Blue (337回)-(2007/08/27(Mon) 16:13:18)
訂正

>C++のDLLが変更不可能であるならば、C++/CLIでデータを変換できるDLLを作るぐらいでしょうか。
はDLLのMFCのバージョンにもよりそう。
スタティックリンクしていて、VS2005よりも前のバージョンだとC++/CLIは使えないでしょうね。

ということで、そういう場合はVBでも扱える型たとえばSAFEARRAY等で記述したラッパーDLLを
作るんでしょうね。
引用返信 編集キー/
■6935 / inTopicNo.4)  Re[3]: DLLからの構造体の受け渡し
□投稿者/ 渋木宏明(ひどり) (317回)-(2007/08/27(Mon) 17:27:24)
渋木宏明(ひどり) さんの Web サイト
> > ということで、そういう場合はVBでも扱える型たとえばSAFEARRAY等で記述したラッパーDLLを
> 作るんでしょうね。

ラッパ作るにしても

・渡す側と渡される側で CString の実装がまったく同じでないとまずい
・DLL 境界を跨いでるから C/C++ ランタイムが使うヒープが別になるわけで、メモリ管理の破綻が怖くて渡された側ではうかつに CString のメソッド呼べない

です。

この辺の帳尻をあわす努力をするくらいなら、DLL 関数のインターフェースを変更した方が簡単かと。

引用返信 編集キー/
■6937 / inTopicNo.5)  Re[3]: DLLからの構造体の受け渡し
□投稿者/ しぐち (3回)-(2007/08/27(Mon) 17:43:58)
No6932 (Blue さん) に返信

ありがとうございます。
やはりできませんか。
C++ DLLの変更を申し入れようと思いますが、構造体にせずに、 CStringArrayをそれぞれ別のパラメータにすれば可能でしょうか。

Private Declare Function GetData Lib "hoge.dll" _
(ByVal cnt as Integer, _
ByVal a() as String, _
ByVal b() as String) As UInteger

UINT WINAPI GetData(
int cnt,
CStringArray a,
CStringArray b,
);



引用返信 編集キー/
■6939 / inTopicNo.6)  Re[4]: DLLからの構造体の受け渡し
□投稿者/ 囚人 (148回)-(2007/08/27(Mon) 17:45:22)
いえ、独自の構造体がダメなのではなくて、CStringArray が問題。
引用返信 編集キー/
■6940 / inTopicNo.7)  Re[5]: DLLからの構造体の受け渡し
□投稿者/ Blue (338回)-(2007/08/27(Mon) 17:51:46)
2007/08/27(Mon) 17:52:19 編集(投稿者)

CStringArrayというのはC++でのクラスであるし、.NET FrameworkのSystem.Stringと
なんら関連を持ちません。

また、CStringArrayを知っているのはMFCのDLLであって、VBからはそれを直接見ることが
出来ないので、インタフェースとして扱うことは出来ないのです。
(MFCのバージョンが違えば同じC++でも使えないし。(渋木宏明(ひどり) さんがおっしゃっていますね))

>C++ DLLの変更を申し入れようと思いますが
多分DLLを作っているほうも、そこらへんの知識が欠如しているように思われます。
(普通は、Exportしている関数のインタフェースでCStringとかつかわんだろと。)
引用返信 編集キー/
■6943 / inTopicNo.8)  Re[6]: DLLからの構造体の受け渡し
□投稿者/ しぐち (4回)-(2007/08/27(Mon) 18:24:27)
No6940 (Blue さん) に返信
皆さん、ありがとうございました。
CStringArryやCStringを使わない確実な方法をDLLの担当者と相談してみます。
解決済み
引用返信 編集キー/
■6958 / inTopicNo.9)  Re[7]: DLLからの構造体の受け渡し
□投稿者/ 渋木宏明(ひどり) (319回)-(2007/08/27(Mon) 23:14:33)
渋木宏明(ひどり) さんの Web サイト
内部で CString を使用しているなら、DLL を跨ぐデータ交換には BSTR がおすすめです。

CString.AllocSysString(), CString.FreeSysString() などの BSTR サポートを利用することが出来ます。

.NET のプラットフォーム相互運用層も当然、BSTR をサポートしています。


引用返信 編集キー/
■7044 / inTopicNo.10)  Re[8]: DLLからの構造体の受け渡し
□投稿者/ しぐち (5回)-(2007/08/29(Wed) 13:07:27)
No6958 (渋木宏明(ひどり) さん) に返信
渋木宏明(ひどり) さん、ありがとうございます。
新しい仕様が決まったら返信しようかと思っていたのですが、DLL担当が多忙で少し時間がかかりそうです。
とりあえず、これで打ち止めにさせてください。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -