找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 文档 工具 设计
查看: 71|回复: 0

DLL资源的释放

[复制链接]

1万

主题

919

回帖

2万

积分

超级版主

教育辅助界扛把子

附加身份标识
精华
1
热心
2
听众
1
威望
57
贡献
11985
违规
0
书币
5678
注册时间
2020-4-8

论坛元老灌水之王

发表于 2022-12-26 01:15 | 显示全部楼层 |阅读模式
最近学习到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


Great works are not done by strength, but by persistence! 历尽艰辛的飞升者,成了围剿孙悟空的十万天兵之一。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@cdsy.xyz

QQ|Archiver|手机版|小黑屋|城东书院 ( 湘ICP备19021508号-1|湘公网安备 43102202000103号 )

GMT+8, 2024-4-28 06:00 , Processed in 0.061845 second(s), 27 queries .

Powered by Discuz! CDSY.XYZ

Copyright © 2019-2023, Tencent Cloud.

快速回复 返回顶部 返回列表