怎么做一个包括对话框的DLL?请说详细一些,300分。

chjcwl 2002-02-21 01:42:54
我已经完成了一个普通的应用,包括一个对话框,但现在我想做一个DLL,用函数接口把功能封装起来,有没有什么简便的方法去利用原来的资源?
最好能提供例程,我的邮箱:chjcwl@pub5.fz.fj.cn
分只能分三次给了:-(
...全文
51 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chjcwl 2002-02-21
  • 打赏
  • 举报
回复
老大,没收到,再发一次吧。
chjcwl@pub5.fz.fj.cn 或 weilong_chen@21cn.com,谢谢!!
kimryo 2002-02-21
  • 打赏
  • 举报
回复
已发送,查收。
chjcwl 2002-02-21
  • 打赏
  • 举报
回复
我感觉好困难呀,我原来的应用是多线程的,能不能利用原来的代码?
chjcwl 2002-02-21
  • 打赏
  • 举报
回复
谢谢大家,但是我感觉好困难呀,那我原来的代码就不能利用了吧。
AttaBoy 2002-02-21
  • 打赏
  • 举报
回复
添加对话框资源

然后用DialogBox()
BaoYu 2002-02-21
  • 打赏
  • 举报
回复
不用MFC扩展类也行,就再多加一个UnLoad的函数喽.
BaoYu 2002-02-21
  • 打赏
  • 举报
回复
1.选新建一个DLL.
2.加入对话框.

做一个函数,启用对话框.这样的对话框是模式的.如果要用非框式的,还要做MFC扩展类.挺烦的.
vioy 2002-02-21
  • 打赏
  • 举报
回复
啊,是关于资源的问题。

首先,你的DLL里的一级界面都是模式对话框吗?
如果是这样

在工程中添加一个类

构造函数中将资源的查找顺序改成先从DLL再到其他,并记住原来的查找顺序。
析构函数中再将资源查找顺序改回原来的状态。
(具体函数我也记不清,如果你查不到的话,我回去在给你查查)

然后,在每个对话框类中定义一个上面的类型的成员变量,这样资源冲突的情况就解决了。

如果,你的DLL的一级界面不是(或不都是)模式对话框的话,我也在想办法,不知道其他人有没有彻底的解决方案,欢迎指教。

最后,我想问一句,你的DLL是基于MFC的扩展DLL吗?只有这种DLL才能导出带界面的东东。
panda_w 2002-02-21
  • 打赏
  • 举报
回复
http://www.vckbase.com/english/code/dll/dialog_in_dll.shtml.htm
chjcwl 2002-02-21
  • 打赏
  • 举报
回复
大侠们请帮帮忙!!谢谢!
llitcwl 2002-02-21
  • 打赏
  • 举报
回复
u~p
dct1999 2002-02-21
  • 打赏
  • 举报
回复
下面的例子是一个纯资源DLL的源程序

纯资源的DLL就是只包含资源的DLL,例如:图标,位图,字符串,声音,视频,对话框等。使用纯资源DLL可以节约可执行文件的大小,可以被所有的应用程序所共享,从而提高系统性能。纯资源DLL的编写比普通的DLL要简单的多,首先创建一个WIN32 DLL工程,不是MFC的DLL,然后创建一个资源文件 *.RC,添加到资源DLL的工程中去。然后添加一个初始化DLL的原文件。


#include

extern "C"
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID )
{
return 1;
}

这是纯资源DLL所必须需的代码,保存这个文件为*.CPP。编译这个资源DLL。

在应用程序显示的调用这个DLL,使用LoadLibrary函数装入资源DLL,FindResource和LoadResource来装入各种资源,或者使用下列的特定的资源装入函数:

FormatMessage
LoadAccelerators
LoadBitmap
LoadCursor
LoadIcon
LoadMenu
LoadString
当资源使用结束,你的应用程序须调用FreeLibrary函数来释放资源。

下面就讲一下如何调用编写好的资源DLL

首先在应用程序中声明一个DLL的句柄,HINSTANCE m_hLibrary;在OnCreate( )函数中调用LoadLirbrary( ),在OnDestory( )中调用FreeLibrary()。下载一个工程文件看一看,就什么都搞定了。
(网页编辑:风之翼)
dct1999 2002-02-21
  • 打赏
  • 举报
回复
从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 class
return CDialog::DoModal();
}

用"CEXTDLLState State;"替换TODO行,就象下面:

int CDLLDlgDlg::DoModal()
{
CEXTDLLState State;
return CDialog::DoModal();
}

你能在MFC扩展DLL中想存取资源的任何地方使用CEXTDLLState,而且总能得到正确的结果,我希望它能对你有所帮助。



(网页编辑:风之翼)
chjcwl 2002-02-21
  • 打赏
  • 举报
回复
kimryo(轻*轻*前*轻*重):
再发一个呀,先谢谢了!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧