今天第一次寫(xiě)DLL。
DLL里面有三種類型,win32 DLL, 標(biāo)準(zhǔn)MFC DLL,以及非標(biāo)準(zhǔn)MFC DLL。
他們的區(qū)別是,win32 DLL里面主要是用C/C++編寫(xiě)的,不能調(diào)用MFC里面的函數(shù)之類的。
而標(biāo)準(zhǔn)MFC DLL里面可以使用MFC,但是卻不能輸出。
非標(biāo)準(zhǔn)MFC DLL里面可以使用MFC,并且可以輸出。
下面是一個(gè)簡(jiǎn)單的例子
頭文件
#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);
實(shí)現(xiàn)文件
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錯(cuò)誤",NULL,MB_OK);
return 1;
}
ADD myadd = (ADD)GetProcAddress(instance,TEXT("?AddTwoNumbers@@YAHHH@Z"));
if (NULL == myadd)
{
MessageBox(NULL, "獲取函數(shù)地址錯(cuò)誤",NULL,MB_OK);
return 2;
}
int result = myadd(5, 6);
這里值得說(shuō)明的一點(diǎn)是:
在第二個(gè)參數(shù)里面采用的是AddTwoNumbers在DLL里面的名稱?AddTwoNumbers@@YAHHH@Z,相當(dāng)于是DLL里面提供給我們調(diào)用的接口,如果不采用這樣的寫(xiě)法,就會(huì)出現(xiàn)127錯(cuò)誤
ERROR_PROC_NOT_FOUND
|
The specified procedure could not be found
|
因此我使用那種比較笨的辦法,用view denpends來(lái)查找到AddTwoNumbers在DLL里面的入口地址,然后再去調(diào)用這個(gè)這個(gè)入口地址。
或者是采用這樣的方法:
Extern “c”
{
SIMPLE_API int AddTwoNumbers(int lhs, int rhs);
}
這樣一來(lái)的好處就是:
ADD myadd = (ADD)GetProcAddress(instance,TEXT("AddTwoNumbers "));
你會(huì)發(fā)現(xiàn)這樣看起來(lái)要舒服一點(diǎn),這個(gè)時(shí)候,你用view depends來(lái)查看DLL中該函數(shù)對(duì)應(yīng)的地址,就會(huì)發(fā)現(xiàn)變成了AddTwoNumbers。