这个问题我曾经在论坛提出过,
但是由于我水平有限,无法将问题表述清楚,
导致大家也没能帮上我的忙,
现在,我又彻夜写程序,并且仔细查看了MSDN,
尝试对代码进行改动以便查找原因。
最终发现问题出在“CALLBACK”上,程序代码大致如下:
typedef BOOL (CALLBACK* pMobileInit)(DWORD, DWORD, LPCTSTR);//注意这里
HINSTANCE hDLL;
hDLL = LoadLibrary("SMEIDll.dll");//加载动态链接库
if (hDLL == NULL) return;
pMobileInit mobileinit;
mobileinit = (pMobileInit)GetProcAddress(hDLL,"IFInitInterface");//加载函数
if (!mobileinit)
{
FreeLibrary(hDLL);//卸载dll
return;
}
.........这下终于成功了,以前之所以不成功,就是第一行少了CALLBACK,
我在一个论坛帖上看到人家没有用“CALLBACK”,
不用的话,在调用mobileinit函数时出错,
用了就正常,
CALLBACK实际上就是“__stdcall”,
请问,哪些情况下要用到它?哪些情况不要用它。以上调用虽然成功,但还有一个问题:
我成功调用函数以后不能“FreeLibrary(hDLL)”
一旦FreeLibrary就死掉,
MSDN里的例子确实没有FreeLibrary,
但是没有说明为什么不须要。
难道要让dll存在吗?
但是由于我水平有限,无法将问题表述清楚,
导致大家也没能帮上我的忙,
现在,我又彻夜写程序,并且仔细查看了MSDN,
尝试对代码进行改动以便查找原因。
最终发现问题出在“CALLBACK”上,程序代码大致如下:
typedef BOOL (CALLBACK* pMobileInit)(DWORD, DWORD, LPCTSTR);//注意这里
HINSTANCE hDLL;
hDLL = LoadLibrary("SMEIDll.dll");//加载动态链接库
if (hDLL == NULL) return;
pMobileInit mobileinit;
mobileinit = (pMobileInit)GetProcAddress(hDLL,"IFInitInterface");//加载函数
if (!mobileinit)
{
FreeLibrary(hDLL);//卸载dll
return;
}
.........这下终于成功了,以前之所以不成功,就是第一行少了CALLBACK,
我在一个论坛帖上看到人家没有用“CALLBACK”,
不用的话,在调用mobileinit函数时出错,
用了就正常,
CALLBACK实际上就是“__stdcall”,
请问,哪些情况下要用到它?哪些情况不要用它。以上调用虽然成功,但还有一个问题:
我成功调用函数以后不能“FreeLibrary(hDLL)”
一旦FreeLibrary就死掉,
MSDN里的例子确实没有FreeLibrary,
但是没有说明为什么不须要。
难道要让dll存在吗?
(DWORD, DWORD, LPCTSTR)是参数么?
请问楼主
mobileinit = (pMobileInit)GetProcAddress(hDLL,"IFInitInterface");//加载函数其中 IFInitInterface是DLL中的函数名么?
该程序原来的声明是:BOOL WINAPI IFInitInterface(...),
而WINAPI和CALLBACK实际上都是“__stdcall”。
也就是说,在typedef BOOL (CALLBACK* pMobileInit)(DWORD, DWORD, LPCTSTR);中要标题函数的调用方式,
那么我先前看到的那种用法,
他不提CALLBACK,是默认为哪种呢?
而使用__cdecl时候,则会在ret之后产生add esp, x;其中x为参数所占用的字节数.这里则由调用者实现了堆栈的清理工作.windows里大部分函数都是使用__stdcall,只有wsprintf用__cdecl.