最近学习到dll这方面, 发现一个不方便的问题, 就是发给朋友还得把exe和dll都发过去, 如果朋友操作不当会引发各种各样的问题
为了解决这个问题, 我就学习了一下资源的释放, 运用工具是vs2022
在此记录一下学习成果,这是一个释放dll文件的例子, 还请大家多指正:
[C++] 纯文本查看 复制代码 #include <windows.h>
#include "resource.h"
#include <iostream>
using namespace std;
bool CreateMyFile(char * strFilePath, HGLOBAL lpBuffer, DWORD dwSize) {
DWORD dwWritten;
// 在指定目录创建文件
HANDLE hFile = CreateFileA(strFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile) {
// 在刚才创建的文件中写入读取到内存中的资源文件
WriteFile(hFile, (LPCVOID)lpBuffer, dwSize, &dwWritten, NULL);
}
else {
return false;
}
CloseHandle(hFile);
return true;
}
bool CreateEXE(char* strFilePath, int nResourceID, char* strResourceName) {
// 查找资源文件返回此资源文件的句柄
HRSRC hResInfo = FindResourceA(NULL, (LPCSTR)MAKEINTRESOURCE(nResourceID), strResourceName);
if (!hResInfo) {
return false;
}
// 获取资源文件的大小
DWORD dwSize = SizeofResource(NULL, hResInfo);
// 获取指向资源的指针的句柄
HGLOBAL hResData = LoadResource(NULL, hResInfo);
if (!hResData) {
return false;
}
// 在堆内存中申请一块dwSize大小的内存空间
HGLOBAL p = GlobalAlloc(GPTR, dwSize);
if (!p) {
return false;
}
// LockResource函数用于获取指向hResData的指针
// 将获取到的指向资源的指针的dwSize大小的内容复制到p指针指向的内存空间
memcpy(p, LockResource(hResInfo), dwSize);
// 调用自定义函数, 将p指针指向的空间的内容写入到strFilePath路径中
bool bRet = CreateMyFile(strFilePath, p, dwSize);
if (!bRet) {
GlobalFree(p);
return false;
}
GlobalFree(p);
return true;
}
int main() {
char wpath[] = "F:\\mydll.dll";
char wname[] = "dll";
CreateEXE(wpath, IDR_DLL1, wname);
return 0;
}
resource.h头文件:
[C] 纯文本查看 复制代码 #define IDR_DLL1 101
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
|