现在有一CBC做的DLL,我在程序中调用的时候出错了,请帮我看看HMODULY hModuly=LoadLibrary("dllname.dll"); 
FARPROC proc=GetProcAddress(hModule,"Proc1");
if(proc==NULL) return 0;
typedef HANDLE (* FUNC)();
FUNC proc1=(FUNC)proc;
HANDLE re=proc1();
//上面代码没问题
FARPROC proc2=GetProcAddress(hModule,"Proc2");
if(proc2==NULL) return 0;
typedef int (* FUNC2)(HANDLE);
FUNC2 proc3=(FUNC2)proc2;
int re2=proc3(hWnd);
//调用proc3的时候出错!
编译没错,运行时出错!error code:
The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one
calling copnvention with a function pointer declared with a 
different calling convention.

解决方案 »

  1.   

    HINSTANCE hInst=::LoadLibrary(_T("dllname.dll"));
    DWORD (WINAPI *fn)(DWORD,DWORD);//你的函数原型
    if(hInst)
    {
          fn=(DWORD(WINAPI(DWORD,DWORD))::GetProcAddress((HMODULE)hInst,("Proc1"));
    if(fn)
    (*fn)(param1,param2);
    ::FreeLibrary (hInst);
    return true;
    }
      

  2.   

    刚才没有看到下面的代码,你的dll里的声明是__cdecl么,如果是__stdcall的话
    声明要改为 int (* __stdcall FUNC2)(HANDLE);
    如果还不是,把连接选项去掉试试/GZ
      

  3.   

    int re2=proc3(hWnd);
    改成
    int re2=(*proc3)(hWnd);