为什么自己写的DLL文件在静态链接的时候会报错,而在动态链接的时候正常运行呢?dllmfc

解决方案 »

  1.   

    静态连接的lib,dll是否都正确
      

  2.   

    我之前也碰到类似的问题。不记得怎么处理了,好像是与你dll项目中的类、mfc类库有关系。最好不用mfc提供的类库,用通用点的。如CString改用char等等。
      

  3.   

    使用VC模板可以生成以下三种不同类型的DLL:
        1.Win32DLL
           只能导出C函数和变量,但可以使用除CObject派生的类.不能在
        导出函数中建立对话框,因为不能进行模块环境转换.
     
       2.MFC常规DLL 
           只能导出C函数和变量,但可以使用MFC中所有的类,在使用DLL中的资源
        时要进行模块环境转换,在每个要导出的函数最前面加上:
        AFX_MANAGE_STATE(AfxGetStaticModuleState())
        也可以使用以下人工转换:
        HINSTANCE hCurContext = AfxGetResourceHandle();                     AfxSetResourceHandle(::GetModuleHandle("temp.dll"));
        //可以使用DLL中的资源了.
        HRSRC hRes = FindResource(hCurContext,MAKEINTRESOURCE(129),
     RT_DIALOG);
        .....//可以创建窗口了
     
       AfxSetResourceHandle(hCurContext);
        另外标准C语言中不支持重载,因为C语言的调用协定(__cdecl)生成的代码中函   数名只有一个_(下划线)做前缀,所有该类型的DLL不能导出重载函数.
     
       3.MFC扩展DLL
           支持C++接口,可以导出C++类,成员函数及重载函数,只支持动态MFC库.
        其实我们使用的MFC42.dll就属于该类.
           在该类AFX DLL中导出的C++类成员函数不使用extern "C",因为C++类使用    的是this调用协定, 该协定没有C的换名规则.
           VC模板使用new CDynLinkLibrary(CqDLL);将该DLL加入资源链表中.
        所以对资源的搜索顺序如下:
           1.当EXE文件需要资源时,先从EXE模块中查找,然后搜索DLL模块,最后
             查找MFC Ext DLL模块(mfc42.dll).
           2.当DLL使用资源时,其搜索顺序如下:
             DLL ---> MFC Ext DLL ---> EXE(调用该DLL的进程模块)
      

  4.   


    好像我还真有CString类型的返回值,好的我再看看,谢谢你的分享!
      

  5.   

    可能是dll类型不对,win32dll中使用了cstring等的这类问题吧
      

  6.   

    经验判断,有三种可能性:
    1、dll和调用模块的字符集设置是否一致(Unicode?多字节?),检查工程属性|常规
    2、dll和调用模块的wchar_t是否做为内置类型的设置是否一致,检查工程属性|C/C++|语言
    3、如果dll和调用模块都是MFC工程,MFC使用方式和运行库(CRT库)设置是否一致,检查工程属性|常规
    和工程属性|C/C++|代码生成