好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 小小的石头13 于 2022-12-26 14:29 编辑
最近学习到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
增添一种方式:
这种方式相比于上面的方式, 简单在于不用将资源文件的内存复制一份, 而是直接将资源文件的内容写入到文件中, 降低了错误率, 也更加方便, 推荐使用这种方法:
[C++] 纯文本查看 复制代码 bool ReleaseFile(char* FileName, DWORD ResId, char* ResType) {
DWORD Mode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
HANDLE hFile = CreateFileA(FileName, GENERIC_WRITE, Mode, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return false;
}
HRSRC hrsc = FindResourceA(NULL, MAKEINTRESOURCE(ResId), ResType);
if (!hrsc) {
return false;
}
HGLOBAL hg = LoadResource(NULL, hrsc);
if (!hg) {
return false;
}
DWORD dwSize = SizeofResource(NULL, hrsc);
if (dwSize <= 0) {
return false;
}
DWORD dwWrite = 0;
WriteFile(hFile, hg, dwSize, &dwWrite, NULL);
CloseHandle(hFile);
return dwWrite == dwSize;
} |
免费评分
-
参与人数 3 | 吾爱币 +9 |
热心值 +3 |
收起
理由
|
朕来打江山
| + 1 |
+ 1 |
我很赞同! |
苏紫方璇
| + 7 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
笙若
| + 1 |
+ 1 |
谢谢@Thanks! |
查看全部评分
|