用VC编写纯资源DLL的方法

发布时间:2016年11月6日 作者:未知 查看次数:1171


用VC编写纯资源DLL的方法

http://www.cnblogs.com/hb_cattle/articles/1663059.html

纯资源 DLL 是仅包含资源(如图标、位图、字符串和对话框)的 DLL。使用纯资源 DLL 是在多个程序之间共享同一组资源的好方法。这种方法也经常用来解决多国语言问题。下面就来介绍下在vs 2005 下如何使用纯资源Dll.

 

1、新建一个 MFC DLL 项目,设置为 创建规则Dll ,然后打开资源视图,添加一个字符串资源和一个图片资源。然后设置项目属性,

将 配置属性-链接器-高级下的 无入口点选项设为 是(/NOENTRY)  , 防止链接器将 _main 引用链接到 DLL 中;此选项是创建纯资源 DLL 所必需的。最后编译项目。

2、再建一个测试项目,把前面 编译的dll拷到项目目录(或将前面的项目添加为引用,这样每次修改了资源dll,不用拷贝)。

代码如下:

HMODULE hModule = LoadLibrary("ResourceDll.dll");

    if (hModule == NULL)

    {

        MessageBox("加载资源文件失败!");

        return true;

    }

    char buffer[255];

    memset(buffer,0,sizeof(buffer));

    LoadString(hModule,2000,buffer,sizeof(buffer));

    SetDlgItemText(IDC_STATIC,buffer);

    HBITMAP hBitmap = LoadBitmap(hModule,MAKEINTRESOURCE(2001));


    if (hBitmap == NULL)

    {

      MessageBox("加载图片资源失败!");

        return true;

    }

    ((CStatic*)GetDlgItem(IDC_STATIC_BITMAP))->SetBitmap(hBitmap);

    FreeLibrary(hModule);

========================================================

以上建立MFC DLL 项目~@~。


http://blog.sina.com.cn/s/blog_6646ef940100n2gi.html

动态链接库(Dynamic—LinkLibrary,简写为DLL)是包含了一系列类、函数、变量或其他资源的库文件。它不能单独运行,只能由可执行文件或其他DLL文件调用。在程序中使用DLL的优点是显著的:(1)节省磁盘和内存空间,提高程序执行效率。DLL可以被多个程序同时调用,我们可以把重复使用的功能模块做成DLL文件,对于多任务的windows操作系统来说这势必会节省磁盘空间和内存的开支。(3)便于多语言开发,模块化设计。DLL的编制与具体的编程和编译器无关,不同语言编定的程序可以共享一个DLL程序,因而,在编写比较复杂的软件时,可由不同的程序员在不同的编程环境下分模块实现。纯资源DLL就是只包含资源的DLL,其资源可以是字符串、数组、图标、位图、声音、视频或对话框等。二、用DLL实现程序的不同语言界面。如今,许多软件都支持不同语言的界面,比如:简体中文与繁体中文,简体中文与英文等。如果针对不同语言界面各写一套应用程序,这显然是不现实的。利用纯资源的DLL来实现此功能不失为一种简便有效的方法。

下面以在VisHalc++中编写支持简体中文与英文界面的程序为例,讲述其实现过程。

(一)纯资源DLL文件的实现

首先,按照简体中文界面完成程序的编写。然后用向导中的win32 Dynamic-Link Library建立一个空的DLL工程(取名为ChnRsc:)。将所完成的程序的所有资源(包括.rc、.rc2、.ico、.bmpResource.h等文件)从程序框架中删除,并将其复制到DLL工程的目录下,进而添加到DLL工程的程序框架中。接下来,对DLL工程作如下设置:从Project菜单中选settings,选择Link选项,在Project Optioils文本框中加入/noentry,或者编写一初始化的.cpp文件加入DLL工程中:
#include<windows.h>
extern“C”
BOOL,WINAPI DLLMain(HINSTANCE  hinstarlce,DWORD dwReason,LPVOID IpV0id)
{
    return TRUE;
}
最后,编译生成ChnRsc.d11。

按照同样的方法新建一空的DLL工程(取名为EngRsc:),并将所有资源加入到该工程。并将资源中所有简体中文翻译成英文后编译生成EngRsc:.dll。

(二)纯资源DLL文件的调用

将EngRsc:.d11和ChnRsc:.dn拷贝到应用程序目录或系统目录下。在主应用程序类中加入一受保护的HINsTANC[!类型的成员变量mhDL.L,用来保存加载的DLL的句柄。我们可以将用户选择的语言种类保存到注册表或一初始化文件中,程序启动时自动读取并加载相应的语言资源。在initinstance函数中用如下代码实现:
if(nLanguage==1)//使用简体中文
      m_hDlL=Loadlibrary(ChnRsc.d11):
else
       m_hDL.L=Loadlibrary(EngRsc.d11);
if(NULL==m_hDI L)
       return FAISE;
else
      AfxSetResourceHandle(m_Hdll);
    在应用程序退出时要释放加载的资源,所以在ExitInstilcemp下代码:
if(m_hDLL)             FreeLibrary(m_hDLL);
这样我们的应用程序就可以支持简体中文和英文两种语言界面了。


==================================

其实直接建win32 Dynamic-Link Library工程(VC6++),A simple DLL project,然后将不用的删除,加入自己使用的资源就好了。



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110