为什么自己写的DLL文件在静态链接的时候会报错,而在动态链接的时候正常运行呢?dllmfc
解决方案 »
- CEditView中如何改变字体颜色和大小,字体最大时光标也只有最初那么大,什么原因
- 使用SC_MOVE拖动按钮不闪烁,mousemove就闪烁,为什么?
- 关于progress的问题
- MFC编写的ActiveX控件,在Delphi中的使用问题?
- 紧急求助!关于客户端管理多UDP套接字,采用什么模型可以具备超时重发机制?
- 双击窗体标题条发出的是什么消息?
- 如何加入菜单
- !!! VS.NET哪张盘中安装Visual Source Safe Server?
- GCC 的安装,设置,使用
- 请问如何在CView中按住mouse LButton不放,能连续调用某个函数?
- 类似于WarKey改键器中键位的获取
- 写好的控制台程序(黑框)可以很简便的转化成用MFC做出的有界面的程序吗??
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的进程模块)
好像我还真有CString类型的返回值,好的我再看看,谢谢你的分享!
1、dll和调用模块的字符集设置是否一致(Unicode?多字节?),检查工程属性|常规
2、dll和调用模块的wchar_t是否做为内置类型的设置是否一致,检查工程属性|C/C++|语言
3、如果dll和调用模块都是MFC工程,MFC使用方式和运行库(CRT库)设置是否一致,检查工程属性|常规
和工程属性|C/C++|代码生成