![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
vc++2008 expressを使用しています。
http://msdn.microsoft.com/ja-jp/library/ms235636 …を
参考にdllを作成しました。
http://q.hatena.ne.jp/1308476017を参考にすると、上記で作成したdllは
Win32 DLLだと思われます。
でこの作成したdllをvbaで使用したいです。
以下はそのソースです。
dllのソースです。
###MathFuncsDll.h
namespace MathFuncs
{
extern "C"
{
class MyMathFuncs
{
public:
// Returns a + b
__declspec(dllexport) double __stdcall Add(double a, double b);
// Returns a - b
__declspec(dllexport) double __stdcall Subtract(double a, double b);
// Returns a * b
__declspec(dllexport) double __stdcall Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllexport) double __stdcall Divide(double a, double b);
};
}
}
###MathFuncsDll.cpp
#include "MathFuncsDll.h"
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
return a / b;
}
}
vbaのソース
Private Declare Function Add Lib "C:\DLL_create\DynamicLibrary\Debug\MathFuncsDll.dll" Alias "?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z" _
(ByVal int1 As Double, ByVal int2 As Double) As Double
Private Sub CommandButton1_Click()
Dim a As Double
a = Add(5, 2)
End Sub
Alias "?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z"の箇所は
dependency walkerで調べました。
これを実行すると、「実行時エラー49 DLLが正しく呼び出せません。」
というエラーがでます。
どうすれば実行できるのかご教授ください。
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 で確認。
返事が遅くなりすみません、ご回答ありがとうございます。
C++側でstaticをつけて、vba側はdllをフルパス指定すると
正しくうごきました。
No3さんの方も試してみたいと思います。
ちなみにhttp://www2.odn.ne.jp/sailing/exceldll.htmでも
動きました。
ありがとうございました。
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 呼出既約で行う様になるのですね。
返事が遅くなりすみません、ご回答ありがとうございます。
C++側でstaticをつけて、vba側はdllをフルパス指定すると
正しくうごきました。
No3さんの方も試してみたいと思います。
ちなみにhttp://www2.odn.ne.jp/sailing/exceldll.htmでも
動きました。
ありがとうございました。
No.2
- 回答日時:
このdllコンパイルできるの?
C++クラスをextern "C"できるとは思えないんですけど。
namespaceにも入っているし・・・
extern "C"ってCの関数として(Cの名前規約で)公開するっていうことだから
Cで書けないインタフェースを使っちゃだめでしょ。
No.1
- 回答日時:
VBAからの呼び出し方はわかりませんが、double MyMathFuncs::Add(double a, double b)と他の3つのメソッドはインスタンスメソッドとして定義されていますから、インスタンスなしでは呼び出せないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C++で外積
-
至急です! マクロ定義で #defi...
-
先程の質問で教えていただき、...
-
C言語
-
C言語を実行すると-infが出てき...
-
(C言語)ニュートン法のプログ...
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
はさみうち法のプログラム(C言...
-
-1.#IND00と出てしまうのですが...
-
数値を指数部と仮数部に分離したい
-
2つの式
-
1以上の自然数を2つ(それぞれ...
-
急!【ヒストグラムのプログラ...
-
C言語でのsinxのマクローリン展...
-
vc++expreeで作ったdllをvbaで使用
-
3次方程式の求解プログラム(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
2次方程式の解を求めるプログ...
-
sin(x)の近似について
おすすめ情報