您的位置:首页 > 编程语言

Windows DLL中调用资源碰到的问题

2010-12-22 13:08 323 查看

Windows DLL中调用资源碰到的问题

作者:Kagula
日期:2010-11-25

概要

使用C语言编写Windows
DLL。在DLL中调用资源碰到的相关问题及解决。
需要特别注意的关键词下面已经用红色标出来了。
这里的开发环境是Visual Studio
2008 + SP1 + Windows XP3

正文

DLL里存放的是函数的集合,在DLL函数里想要取得资源首先必需获得DLL的实例。
[Step1]经测试用GetModuleHandle(NULL)是不能得到当前DLL实例的,所以得在DLL中添加DllMain函数,源码如下:
//HINSTANCE      
hInst=NULL;
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;
}
取得hInst文件后就可以用FindResource函数取得已经链接到动态库的资源。如果你在DLL中要实现的功能不需要DLL实例句柄,也可以不定义DllMain函数。在DLL装载的时候,如果有DllMain函数,则它自动会被调用,如果没有也不影响对DLL文件中其它函数的调用。
[Step2]手动编译资源文件(如果是使用VisualStudio2008自动生成makefile文件不需要这一步)
在makefile文件的object
dependencies中添加如下两行代码
MyResFile.res:  $(ABSOLUTE_PATH)/text/resource/ MyResFile.rc
     rc
/d "_UNICODE" /d "UNICODE" /fo $( ABSOLUTE_PATH)/text/resource/MyResFile.rc
注意rc命令前得有个Tab符号,这两行代码将把MyResFile.rc资源源代码文件,编译成MyResFile.res资源文件二进制文件,产生的res文件的位置会和源文件在同一个目录中。
[Step3]手动链接资源文件(如果是使用VisualStudio2008自动生成makefile文件不需要这一步)
找到OBJS变量(或许在你的工程中它不叫这个名字),这个变量存放的是建立待链接文件列表,最后OBJS变量会传递给link命令,作为link命令的输入参数,把链接清单中的文件链接成一个文件。参考下面这一行OBJS变量的定义
OBJS=a.obj b.obj c.obj MyResFile.res
[Step4]检查资源文件有没有被链接到DLL中去。[启动Visual
Studio2008]->[Ctrl+O]打开DLL文件,如果资源文件已经集成到DLL文件,你现在就应该能看到。

后言

  
Windows下的Visual Studio 2008 C编程工具很多命令同Linux下的编程工具,比如cl对应gcc、nmake对应make。各种计算机程序语言之间的语法和语义大多能直接做映射,大道理差不多,看一个人应用某种编程语言的能力,关键还在于对某种编程语言细节的了解程度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息