作者RaoBlack (Rao)
看板Visual_Basic
标题[问题] 如何在VBA 呼叫dev c++ 的dll
时间Sat Apr 3 14:32:13 2010
※ [本文转录自 C_and_CPP 看板]
作者: RaoBlack (Rao) 看板: C_and_CPP
标题: [问题] 如何在VBA 呼叫dev c++ 的dll
时间: Sat Apr 3 13:00:24 2010
目前在研究用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
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.72.162