VS2008下把EXE程序转换成DLL

一个MFC项目进行到一半,界面都设计好了,领导突然说,要做成DLL的,NND,一句话,够折腾人的,界面重做的话,之前用2天,现在又需要2天,这个时间谁给?到时候项目不能按时完成,又会怪你做事不快,又会质问你,你之前工作没积累吗?这么简单的事情,要做这么久?我感觉有句话说的挺好的,没有教不会的学生,只有不会教的老师,或者说老师教的方法不对;换句话说,没有不会打仗的士兵,只有不会指挥的军官。亮剑里的李云龙我很喜欢,看了几遍,都是很喜欢。我觉得这个人,实在,能干事,能干成事。现在能忽悠的人大有人在,但真正能做事的人倒没那么多了。所以,效率不是说加班多长时间就可以提高的,主要还是有个合理的计划和安排,这样才能有条不紊,按部就班。

 

言归正传,说说如何把EXE程序转换成Dll吧。

 

1.首先建一个DLL的工程。

2.然后将exe工程里的文件(cpphrc等)都拷过来。

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 ,这个是没有参数的,如果有参数的,该如何定义呢?

由于DLLWENT的定义为C语言调用规范,因此MYWENT前一定要用__cdecl,而VC中常用的__stdcallPASCAL调用规范,不可以的。一定要注意。实例如下:

typedef   void   (FAR  __cdecl   *MYWENT)(CWnd*); 

MYWENT     proc;

 

 转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12971749

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页