如果别的应用程序要用到DLL中的资源,它必须知道资源的ID。这些ID是在DLL工程的Resource.h文件中定义的,因此另一个工程只需包含Resource.h文件即可,或者,将resource.h中定义的ID复制即可。
你所说的另一个工程包含了rc文件,其实本质上等于是包含resource.h文件——因为rc文件中必然有“#include "resource.h"”。
你所说的另一个工程包含了rc文件,其实本质上等于是包含resource.h文件——因为rc文件中必然有“#include "resource.h"”。
您可以采用如下的方法实现:
在一个MFC Extention DLL中为您的对话框资源模板定义一个CDialog的子类,并在一个接口函数中用DoModal()生成对话框。在您的应用程序中,您只需直接调用DLL中的接口函数就可以了。
如果您有问题,请给出较详细代码以便大家为您解决。- 微软全球技术中心 VC技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
另外,我说的“在工程设置里包含该DLL工程的".rc"文件”是指我发布DLL时需要同时发布我的".rc"文件,并在应用程序的工程设置的“Additional resource include directoris:”里增加其路径,不好意思,我没说明白;
请问,可以有办法不须发布DLL的资源文件吗?
2把对话框封在一个函数里面,像OPENFILENAME那样。
方法2.现在,我的对话框就是封装在函数里的,但没用
我用VC以资源方式打开生成的DLL,发现里面有我加在DLL工程里的对话框资源,应用程序使用DLL编译链接均没问题,但一执行使用对话框的函数就死
{
BOOL bRet; HINSTANCE hOldResHandle=AfxGetResourceHandle();
HINSTANCE hInst = ::GetModuleHandle("SPub.dll");
//把资源句柄指向本DLL。注意!这是必须的。否则构造对话框或引用资源时极可能会出错。
AfxSetResourceHandle(hInst); CLoginDlg dlg(NULL,nRights,szPrompt,LoginUser);
if(dlg.DoModal()==IDOK)
bRet=TRUE;
else
bRet=FALSE;
//恢复老的资源句柄。注意!这也是必须的。
AfxSetResourceHandle(hOldResHandle);
return bRet;
}
1.多线程
2.非模态窗口
因为这两种情况都可能发生“把资源句柄指向DLL后,而又在恢复老的资源句柄之前,主程序弹出对话框引用老的资源句柄”的情况而出错,我的理解对吗?
不过,有学了一招,非常感谢,给分