对于你这个问题是你的DLL库的*.def中应该在EXPORTS后加上Test;因为这种显示调用方式必须这样做!

解决方案 »

  1.   

    呵呵,不需要在def里加东西你应该这么写:
    hDll=LoadLibrary("dll.dll");
    if(hDll)
    {
      pTest=(LPTEST)GetProcAddress(hDll,"Test");
      pTest(this->m_hWnd);
    }
    就不出错了要想调用成功,就确保你dll的位置正确
      

  2.   

    哦,当然,还要判断pTest是否有效
      

  3.   

    改为如下:
    extern "C" int  __declspec(dllexport) Test(HWND hWnd)
    {
      { 
        int a = 5;
        a ++;
        AFX_MANAGE_STATE( AfxGetStaticModuleState() );
      }
      
        CString str;
        str.Format("%x",hWnd);
        AfxMessageBox(str);
        return 1;
    }
    对于 InitInstance函数和所有DLL中的消息处理函数
    是不需要进行进程内模块状态与应用程序模块状态进行转换,但是
    AfxMessageBox是全局的属于应用程序模块状态的函数,你必须将DLL模块状态压到不是当前的模块状态,推出AfxMessageBox的模块状态。
    认真研究研究一下吧,我也是只有这么一点点概念,大家共同进步!
      

  4.   

    这样:
    hDll=LoadLibrary("dll.dll");
    if(hDll)
    {
      pTest=(LPTEST)GetProcAddress(hDll,"Test");
      if( pTest != NULL )
      {
        pTest(this->m_hWnd);
      }
    }
      

  5.   

    to wuchunzhong:
       EXPORTS段该如何声明呢?to ahao:这个程序流程有什么问题呢,能否具体点吗?谢谢!提示的错误大概的意思是说calling convention不符
    所以我改为:
       typedef int (*LPTEST)(HWND);
    后就可以了我想问一下,如果我一定要这样调用,即:
       typedef int (WINAPI* LPTEST)(HWND);
    那DLL中的函数应该如何改呢?
      

  6.   

    流程当然有问题
    hDll=LoadLibrary("dll.dll");
    if(hDll)
    {
    pTest=(LPTEST)GetProcAddress(hDll,"Test");
    }
    pTest(this->m_hWnd);你自己看吧.
      

  7.   

    to AutopVision:
    我试了一下,提示
    error LNK2005: _DllMain@12 already defined in dll.obj
    mfcs42.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dll.obj
    mfcs42.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in dll.obj; second definition ignored
    mfcs42.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in dll.obj; second definition ignored
       Creating library Release/dll.lib and object Release/dll.exp
    Release/dll.dll : fatal error LNK1169: one or more multiply defined symbols found
    Error executing link.exe.dll.dll - 3 error(s), 2 warning(s)
      

  8.   

    比如
    EXPORTS
        ; Explicit exports can go here
    Test
      

  9.   

    to AutopVision:
    我的是Extension DLL
    另外,我如果把AfxMessageBox函数去掉也不行呀
    所以可能不是那个问题
      

  10.   

    对于DLL的调用的方式有两种:显示调用和隐式调用
    对于隐式调用就不用修改*.def文件,直接把原来的*.h包括进来,然后再把生成的*.lib加道理的项目中即可编译成功.
    对于显示调用必须在*.def文件中声明,然后在调用的地方用你原来的函数原型定义一个类型,再用这个类型定义变量,用LoadLibrary函数装载DLL库,用GetProcAddress获得函数地址,最后运行函数,当然应该在每一步都要检查地址的合法性!
      

  11.   

    不需要在def里声明,那是老方法了
      

  12.   

    谢谢大家的讨论!不过大家所说的,我都试过了,还是不行程序运行时,可以弹出对话框,然后才出错
    DEBUG版提示是我前面所说的:calling convention不符欢迎大家继续讨论呀
      

  13.   

    calling convention不符的话
    函数定义时加__stdcall
      

  14.   

    这样:
    hDll=LoadLibrary("dll.dll");
    if(hDll)
    {
      pTest=(LPTEST)GetProcAddress(hDll,"Test");
      if( pTest != NULL )
      {
    //必须如此:
        (*pTest)(this->m_hWnd);
      }
    }
      

  15.   

    to ahao:
       试过,也不行
    to zhougaomin_007:
       两种都可以调用,不知道有没有什么区别?
      

  16.   

    谢谢大家的参与!谢谢!真不好意思,是我对不住大家,是我自己几个DLL用来用去用糊涂了开始加分,分少了点,日后有机会一定补上
      

  17.   

    DLL端如此:
    int  Test(HWND hWnd)
    {
        CString str;
        str.Format("%x",hWnd);
        AfxMessageBox(str);
        return 1;
    }
    在你的*.def中的Export段:
    EXPORTS
        ; Explicit exports can go here
        Test
    应用程序端:
    typedef int (* LPTEST)(HWND);
    LPTEST pTest;
    HINSTANCE hDll;hDll=LoadLibrary("dll.dll");
    if(hDll)
    {
      pTest=(LPTEST)GetProcAddress(hDll,"Test");
      if( pTest != NULL )
      {
         (*pTest)(this->m_hWnd);
      }
    }