上一节讲到如何使用lib静态库中的资源,这里顺便再提一下动态库中的资源。
动态库相对于静态库就要容易多了,静态库实际上相当于EXE自身的一部分,在编译完生成的文件中要完全融入EXE,而动态库有自己的结构,在最后生成可执行文件后,还是作为一个独立的个体存在。
所以,静态库的资源ID号与EXE中的ID资源号是不能重复的,否则会出问题;而动态库中的资源ID号则可以完全不用顾忌EXE中的ID号。
DLL中的资源控件用使用起来几乎和EXE的完全一致,唯一不同的是,你必须使用DLL库的HMODULE;这个HMODULE和EXE中的HINSTANCE其实是同一个等级的东西,例如,在DLL中调用DialogBox你必须这样,
HMODULE g_module = NULL;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: g_module = hModule; break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
break;
}
return TRUE;
}
这里,我们设置了一个全局变量g_module ,把这个动态库的HMODULE保存下来,然后,在动态库的程序中就可以这样使用了,
DialogBox(g_module, MAKEINTRESOURCE(IDD_DIALOG_OPERATION), NULL, SpaceVisionProc);
如果进一步,你需要在EXE的源码中调用DLL中的资源,那么,同样的道理,你必须使用DLL的handle。