[转贴]在DLL中使用资源(推荐)[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 djhdu 的 blog

在dll中使用资源
    现在最常看见的关于dll的问题就是如何在dll中使用对话框,这是一个很普遍的关于如何在dll中使用资源的问题。这里我们从win32 dll和mfc dll两个方面来分析并解决这个问题。

1.win32 dll 

    在win32 dll中使用对话框很简单,你只需要在你的dll中添加对话框资源,而且可以在对话框上面设置你所需要的控件。然后使用dialogbox或者createdialog这两个函数(或相同作用的其它函数)来创建对话框,并定义你自己的对话框回调函数处理对话框收到的消息。下面通过一个具体实例来学习如何在win32 dll中使用对话框,可以按照以下步骤来完成这个例子:

1)在vc菜单中file->new新建一个命名为usedlg的win32 dynamic-link library工程,下一步选择a simple dll project。

2)在vc菜单中insert->resource添加一个id为idd_dlg_show的dialog资源,将此dialog上的cancel按钮去掉,仅保留ok按钮。再添加一个id为idd_aboutbox的对话框,其caption为about。保存此资源,将资源文件命名为usedlg.rc。并将resource.h和usedlg.rc加入到工程里面。

3)在usedlg.app中包含resource.h,并添加如下代码:

hinstance hinst = null;
hwnd hwnddlg = null;

bool callback dlgproc(hwnd hdlg, uint message,
wparam wparam, lparam lparam);

bool callback aboutproc(hwnd hdlg, uint message,
wparam wparam, lparam lparam);

extern "c" __declspec(dllexport) void showdlg();

bool apientry dllmain( handle hmodule, 
            dword ul_reason_for_call, 
            lpvoid lpreserved 
                  )

    switch(ul_reason_for_call) 
    { 
    case dll_process_attach: 
       hinst = (hinstance)hmodule; 
    case dll_process_detach: 
       break; 
    } 
  return true;
}

extern "c" __declspec(dllexport) void showdlg()

    hwnddlg = createdialog(hinst,makeintresource(idd_dlg_show),
null,(dlgproc)dlgproc); 
    showwindow(hwnddlg, sw_show);
}

bool callback dlgproc(hwnd hdlg, uint message,
wparam wparam, lparam lparam)

  switch(message) 
  { 
    case wm_initdialog: 
       return true; 
    case wm_command: 
       if(loword(wparam)==idok)
          dialogbox(hinst,makeintresource(idd_aboutbox),
hdlg,(dlgproc)aboutproc); 
       return true;  
    case wm_close: 
       destroywindow(hdlg); 
       hwnddlg = null; 
       return true; 
  } 
  return false;
}


bool callback aboutproc(hwnd hdlg, uint message,
wparam wparam, lparam lparam)

    switch(message) 
  { 
       case wm_close: 
           enddialog(hdlg,null); 
           hwnddlg = null; 
           return true; 
  } 
  return false;
}

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就是这种模块的一个典型实例。) 

本文关键:[转贴]在DLL中使用资源(推荐)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top