今天第一次寫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。