这个问题我曾经在论坛提出过,
但是由于我水平有限,无法将问题表述清楚,
导致大家也没能帮上我的忙,
现在,我又彻夜写程序,并且仔细查看了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存在吗?

解决方案 »

  1.   

    CALLBACK  是调用规范 和dll中一致   常用有两种 你可以查一下2者的区别  
      

  2.   

    楼主的精神让人感动~!,当初我也是给这个CALLBACK搞的不轻,后来决定用隐式调用DLL了,得楼主鼓励,回去试下先!
      

  3.   

    typedef BOOL (CALLBACK* pMobileInit)(DWORD, DWORD, LPCTSTR);//注意这里
    (DWORD, DWORD, LPCTSTR)是参数么?
    请问楼主  
    mobileinit = (pMobileInit)GetProcAddress(hDLL,"IFInitInterface");//加载函数其中 IFInitInterface是DLL中的函数名么?
      

  4.   

    FreeLibrary好象和DllMain有冲突的.建议楼主仔细查查MSDN.
      

  5.   

    现在弄明白之后再去看原来的隐式调用,才发现确实有这回事。
    该程序原来的声明是:BOOL WINAPI IFInitInterface(...),
    而WINAPI和CALLBACK实际上都是“__stdcall”。
    也就是说,在typedef BOOL (CALLBACK* pMobileInit)(DWORD, DWORD, LPCTSTR);中要标题函数的调用方式,
    那么我先前看到的那种用法,
    他不提CALLBACK,是默认为哪种呢?
      

  6.   

    看看两个调用约定的汇编代码:采用__stdcall的时候,在函数返回之间会有ret x,其中x为参数所占用的字节数.由被调用者自身释放.
    而使用__cdecl时候,则会在ret之后产生add esp, x;其中x为参数所占用的字节数.这里则由调用者实现了堆栈的清理工作.windows里大部分函数都是使用__stdcall,只有wsprintf用__cdecl.