一个MFC项目进行到一半,界面都设计好了,领导突然说,要做成DLL的,NND,一句话,够折腾人的,界面重做的话,之前用2天,现在又需要2天,这个时间谁给?到时候项目不能按时完成,又会怪你做事不快,又会质问你,你之前工作没积累吗?这么简单的事情,要做这么久?我感觉有句话说的挺好的,没有教不会的学生,只有不会教的老师,或者说老师教的方法不对;换句话说,没有不会打仗的士兵,只有不会指挥的军官。亮剑里的李云龙我很喜欢,看了几遍,都是很喜欢。我觉得这个人,实在,能干事,能干成事。现在能忽悠的人大有人在,但真正能做事的人倒没那么多了。所以,效率不是说加班多长时间就可以提高的,主要还是有个合理的计划和安排,这样才能有条不紊,按部就班。
言归正传,说说如何把EXE程序转换成Dll吧。
1.首先建一个DLL的工程。
2.然后将exe工程里的文件(cpp、h、rc等)都拷过来。
3.把DLL工程目录下的XXXXX.rc改成DLL对应的rc文件,并将之前的删除。res目录下的不用改名字。
4.把文件加入到Dll工程中编译。
5.原来工程Cxx.h中的类是从CWinApp中继承下来的,里面隐含WinMain()函数,但是我们新建dll工程也有自己的WinMain()入口,这样我们就需要把要导入的原来工程中的Cxx.h中的相关类做修改:
删去: public CWinApp;
删去:virtual BOOL InitInstance();
删去:DECLARE_MESSAGE_MAP()。
增加代码如下:
extern "C" __declspec(dllexport) void ShowDlg(void)
{
CXXXXXDlg dlg;
dlg.DoModal();
}
7.建一个测试工程,然后增加一个按钮事件,添加下面代码:
HINSTANCE hDll; //DLL句柄
hDll = LoadLibrary(_T("XXXXDLL.dll"));
if (NULL == hDll)
{
MessageBox(_T("DLL加载失败"));
}
else
{
FARPROC proc;
proc = GetProcAddress(hDll,"ShowDlg");//同上
proc();
}
8.编译测试工程和dll,并把dll拷贝到工程调试目录下,这样测试的时候,会有个问题崩溃,查看信息是parent指针未空。
解决方法之一是:
在DLL工程中:
右击工程->属性->配置属性->general把工程默认中的Use of MFC对应得改成Use MFC in a Static Library。
此方法编译出来的文件比较大。
解决方法之二是:
extern "C" __declspec(dllexport) void ShowDlg(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());//增加这一行
CXXXXXDlg dlg;
dlg.DoModal();
}
9.函数指针定义的问题:
我们这里用到了FARPROC ,这个是没有参数的,如果有参数的,该如何定义呢?
由于DLL中WENT的定义为C语言调用规范,因此MYWENT前一定要用__cdecl,而VC中常用的__stdcall是PASCAL调用规范,不可以的。一定要注意。实例如下:
typedef void (FAR__cdecl *MYWENT)(CWnd*);
MYWENT proc;
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12971749