C++のdllをVBで動かす方法について

タグの編集
投稿者 神鼎麟  (学生) 投稿日時 2011/5/19 20:26:11
現在VC++から変数の値をVBに渡してVBで処理するプログラムを作成しています。
VC++でのdll作成、読み込み
VBでのdll作成、読み込みはできるようになりました。
しかし以下のサイト
http://www.nextftp.com/swlabo/m5_cpp/hp_dll/dll_00.htm
を参考にVC++でdllファイルを作成しても
VBではどうしても参照してくれません。参照しようとすると
ファイルアクセスが可能で、有効なアセンブリまたはCOMコンポートであることを確認して下さい
と出ます。
VC++は数値計算をかじった程度の知識しかないので、これ以上はお手上げです。
何がどういけないのか教えてください。

使用しているのはVB2010とVC++2008です。

VC++とVB両方の問題なので、VCスレでも質問しています。
解決次第、解決報告を各スレでします。
投稿者 るきお(管理者)  (社会人) 投稿日時 2011/5/19 20:38:26
こんにちは。
VCスレでも質問されているとのことですので、そのマルチポスト先で神鼎麟さんの投稿が見られるURLを教えてください。
投稿者 神鼎麟  (学生) 投稿日時 2011/5/19 20:42:47
るきおさんこんにちは。
http://hibari.2ch.net/test/read.cgi/tech/1291571263/601-700
です。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/19 20:43:21
> 有効なアセンブリまたはCOMコンポート
「COMコンポート」→「COM コンポーネント」かな?


> 何がどういけないのか教えてください。

「参照設定」で使うためには、その DLL が
 ・.NET のマネージ DLL (.NET アセンブリ)
 ・ActiveX DLL (COM コンポーネント)
のいずれかでなければなりません。
前者は、C++/CLI (もしくは Managed C++)で作成する事になります。

また、上記 2 つのいずれかであったとしても、VB でサポートされていない型や関数定義が
含まれていた場合、参照設定はできません。


> VBではどうしても参照してくれません。
C++ のネイティブDLLは参照設定できません。

関数を外部公開しただけの DLL は、VB からは「参照設定」して使うのではなく、
「Declare ステートメント」もしくは DllImportAttribute 属性で読み込ませることになります。


> しかし以下のサイト
> http://www.nextftp.com/swlabo/m5_cpp/hp_dll/dll_00.htm
その URL の最後の方にある『●VBから参照』の内容を確認してみてください。
その記事で説明されているのは、VB 側に Declare 宣言を要求するタイプの DLL の作成手順です。
投稿者 神鼎麟  (学生) 投稿日時 2011/5/19 21:11:03
いろいろ勘違いしていました…。
しかし
Declare Function TestDll Lib "dllまでのフルパス" (ByVal a As Double, ByVal b As Double)
で宣言し、
MsgBox(TestDll(10.0, 10.0))
として実行するとちょうどここでエラーが出て、
MarshalDirectiveExceptionはハンドルされませんでした。
PInvoke 制約: 変数を返すことはできません。
と出てきます。
dllの中身は
#include <stdexcept>
#include <stdio.h>

using namespace std;

__declspec(dllexport) double __stdcall TestDll(double a, double b){
return (a+b);
}
と、なっています。
どこがおかしいのでしょうか?
投稿者 神鼎麟  (学生) 投稿日時 2011/5/19 21:14:40
すみません、関数宣言のあとに As Doubleを付け忘れていました。
魔界の仮面弁士さん答えてくださってありがとうございます。
本当にお騒がせしました…。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/5/20 11:12:25
おぉ、解決したようで何よりです。
私は C++ 系は専門外なのですが(C なら書けるのですけれども)、
ためになるサイトを紹介してもらえて、勉強になりました。


> 解決次第、解決報告を各スレでします。 
今回はこちらの掲示板で解決したようですが、もしもマルチポスト先の情報を
持ち寄ることで解決した場合には、それらの情報をとりまとめた上で、
情報共有していただけるようお願いいたします。

また、報告する際には、「解決したことを報告する」のではなく、
「何が原因で、どのようにすることで解決したのかを報告する」ようにしてくださいね。
(それぞれの投稿先にローカルルールがある場合には、それに従って投稿する必要があります)


この掲示板の利用ルールより引用:
》 ※複数サイトで同じ質問をする場合(=マルチポスト)は他の質問先のURLを明記し、
》   解決時には具体的な解決方法とともに報告をしてください


管理人さんの以前の投稿より引用:
》 マルチポストの際はマルチポスト先を明記してください。
》 また、どこかで解決した場合は、忘れずにこの掲示板にも解決方法を具体的に書いてください。