[問題] 如何在VBA 呼叫dev c++ 的dll
目前在研究用dev c++做出dll再用excel VBA去呼叫裡面的函式,本身不是
資訊類相關科系,寫程式是為了做大量的複雜運算,程式概念有些並不是
很穩固請多包涵,之前參考了很多網路上的資訊,也有很多範例程式,但
是都試不成功,不確定是什麼原因,以下針對我的問題說明:
先於dev c++ 製作dll,下面兩段是預設的程式碼
dll.h檔
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
dllmain.c檔
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
接下來我將程式做一點點修改,只有修改dllmain.c,dll.h沒有動
加了兩個簡單的函式
dll.h檔(沒有修改)
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
dllmain.c檔
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
int _stdcall AddNumber(int nNum1, int nNum2)
{
return nNum1+nNum2;
}
int _stdcall MultiNumber(int nNum1, int nNum2)
{
return nNum1*nNum2;
}
就只有加了上述兩個簡單函式
接著就做編譯的動作了
修改了一下.def檔
.def檔
; dlltool --base-file C:\DOCUME~1\ASCIIH~1\LOCALS~1\Temp/cca03116.base --output-exp MathDll.exp --dllname MathDll.dll --output-def libMathDll.def --no-export-all-symbols --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def C:\DOCUME~1\ASCIIH~1\LOCALS~1\Temp/cca03116.def --output-lib libMathDll.a
EXPORTS
AddNumber @1 //這個是我自己key進去的
MultiNumber @2 // 這個也是我自己key進去的
HelloWorld @ 3 //原本預設是@1 我改成@3
選好應用程式 program file裡的 excel.exe
執行時excel就自行開啟了,然後我就開啟excel的vb編輯器加了下面的
程式碼
Option Explicit
Private Declare Function AddNumber _
Lib "C:\MathDll\MathDll.dll" ( _
ByVal nNum1 As Integer, _
ByVal nNum2 As Integer _
) As Integer
Private Declare Function MultiNumber _
Lib "C:\MathDll\MathDll.dll" ( _
ByVal nNum1 As Integer, _
ByVal nNum2 As Integer _
) As Integer
Private Sub Command1_Click()
Dim nNum1 As Integer
Dim nNum2 As Integer
nNum1 = 5
nNum2 = 6
Debug.Print AddNumber(nNum1, nNum2), MultiNumber(nNum1, nNum2)
End Sub
執行時就出現了錯誤
錯誤訊息如下:
執行階段錯誤'453':
DLL進入點AddNumber無法在C:\MathDll\MathDll.dll
C:\MathDll\MathDll.dll是我資料夾的路徑
程式是參考網路上提供的範例,但就是試不成功
我使用的系統是dev c++ 4.9.9.2 以及Excel 2003
請版大們幫幫忙,看看是什麼問題,感激不盡!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.72.162
※ RaoBlack:轉錄至看板 Visual_Basic 04/03 14:32
→
04/04 01:16, , 1F
04/04 01:16, 1F