今天第一次写DLL。
DLL里面有三种类型,win32 DLL, 标准MFC DLL,以及非标准MFC DLL。
他们的区别是,win32 DLL里面主要是用C/C++编写的,不能调用MFC里面的函数之类的。
而标准MFC DLL里面可以使用MFC,但是却不能输出。
非标准MFC DLL里面可以使用MFC,并且可以输出。
下面是一个简单的例子
头文件
#pragma once
#ifdef DLLUSAGE_EXPORTS
#define SIMPLE_API __declspec(dllexport)
#else
#define SIMPLE_API __declspec(dllimport)
#endif
SIMPLE_API int AddTwoNumbers(int lhs, int rhs);
实现文件
SIMPLE_API int AddTwoNumbers(int lhs, int rhs)
{
Return lhs + rhs;
}
在生成 my.DLL 以后,再用
typedef int (*ADD)(int,int);
HINSTANCE instance = LoadLibrary("E:\\dllusage.dll");
if ( NULL == instance)
{
MessageBox(NULL,"加载DLL错误",NULL,MB_OK);
return 1;
}
ADD myadd = (ADD)GetProcAddress(instance,TEXT("?AddTwoNumbers@@YAHHH@Z"));
if (NULL == myadd)
{
MessageBox(NULL, "获取函数地址错误",NULL,MB_OK);
return 2;
}
int result = myadd(5, 6);
这里值得说明的一点是:
在第二个参数里面采用的是AddTwoNumbers在DLL里面的名称?AddTwoNumbers@@YAHHH@Z,相当于是DLL里面提供给我们调用的接口,如果不采用这样的写法,就会出现127错误
ERROR_PROC_NOT_FOUND
|
The specified procedure could not be found
|
因此我使用那种比较笨的办法,用view denpends来查找到AddTwoNumbers在DLL里面的入口地址,然后再去调用这个这个入口地址。
或者是采用这样的方法:
Extern “c”
{
SIMPLE_API int AddTwoNumbers(int lhs, int rhs);
}
这样一来的好处就是:
ADD myadd = (ADD)GetProcAddress(instance,TEXT("AddTwoNumbers "));
你会发现这样看起来要舒服一点,这个时候,你用view depends来查看DLL中该函数对应的地址,就会发现变成了AddTwoNumbers。