Windows DLL中调用资源碰到的问题
2010-12-22 13:08
323 查看
Windows DLL中调用资源碰到的问题
作者:Kagula日期:2010-11-25
概要
使用C语言编写WindowsDLL。在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。各种计算机程序语言之间的语法和语义大多能直接做映射,大道理差不多,看一个人应用某种编程语言的能力,关键还在于对某种编程语言细节的了解程度。
相关文章推荐
- 关于使用WindowsUpdate 或 Windows 自动升级时碰到的 svchost.exe 进程 CPU 资源占用过高的问题的相关信息
- 关于Linux调用Windows dll问题的讨论
- Windows上使用JNA调用自己编写的DLL问题
- 【caffe-Windows】windows下libcaffe调用过程中碰到的问题梳理;
- windows下的动态链接问题(.dll文件的编写与调用)
- [转]小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll
- Delphi中的DLL封装和调用对象编写碰到的问题
- win32 DLL中创建的的对话框资源被应用程序调用无法识别的问题
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- 关于Linux调用Windows dll问题的讨论
- 小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll
- [转]小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll
- Atl COM Dll工程中调用dll中资源的问题
- DLL 调用约定问题
- 关于DllRegisterServer的调用失败的问题解决办法 错误代码0x80040201
- c# 调用c/c++ dll 参数问题
- Windows平台Go调用DLL的坑
- C#调用C++Dll封装时遇到的一系列问题
- 【Windows】当程序调用dll时,获取dll路径
- 俄语UI资源的VC程序在英文版windows XP/windows 7俄语环境下乱码问题