在VC可以在可执行程序和调用动态静态库时动态的导出资源、DLL、exe。
首先把想要导出的资源导入,这里简单描述DLL资源导入的步骤:
1.在Resource View(资源视图)中查找到相应工程;
2.使用Add(添加)->Resource(资源);
3.选择Import(插入)资源;
4.在选择资源后弹出Custom ResourceType(自定义资源类型)输入自定义的类型名,至此资源插入完毕;
所需函数:
FindResource确定指定模块中指定类型和名称所在的位置
- HRSRC FindResource(HMODULE hModule,
- LPCTSTR lpName,
- LPCTSTR lpType)
hModule处理包含资源的可执行文件的模块,NULL值指定了模块句柄指向操作系统通常情况下创建最近过程的相关文件;
lpName指定资源名称;
lpType指定资源的类型,就是上面所自定义资源类型;
SizeofResource返回指定资源字节数大小
- DWORD SizeofResource(HMODULE hModule,
- HRSRC hReslnfo)
hModule包含资源的可执行文件的句柄,如果为空当前文件(我是这么理解的);
hReslnfo资源句柄,句柄必须使用FindResource函数创建;
如果返回0则失败,通过DWORD的寻址范围可看出文件的最大大小;
LoadResource该函数装载指定资源到全局储存器
- HGLOBAL LoadResource(HMODULE hModule,
- HRSRC hReslnfo)
参数同上
如果运行成功返回相关资源的句柄,如果运行失败返回NULL
LockResource锁定内存中的指定资源;
- LPVOID LockResource(HGLOBAL hResData)
失败返回NULL,成功返回资源指针,可以重IO输出成文件
释放相关资源函数:
CloseHandle ()
FreeResource ()
代码如下:
- HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_DLL1), TEXT("DLL"));
- if (NULL == hRsrc){
- return;}
- DWORD dwSize = SizeofResource(NULL, hRsrc);
- if (0 == dwSize){
- return;}
- HGLOBAL gl = LoadResource(NULL, hRsrc);
- if (NULL == gl){
- return;}
- LPVOID lp = LockResource(gl);
- if (NULL == lp){
- return;}
- CString filename="dd.dll";
- HANDLE fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
- DWORD a;
- if (!WriteFile (fp,lp,dwSize,&a,NULL)){
- return;}
- CloseHandle (fp);
- FreeResource (gl);