在MFC “共享MFC 规则DLL”中(创建MFC DLL中选第一个),使用MFC对话框注意问题

3 篇文章 0 订阅

MFC “共享MFC 规则DLL”(创建MFC DLL中选第一个),使用MFC对话框注意问题

(VS2005中编译通过)

 

由于需求,需要把VC的基于对话框工程移到dll中,因此创建了共享MFC 规则DLL”, 并提供相关接口(导出相关函数), 在这些函数的功能有:创建对话框,显示对话框等等。

 

由于以前用VC在为别的开发语言写Dll时都是创建Win32 Dll(一般没用MFC对话框), 导出接口都是使用def文件和__stdcall导出的(这样子导出的DLL接口OracleSQL都可以调用的),例如:

*.cpp

void __stdcall Try()

{

       return;

}

 

*.h

void __stdcall Try();

 

*.def

Try @ 1

 

所以这次也是这样子导出, 把所有接口写好,并写个测试的exe, 接口的调用都可以, 此时想在某个接口中创建对话框, 就报错了。

 

现在找到的解决方法是:

(不需要在def文件中加入导出的函数, 同时函数不能使用__stdcall, 最重要一点就是加入AFX_MANAGE_STATE(AfxGetStaticModuleState());语句)

*.cpp

extern "C" __declspec(dllexport) void Try()

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());

       // 下面是创建对话框

       return;

}

 

*.h

extern "C" __declspec(dllexport) void  Try();

 

*.def

// Try @ 1  这个当然要删除掉了。

 

AFX_MANAGE_STATE(AfxGetStaticModuleState());//用于模块切换时的状态保护,

1.AfxGetStaticModuleState()指向当前模块状态;

2.当前函数调用结束后原模块的状态自动被恢复;

3.用于DLL中所调用MFC函数、类、资源时的模块状态切换;

 

看下面也有例子

http://www.vckbase.com/document/viewdoc/?id=543

Dll中创建对话框并调用
作者:freedk

下载本文示例代码

1
、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”

2
、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”
选择“New”,至此对话框已添加到DLL工程中。


3
、为对话框添加一新类,如:CTest,基类为CDialog

4
、在MFCDLL.cpp(因创建的工程为MFCDLL)添加接口函数:

extern "C" __declspec(dllexport) void Show()
{
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
       CTest test;
       test.DoModal ();
}

别忘了在文件中添加: #include "Test.h":),大功告成,编译吧!

5
、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:

typedef void (WINAPI * TESTDLL)();
 
 
HINSTANCE hmod;
hmod = ::LoadLibrary ("mfcdll.dll");
if(hmod==NULL)
{
       AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
if(lpproc!=(TESTDLL)NULL)
       (*lpproc)();
FreeLibrary(hmod);

6、试试看,是不是DLL中对话框显示出来了:)

测试环境:VC6.0+Win2000

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值