snoopy每日一译-DLL中的对话框
在DLL中包含它自己的资源(例如对话框),好象很简单。但是在我发现如何实现之前,我的头都大了。
by:Randy More 2002.10.1
from:codeGuru
翻译:snoopy
在DLL的函数中弹出对话框,你必须处理状态以使DLL代码能使用DLL资源:
extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2) { //确保我们能使用DLL资源 AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMyLocalDialog dlg; dlg.Arg1 = MyData1; //为MyLocalDialog指定本地数据 dlg.Arg2 = MyData2; dlg.DoModal(); MyData1 = dlg.Arg1; //对话框关闭后的数据 MyData2 = dlg.Arg2; }
这有一个来自Johan Nilsson 的升级版。
当应用程序调用这个导出函数时永远不能使用GetLastError()检查发生的错误。这是因为AFX_MANAGE_STATE宏在堆栈中建立了一个临时的对象,当函数结束它自动销毁,所有的错误码也被清除。
下面的代码不是很优美,但是它的确可以工作:
extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2) { DWORD dwLastErr = NO_ERROR; //使用大括号,强迫AFX_MANAGE_STATE 建立的临时对象在函数结束前销毁 // 注意:不要在大括号以外调用MFC代码。 // { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMyLocalDialog dlg; dlg.Arg1 = MyData1; //specific local data for MyLocalDialog dlg.Arg2 = MyData2; dlg.DoModal(); MyData1 = dlg.Arg1; //data after processing MyData2 = dlg.Arg2; // //保存可能的错误 // dwLastErr = ::GetLastError(); } if (::GetLastError() == NO_ERROR) ::SetLastError(dwLastErr); }
注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2153.html
如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:)
A B C D E