• 締切済み

DLL作成後VBAで使用しようとするとエラーが出ます

エントリxxがDLLファイルyy内に見つかりません。とエラーが出ます。 複雑な処理をCでやろうとして基本的な箱を作ろうとしたのですがうまくいきません。どなたか教えていただけないでしょうか? C側 #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT void kinou(int a); } void kinou(int a) { //処理 } 呼び出し規約はstdcallしています。 VBA側 Declare Sub kinou Lib ".\test.dll[ (フルリンクしています)] " (ByVal a As Integer) Sub test() Call tasu(10) End Sub

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DEFファイルでエクスポート名を変更していないのであれば エクスポートされた関数は _関数名@引数のバイト数 といった命名になります DLL_EXPORT void kinou( int a );の宣言なら Declare Sub _kinou@4 lib "dllのPath" ( ByVal a as Long ) または Aliasを使って 本来の関数名を指示します Declare Sub kinou lib "dllのPath" _   Alias "_kinou@4" ( ByVal a as Long ) といった記述です

関連するQ&A

  • 自作DLLをエクセルVBAで使用したい

    こんにちは。 自作DLLをエクセルVBAで使用したいのですが、知識不足でうまく動かせません。どうぞお知恵をお貸しください。 例えば足し算をするCのプログラムを以下のように作ります。ファイル名は"wa.c"とします。 #define EXPORT __declspec(dllexport) __stdcall EXPORT double wa(double a,double b) { return(a+b); } これをコンパイルして、DLLファイル"test.dll"を作ります。 gcc -shared -o test.dll wa.c エクセルVBAのモジュールには次のように記述しました。 Declare PtrSafe Function wa Lib "test.dll" (ByVal a As Double, ByVal b As Double) As Double ここで作成した関数をワークシート関数として呼び出したいのですが、ワークシート上での返り値は常にゼロになってしまいます。例えば、ワークシートのセルに"=wa(1.2,3.5)"と記入すると、"4.7"を返してほしいところですが、ゼロとなってしまいます。ワークシート関数として正しく動作させるにはどうしたらよいでしょうか? ちなみに、この関数をエクセルVBAのサブルーチンで使うことはできます。例えばこんな感じです。 Sub test() x = 1.2 y = 3.5 Call MsgBox(wa(x, y)) End Sub また、上記の"test.dll"を他のCのプログラムから呼び出すことも正しくできます。 なお、64bitのエクセルを使っています。Cのコンパイラも64bitです。 どうぞよろしくお願いいたします。

  • vc++expreeで作ったdllをvbaで使用

    vc++2008 expressを使用しています。 http://msdn.microsoft.com/ja-jp/library/ms235636%28v=vs.90%29.aspxを 参考に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が正しく呼び出せません。」 というエラーがでます。 どうすれば実行できるのかご教授ください。

  • DLLの作り方

    DLLでは、ポインタのアドレス渡しのように、可変長サイズのVectorコンテナを引数にすることは可能ですか? DLLのソースコ-ド extern "C" __declspec(dllexport) void __stdcall matinv(vector<vector<complex<double> > >,vector<vector<complex<double> > >&); void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv) {   コード  } 呼び出し側の関数宣言 #include <vector> #include <math.h> #pragma hdrstop #include <complex.h> using namespace std; extern "C" __declspec(dllimport) void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv); よろしく御願いいたします。

  • Borland社のコンパイラを使ったDLL

    C++BuilderでDLLファイルを使っておりますが、Vectorコンテナの値をコールバック出来ませんでした。Vectorコンテナを使ったコールバックを可能とする記述方法を教えてください。 Edit1には、思惑通りに102が返ります。Edit2には、1が、Edit3には2が返ります。この例では、201、202を返したいのです。 本体側 #include <vector> ・ ・ extern "C" __declspec(dllimport) int __stdcall test(int*,vector<int>); #pragma package(smart_init) #pragma resource "*.dfm" using namespace std; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { vector<int> b; b.push_back(1); b.push_back(2); int *a; *a=1; Edit1->Text = IntToStr(test(a,b)); Edit2->Text = IntToStr(b[0]); Edit3->Text = IntToStr(b[1]); b.clear(); dll側 extern "C" __declspec(dllexport) int __stdcall test(int*,vector<int>*);//コンテナの引数の実験 ・ ・ //----------------------------------------------------------------------------- int __stdcall test(int *a,vector<int> &b) { //dllの引数の可能性の実験 for(unsigned int i;i<b.size();i++){ b[i] +=200; } *a+=1; return *a+100; } //-----------------------------------------------------------------------------

  • VB6から参照可能なDLLの作成

    VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。

  • VC++6.0で作成したDLLのクラスをVB6.0でインポートするには?

    VC++6.0で作成したDLLのクラスをVB6.0でインポートするにはどうしたらいいのでしょうか? 通常の関数なら__declspec(dllexport) __stdcall を書き,defファイルにEXPORT指定することで解決できたのですが,クラスごとエクスポートする場合にはVC側,VB側の記述をどのようにすれば良いのでしょうか?

  • PythonでDLLからの戻り値で文字列の場合を正しく表示させたい

    VisualStudio2005でDLLを作成して、Python2.6のctypesモジュールを使って、PythonからC++のルーチンを呼び出す際に、文字列を引数として、文字列を戻り値として使えるようにC++を記述したいのですがどうすればよいのでしょうか? 関数呼び出しは __stdcallです。 __declspec(dllexport) unsigned char* __stdcall Test(const char *s, int n); とした場合、Pythonで戻り値を見るとint型の数値でした。 from ctypes import * lib = windll.LoadLibrary("test.dll") s = lib.Test("abcdefghijk", 3) print s

  • DLLでLIBファイルが作成されない

    DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。 1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。 と警告が出てしまいます。 私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。 どのようにしたらLIBファイルが作成されるようになるのでしょうか? ■■■stub.h■■■ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif typedef int (*HOGEHOGE)(int i); EXPORT class DDDClass{ private: int num; HOGEHOGE c; public: DDDClass(); int CALLBACK counter(); int CALLBACK touroku(int (*b)(int i)); }; ■■■stub.cpp■■■ #include <windows.h> #include "Stub1.h" int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ return true; } EXPORT class DDDClass; DDDClass::DDDClass(){ num =0; c = NULL; } int CALLBACK DDDClass::touroku(int (*b)(int i)){ c = b; return 0; } int CALLBACK DDDClass::counter(){ //c = b; c(num); num++; return 0; } /* EXPORT bool CALLBACK aaaaa(){ return true; } */

  • VC++で作成したDLLをVBから呼ぶと戻り値が化けてしまう

    はじめまして。いつも勉強させていただいております。 VCは今回初めてやっておりますので当たり前の質問 になってしまうかもしれませんがご教授願います。 以下のような仕様でものづくりを行っております。 1.VBよりVC++で作成したDLLを呼び出す。 2.VC++で作成したDLL側ではパラメータより取得した   値を元に足し算をした結果を   戻り値にセットして要求元に返却する。 といった流れで考えています。 2の部分についてはExeを一度作成し実行させた ところDOS窓に値が表示されました。(printfで) しかし、正しくOUTPUTされた値がVB側の戻り値と して返却された時点で参照すると「-6348」 となっています。 なぜこうなってしまうのか原因がわからず投稿 させて頂きました。 ご存知の方、ご教授下さい。 ************************************************* VC++ DLL側のソース ************************************************* #include <windows.h> #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT int add(int a,int b); } int add(int a,int b) { return a+b; } ************************************************* VB  DLL呼び出し元 ************************************************* Option Explicit Private Declare Function add Lib "C:\Program Files\Microsoft Visual Studio\test\Debug\test.dll" Alias "_add@8" (a As Long, b As Long) As Integer Private Sub Command1_Click() Dim ret As Long ret = add(1, 2) MsgBox ret End Sub 環境 OS:WinXP 言語:VC++6.0    VB6.0(SP6)

  • DLL作成時、defファイルを使いたくない

    また質問させて下さい。 Visual Studio2005でDLLを使ったプログラムを作ろうとしています。 defファイルを利用すると、そのDLLファイルを作成できるのですが、 __declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。 なぜでしょうか? 下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に その関数を書きました。(これがダメだと思うのですが…) //●Visual Studioのプロジェクト作成で、生成される部分 // dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル // #pragma once __declspec(dllexport) void __cdecl test0(void); #ifndef __AFXWIN_H__ #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください" #endif #include "resource.h" // メイン シンボル // Cdll_test7App // このクラスの実装に関しては dll_test7.cpp を参照してください。 // class Cdll_test7App : public CWinApp { public: Cdll_test7App(); // オーバーライド public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; //■作成した関数 __declspec(dllexport) void __cdecl test0(void) { CString cs; cs="aa"; ::AfxMessageBox(cs); } 上記は、defファイルを利用するとこの関数を呼び出せます。 以上、どうぞよろしくお願い致します。

専門家に質問してみよう