WEB开发网
开发学院软件开发VC 在DLL中使用资源 阅读

在DLL中使用资源

 2009-10-06 20:29:53 来源:WEB开发网   
核心提示:4)编译生成UseDlg.dll和UseDlg.lib,接下来我们建立调用此DLL的应用程序,在DLL中使用资源(2),其步骤如下:1)在VC菜单中File->New新建一个命名为Use的MFC AppWizard(exe)工程,下一步选择Dialog Based之后点击Finish按钮,按照MFC库的链接方法,

4)编译生成UseDlg.dll和UseDlg.lib。

接下来我们建立调用此DLL的应用程序,其步骤如下:

1)在VC菜单中File->New新建一个命名为Use的MFC AppWizard(exe)工程,下一步选择Dialog Based之后点击Finish按钮。

2)在主对话框上面添加一个按钮,之后双击此按钮,会弹出Add Member Function的对话框,直接点击OK进入void CUseDlg::OnButton1()函数。并在此函数内添加一个函数调用:ShowDlg();。

3)紧跟在#include语句后面加上如下代码:

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

#pragma comment(lib,"debug/UseDlg")

4)将上面UseDlg工程中生成的UseDlg.dll和UseDlg.lib两个文件复制到Use工程的Debug目录内。

5)编译生成Use.exe。

运行Use.exe,点击Button1按钮,可以看到一个名称为Dialog的非模态对话框弹出。点击上面的按钮,可以弹出模态对话框About。运行成功。

让我们来回顾一下在Win32 DLL中使用对话框的过程。

在DLL中,我们定义了两个对话框资源:IDD_DLG_SHOW和IDD_ABOUTBOX,并且导出了函数ShowDlg。在函数ShowDlg之中使用CreateDialog函数创建了非模态对话框IDD_DLG_SHOW,并指定了该对话框的回调函数DlgProc。在DlgProc之中处理了WM_INITDIALOG、WM_COMMAND和WM_CLOSE消息,以响应用户对对话框所做的动作。在处理按钮动作的时候,使用DialogBox函数创建IDD_ABOUTBOX这个模态对话框,指定其回调函数为AboutProc,并且在AboutProc中处理其相应消息。

在EXE中,我们使用隐式链接的方法来调用DLL,并使用DLL中导出的ShowDlg函数来调用DLL中的对话框。

在Win32 DLL中使用对话框就是这么简单,下面让我们来看一下在MFC DLL中如何使用对话框。

2.MFC DLL

在MFC DLL中使用对话框不像Win32 DLL中那么简单,主要是因为MFC程序中存在一个模块状态(Module State)的问题,也就是资源重复的问题。(此处的术语模块是指一个可执行程序,或指其操作不依赖于应用程序的其余部分但使用MFC运行库的共享副本的一个DLL(或一组DLL)。我们所创建的MFC DLL就是这种模块的一个典型实例。)

在每个模块(EXE或DLL)中,都存在一种全局的状态数据,MFC依靠这种全局的状态数据来区分不同的模块,以执行正确的操作。这种数据包括:Windows实例句柄(用于加载资源),指向应用程序当前的CWinApp和CWinThread对象的指针,OLE模块引用计数,以及维护Windows对象句柄与相应的MFC对象实例之间连接的各种映射等。但当应用程序使用多个模块时,每个模块的状态数据不是应用程序范围的。相反,每个模块具有自已的MFC状态数据的私有副本。这种全局的状态数据就叫做MFC模块状态。

模块的状态数据包含在结构中,并且总是可以通过指向该结构的指针使用。当代码在执行时进入了某一个模块时,只有此模块的状态为“当前”或“有效”状态时,MFC才能正确的区分此模块并执行正确的操作。

例如,MFC应用程序可以使用下面代码从资源文件中加载字符串:

CString str;

str.LoadString(IDS_MYSTRING);

使用这种代码非常方便,但它掩盖了这样一个事实:即此程序中IDS_MYSTRING可能不是唯一的标识符。一个程序可以加载多个DLL,某些DLL可能也用IDS_MYSTRING标识符定义了一个资源。MFC怎样知道应该加载哪个资源呢?MFC使用当前模块状态查找资源句柄。如果当前模块不是我们要使用的正确模块,那么就会产生不正确的调用或者错误。

按照MFC库的链接方法,一个MFC DLL有两种使用MFC库的方法:静态链接到MFC的DLL和动态链接到MFC的DLL。下面我们就按照这两种类型的MFC DLL来介绍如何切换当前模块状态以正确的在MFC DLL中使用资源。

上一页  1 2 3 4 5  下一页

Tags:DLL 使用 资源

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接