- - PR -
DLL内の関数の戻り値を構造体で受け取るには…。
1|2|3|4
次のページへ»
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-16 18:14
お世話になっております。
優希です。 開発環境は、Visual Studio .NET 2002(VC++)、 Windowsフォームを使って行います。 本体のソースは、マネージコードで記述しています。 今回は、VC++5.0で作成したDLLとの データ通信を行なっております。 呼び出したDLL内の関数の戻り値を構造体で受け取りたいのですが、
と、コンパイルエラーになってしまいます。 逆に、 呼び出すDLL内の関数の引数に構造体を設定すると、 きちんと設定することができます。 呼び出したDLL内の関数の戻り値を構造体で受け取るには、 どのようにしたら良いのでしょうか? 以下がサンプルコードです。 まずは、DLL内(Sample.dll)の関数、 および戻り値となる構造体を記述しています。
次に、呼び出す側のサンプルコードです。
お気づきの点がありましたら、 宜しくお願い致します。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-17 08:56
コンパイルエラーになったところのヘルプを見ると、
以下のようになっています。
やはり、構造体では無理なんでしょうか? | ||||||||||||||||||||||||
|
投稿日時: 2004-02-17 21:25
meiです。
エラーメッセージからすると無理そうですね。 ただ、例え可能であっても、C++でDllImportを使うのはちょっと・・・と思います。 なぜなら、DllImportは遅いです。 例えば、DllImport経由で呼び出す関数に参照型(String等)を含んでいる場合は、 CILで31命令+マーシャリングコストがかかります。 ちなみに値型の場合は、8命令だそうです。 で、C++ネイティブ呼び出しはDllImportより速いはずなので、 少なく見積もっても5倍以上遅い方法を選択していることになります。 折角C++で最速な呼び出しが出来るのに勿体ないです。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-17 22:03
こんばんわ。
優希です。
そうだったんですか。 アドバイス、ありがとうございます。 どおりで遅いはずでした。。。 分からず使っていた自分が情けない(−−;) で、この間、meiさんがおっしゃっていた
っていうやつですね? xxxx.libを参照(?)ってことは、 このLIBファイルが必要になるんですね? | ||||||||||||||||||||||||
|
投稿日時: 2004-02-17 22:43
meiです。
はい、そうです。 ライブラリパスが通っているところに置いてください。 LoadLibraryでDLL読み込むことも出来ますが、 LIBファイルがあるのなら、そっちの方が楽なので。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-17 23:48
こんばんわ。
・・・ってことは、DLLは使わないのですか? 一応、「DLLを使って」の作りになるので、 それはマズイかも。。。 LoadLibrary()関数を使う場合は、 LIBを参照する記述は、要らなくなるのでしょうね???(^^;) | ||||||||||||||||||||||||
|
投稿日時: 2004-02-18 00:08
いえいえ、実行時にDLLは使いますよ。 ビルド時にLIBを使って参照解決するか、 LoadLibraryで動的に関数ポインタ引っ張ってくるかという話です。 普通は何も考えずにLIBでリンクしてください。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-18 09:05
おはようございます。
あ、そうなんですか。(^^;) LIBもDLLも必要ってことですね。 【参照】ってことは、 こんな感じ↓で宜しいのでしょうか? ------------------------------------------------ ライブラリ(xxx.lib)とインクルードファイル(xxx.h)を それぞれ"Lib"、"include"フォルダに格納する。 VC++のメニュー[ツール]→[オプション]の [プロジェクト]-[VC++ ディレクトリ]の 「ディレクトリを表示するプロジェクト:ライブラリ」で、 先ほどの「Lib」フォルダを追加。 同様に、「include」も追加する。 ------------------------------------------------ もうちょっと詳しく調べてみます。 ありがとうございます。 |
1|2|3|4
次のページへ»