资源DLL----在线等待 我生成了一个纯资源DLL,包括有图、图标、对话框、字符串表及版本信息。现要在另一基于对话框的应用程序中使用这个资源DLL,要求使用DLL中的对话框做为主框架。请问,如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢回复!我想知道如何显示出资源DLL中的对话框做为应用程序的主框架。 显示其对话框好像就用loadresource的方法没问题,但是怎么得到用户的消息呢?这个我也想知道。。 用MFC,不会!用SDK,如下: HINSTANCE g_hRes;int WinMain(...){ g_hRes=LoadLibrary(szDllPath); //调入你的资源DLL DialogBox(g_hRes,MAKEINTRESOURCE(IDD_MAINDLG),NULL,(DLGPROC)MyDlgProc); FreeLibrary(g_hRes);}BOOL CALLBACK MyDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ switch(uMsg) { case WM_INITDIALOG: break; case WM_COMMAND: break; ... } return TRUE;} 使用mfc如下:在app的initinstance中加入HINSTANCE hInst = LoadLibrary("your_res.dll");if (hInst != NULL){ AfxSetResourceHandle(hInst); free((void*)m_pszAppName); CString Title; Title.LoadString( AFX_IDS_APP_TITLE ); m_pszAppName=_tcsdup(Title);} 在MFC扩展DLL中输出对话框作者:Andreas Leitner 编译:刘峰 从MFC扩展动态链接库中输出对话框似乎是很容易的.你仅需要将相应类用AFX_EXT_CLASS输出即可。如果你用一个应用程序和一个动态链接库建立或许会成功。但是如果你在应用程序和DLL中都插入更多的资源,你将会得到严重错误。原因如下: 表示一个指定资源的正常途径是用它的ID。ID是一个用资源编辑器定义的整型常量。现在,假定你已有一个资源(是字符串)命名为ID_MY_TEXT. CString strText; strText.LoadString( ID_MY_TEXT ); afxDump << strText; 上述代码将字符串输出到调试窗口。有时你可能得到一个错误,而且它只发生在如果文本在一个MFC的扩展动态链接库里。错误的原因在于应用程序获取一个资源的途径。因为应用程序和动态链接库都有一个资源文件。不同的资源ID有可能一样(以为VC资源编辑器为每个模块确定ID的起始编号方式)。 你可能认为在你的应用程序里搜索一个资源的顺序是首先为应用程序,而后为你的DLL。我们需要改变搜索资源的顺序。在本站有其他文章详细讲述了从DLL中输出对话框。但是它只能工作在正规的MFC动态链接库中。我写了一个类(在DLL的MAIN和对话框中有一些改变),允许你在任何你喜欢的地方调用你的对话框,就象:CMyApp::OnDLLDialog(){ CDLLDialog dlg; dlg.DoModal();}我写了一个简单的类,在类的构造函数中设置动态链接库的资源句柄,在析构函数中设置先前的句柄。/////////////////////////////////////////////////////////////////////////////////////////////// File ExtDllState.h//////////////////////////////////////////////////////////////////////////////////////////// #ifndef __EXTDLLSTATE_H__#define __EXTDLLSTATE_H__class CEXTDLLState{public:CEXTDLLState();~CEXTDLLState();protected:HINSTANCE m_hInstOld;};#endif////////////////////////////////////////////////////////////////////////////////////////////File ExtDllState.cpp//////////////////////////////////////////////////////////////////////////////////////////// CEXTDLLState::CEXTDLLState(){m_hInstOld = AfxGetResourceHandle();AfxSetResourceHandle(extensionDLL.hModule);}CEXTDLLState::~CEXTDLLState(){AfxSetResourceHandle(m_hInstOld);}////////////////////////////////////////////////////////////////////////////////////// 你可能看它很短小,但是却能做很多工作:复制上面的类代码到ExDllState.h和ExtDllState.cpp中,将两个文件放入公有的Include目录下,使得每个项目找到它。在你的DLL中,找到main源文件,你会看到类似下面的一些代码:static AFX_EXTENSION_MODULE MY_DLL_NAMEDLL = { NULL, NULL };用 "extensionDLL"替换该变量。放入下面的代码: #include "EXTDLLState.h" #include "ExtDllState.cpp" 在文件的其他地方寻找MY_DLL_NAMEDLL的事件,用extensionDLL替换它。事件只能在这个文件里发生,以为该变量是静态的。 现在,如果你想输出一个对话框,请进入COrresponding类的源文件里并包含EXTDLLState.h,重载函数DoModal()(最好使用ClassWizard),你将看到类似下面的代码:int CMyDLLDlg::DoModal(){// TODO: Add your specialized code here and/or call the base classreturn CDialog::DoModal();}用"CEXTDLLState State;"替换TODO行,就象下面:int CDLLDlgDlg::DoModal(){CEXTDLLState State;return CDialog::DoModal();} 你能在MFC扩展DLL中想存取资源的任何地方使用CEXTDLLState,而且总能得到正确的结果,我希望它能对你有所帮助。 TO tuyang():请问在APP初始化时加入你说的代码后,如何使对话框使能,如何处理消息呢? to pp_ipr()按照你的提示,在编译时在EXTDLLSTATE.CPP中extensionDLL是没有定义的,如果指定为外部变量则出现连接错误,给一个完整的例子好吗?谢谢! .........把对话框整个模块放到dll里面去好了,除非你是希望用dll资源做多语言版,否则修改了对话框资源(比如增减button)后跟函数不匹配会有问题的.dll使用mfc extention输出一个全局函数Showdialog(){ ...}exe里面... winmain(...){loadlibrary("xxx");getprocaddress(...);pshowdialog(...);就可以了} 用OpenProcess的时候,返回了句柄但是GetLastError()有错误? 如何线程实现多文件拷贝(sdk方法),分数不是问题,顶者有分 求助一段Soket使用代码 遇到的难题 通过odbc来查询数据库一个表,然后将查询结果插入到别一个表中如何写代码? 类型 请问语音聊天是用什么技术实现的?有相关的介绍资料吗? 一个简单的问题!很急 关于菜单显示问题, 有劳各位大侠! 不看此文章不算编程高手,不看此文章你就将错过一个进步的机会~! 关于 VC的 TVINSETSTRUCT结构的问题?(祝国家繁荣富强) 有谁知道w2000下读端口的函数 请教函数使用中的问题
我想知道如何显示出资源DLL中的对话框做为应用程序的主框架。
用SDK,如下:
HINSTANCE g_hRes;int WinMain(...)
{
g_hRes=LoadLibrary(szDllPath); //调入你的资源DLL
DialogBox(g_hRes,MAKEINTRESOURCE(IDD_MAINDLG),NULL,(DLGPROC)MyDlgProc);
FreeLibrary(g_hRes);
}BOOL CALLBACK MyDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
break;
...
}
return TRUE;
}
在app的initinstance中加入
HINSTANCE hInst = LoadLibrary("your_res.dll");
if (hInst != NULL)
{
AfxSetResourceHandle(hInst);
free((void*)m_pszAppName);
CString Title;
Title.LoadString( AFX_IDS_APP_TITLE );
m_pszAppName=_tcsdup(Title);
}
AFX_EXT_CLASS输出即可。如果你用一个应用程序和一个动态链接库建立或许会
成功。但是如果你在应用程序和DLL中都插入更多的资源,你将会得到严重错误。
原因如下: 表示一个指定资源的正常途径是用它的ID。ID是一个用资源编辑器定义的
整型常量。现在,假定你已有一个资源(是字符串)命名为ID_MY_TEXT. CString strText;
strText.LoadString( ID_MY_TEXT );
afxDump << strText; 上述代码将字符串输出到调试窗口。有时你可能得到一个错误,而且它只发
生在如果文本在一个MFC的扩展动态链接库里。错误的原因在于应用程序获取一
个资源的途径。因为应用程序和动态链接库都有一个资源文件。不同的资源ID有
可能一样(以为VC资源编辑器为每个模块确定ID的起始编号方式)。 你可能认为在你的应用程序里搜索一个资源的顺序是首先为应用程序,而后为
你的DLL。我们需要改变搜索资源的顺序。在本站有其他文章详细讲述了从DLL中输出对话框。但是它只能工作在正规的MFC
动态链接库中。我写了一个类(在DLL的MAIN和对话框中有一些改变),允许你在任何你喜欢的
地方调用你的对话框,就象:CMyApp::OnDLLDialog()
{
CDLLDialog dlg;
dlg.DoModal();
}
我写了一个简单的类,在类的构造函数中设置动态链接库的资源句柄,在析构函
数中设置先前的句柄。/////////////////////////////////////////////////////////////////////////////////////////////
// File ExtDllState.h
////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __EXTDLLSTATE_H__
#define __EXTDLLSTATE_H__class CEXTDLLState
{
public:
CEXTDLLState();
~CEXTDLLState();
protected:
HINSTANCE m_hInstOld;
};#endif
////////////////////////////////////////////////////////////////////////////////////////////
File ExtDllState.cpp
////////////////////////////////////////////////////////////////////////////////////////////
CEXTDLLState::CEXTDLLState()
{
m_hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(extensionDLL.hModule);
}CEXTDLLState::~CEXTDLLState()
{
AfxSetResourceHandle(m_hInstOld);
}
////////////////////////////////////////////////////////////////////////////////////// 你可能看它很短小,但是却能做很多工作:复制上面的类代码到
ExDllState.h和ExtDllState.cpp中,将两个文件放入公有的Include目录下,
使得每个项目找到它。在你的DLL中,找到main源文件,你会看到类似下面的一
些代码:static AFX_EXTENSION_MODULE MY_DLL_NAMEDLL = { NULL, NULL };
用 "extensionDLL"替换该变量。放入下面的代码: #include "EXTDLLState.h"
#include "ExtDllState.cpp" 在文件的其他地方寻找MY_DLL_NAMEDLL的事件,用extensionDLL替换它。事件
只能在这个文件里发生,以为该变量是静态的。 现在,如果你想输出一个对话框,请进入COrresponding类的源文件里并包含
EXTDLLState.h,重载函数DoModal()(最好使用ClassWizard),你将看到类似下
面的代码:int CMyDLLDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DoModal();
}用"CEXTDLLState State;"替换TODO行,就象下面:int CDLLDlgDlg::DoModal()
{
CEXTDLLState State;
return CDialog::DoModal();
} 你能在MFC扩展DLL中想存取资源的任何地方使用CEXTDLLState,而且总能得
到正确的结果,我希望它能对你有所帮助。
请问在APP初始化时加入你说的代码后,如何使对话框使能,如何处理消息呢?
按照你的提示,在编译时在EXTDLLSTATE.CPP中extensionDLL是没有定义的,如果指定为外部变量则出现连接错误,给一个完整的例子好吗?
谢谢!
输出一个全局函数
Showdialog()
{
...
}exe里面... winmain(...)
{
loadlibrary("xxx");
getprocaddress(...);
pshowdialog(...);
就可以了
}