• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vc++expreeで作ったdllをvbaで使用)

VBAでVC++ Expressで作成したDLLを使用する方法

このQ&Aのポイント
  • VBAでVC++ Expressで作成したDLLを使用する方法について解説します。
  • VC++2008 Expressを使用して作成したDLLをVBAで使用する際に発生する実行時エラーについて解決方法を教えます。
  • DLLの呼び出し方法やAliasの設定に注意することで実行エラーを回避できます。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.4

C++側は、akinomyogaさんの > __declspec(dllexport) の前に static が抜けているだけでは? で。 VBA側 Private Declare PtrSafe Function Add Lib "MathFuncsDll.dll" _ Alias "?Add@MyMathFuncs@MathFuncs@@SANNN@Z" _ (ByVal int1 As Double, ByVal int2 As Double) As Double Sub hoge() Dim a As Double ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path a = Add(5, 2) MsgBox a End Sub 修飾名は dumpbin /exports で確認。

rebinson3
質問者

お礼

返事が遅くなりすみません、ご回答ありがとうございます。 C++側でstaticをつけて、vba側はdllをフルパス指定すると 正しくうごきました。 No3さんの方も試してみたいと思います。 ちなみにhttp://www2.odn.ne.jp/sailing/exceldll.htmでも 動きました。 ありがとうございました。

その他の回答 (3)

回答No.3

__declspec(dllexport) の前に static が抜けているだけでは? (あと、static を追加すると Alias で指定している C++ 名前修飾も変わります。) しかし、(色々と事情はあるのかも知れませんが) そもそもの問題として、クラスの静的メンバ関数として関数を公開する意味はあるのでしょうか。C++ から使う為の DLL の場合にはそれも意味があると思いますが、VBA などから利用するのであれば C++ のクラスの中で定義する意味はありません。namespace や class の中ではなくて、単にグローバルに関数を書き連ねた方が分かりやすいと思います。 もし DLL を C++ と VBA の両方から使いたいのだとしても、VBA の為にグローバルに extern "C" __declspec(dllexport) double __stdcall Add(double a, double b) { return MathFuncs::MyMathFuncs::Add(a,b); } という感じに中継する関数を定義した方が、わざわざ depends などでシンボルを調べて Alias に指定しなくても良いし、管理も楽な気がします。 # 所で、インスタンスメンバ関数に __stdcall をつけるとどうなるのかと思って調べてみたら、第一引数に this ポインタを受け取って、第二引数以降に元々の引数を受け取るというのを __stdcall 呼出既約で行う様になるのですね。

rebinson3
質問者

お礼

返事が遅くなりすみません、ご回答ありがとうございます。 C++側でstaticをつけて、vba側はdllをフルパス指定すると 正しくうごきました。 No3さんの方も試してみたいと思います。 ちなみにhttp://www2.odn.ne.jp/sailing/exceldll.htmでも 動きました。 ありがとうございました。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

このdllコンパイルできるの? C++クラスをextern "C"できるとは思えないんですけど。 namespaceにも入っているし・・・ extern "C"ってCの関数として(Cの名前規約で)公開するっていうことだから Cで書けないインタフェースを使っちゃだめでしょ。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

VBAからの呼び出し方はわかりませんが、double MyMathFuncs::Add(double a, double b)と他の3つのメソッドはインスタンスメソッドとして定義されていますから、インスタンスなしでは呼び出せないです。

関連するQ&A