VC中将bmp作为资源文件写入EXE或DLL,然后内部调用(转)

(Win32 DLL 工程,或者其他Console或MFC工程等)

1。在VC编译器中,选择Insert --》Resource,选中Bitmap--》Import,将文件类型修改为所有类型。

---》找到bmp文件,并载入,此时产生一个IDB_BITMAP1资源句柄。

2。载入后,先别急,保存一次,则会产生这个bmp文件对应的rc资源文件。

3。这个时候,如果不是MFC工程,则需要在调用LoadImage或LoadBitmap函数的.CPP文件中,先包含一句:#include "resource.h"

如此,则之前产生的IDB_BITMAP1资源句柄可以被使用了,如果没有包含这个头文件,则很多时候会提示,这个句柄是无效的,无法找到。

4.而后应当将该.rc资源文件,也用文件的方式追加进工程。

5.在调用LoadImage或LoadBitmap函数时,我们很多时候习惯于从外界动态调入一个文件,比如将第二个参数设定为"test.bmp"文件,所以,我们对于第一个参数hInstance,常常是传入一个NULL,根本不去理会,

但对于一个已经载入DLL或EXE文件的位图资源而言,这个时候,是必须传入的。

那么DLL文件的该句柄从何而来呢?

这个就需要谈到DllMain函数了。

正如Console程序对应有main,win32 对应有Winmain函数作为入口函数一样,这个函数是DLL可以使用的入口函数。

当然,如果编DLL时不需要响应一些特殊的消息,比如DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH之类的,不定义也无所谓。

提到这个函数,主要的目标是说一说它的形参表:

BOOL WINAPI DllMain(HINSTANCE hInstDll,DWORD fdwReason,PVOID fImpLoad);

第一个形参,是由操作系统传入的指向该DLL模块所得基地址的指针,就是我们所需要的实例句柄

那么,这个时候就只要将之保存为一个全局变量,我们就可以在调用LoadBitmap等函数时,直接传入。

OK,说完在DLL中调用,就说一说EXE文件中。

这个其实是类似的,主要的问题,还是这个HINSTANCE实例句柄如何获得。

如果是MFC程序,那么好办,调用AfxGetApp()->m_hInstance,就可以直接获得了。

如果是Win32程序呢?

那么其实也可以使用这个函数:HINSTANCE GetModuleHandle(LPCTSTR lpModuleName)

实现:HINSTANCE hInstance =GetModuleHandle(NULL);

就可以获得当前进程的载入基地址。

当然,如果大家没有传入这个实例句柄的话,则读取位图是会失败的(没有提供查找范围)。而后,调用GetLastError,返回的错误一般是1814或者1812,指的是无法在提供的资源段找到这个位图资源,或者无法找到这个位图资源名称。

posted on 2012-03-13 17:49  carekee  阅读(2086)  评论(0编辑  收藏  举报