写入文件写入不正确
WriteFile writes incorrectly
我正在尝试将文件从资源复制到%localappdata%。我有这样的东西:
HINSTANCE hInstance = GetModuleHandle(NULL);
HANDLE hFile = INVALID_HANDLE_VALUE;
HRSRC hrsrc = FindResource(hInstance, MAKEINTRESOURCE(MSIE), RT_RCDATA);
HGLOBAL exeRes = LoadResource(hInstance, hrsrc);
DWORD size = SizeofResource(hInstance, hrsrc);
TCHAR szPath[MAX_PATH];
HANDLE hfile;
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, szPath))) {
PathAppend(szPath, TEXT("test.exe"));
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
LPVOID exePtr = LockResource(hrsrc);
DWORD exeWritten = 0;
BOOL writeResult = WriteFile(hFile, exePtr, size, &exeWritten, NULL);
cout << GetLastError() << endl;
BOOL closed = CloseHandle(hFile);
system("PAUSE");
return 0;
我能够找到HRSRC并使用SizeofResource()确认大小。CreateFile 实际上是创建文件并返回句柄。GetLastError() 报告没有错误。写入磁盘的字节数完全正确。
但是,输出 exe 已损坏(此文件的版本与 Windows 的版本不兼容...等等) - 它失去了它的图标和一切。在十六进制编辑器中并排查看原始文件和输出文件,似乎文件开头有随机数据。
我在这里错过了什么?
您的LockResource
不正确。它应该传递您之前加载的 HGLOBAL exeRes
。
LockResource(hrsrc);
应该是
LockResource(exeRes);
来自 LockResource() 上的 MS 文档:
不要尝试使用 FindResource 或 FindResourceEx 函数返回的句柄锁定资源。这样的句柄指向随机数据。
作为旁注,您可能想尝试在完成加载和锁定的资源时
相关文章:
- C++ 读取文件读取文件不正确
- 如何让我的代码显示文件名不正确或文件中数字的平均值?
- 使用 AWS c++ 接口将文件上传到 s3 时内容类型标签不正确
- 使用 c++ 时从二进制文件中读取 int 不正确
- 结构C++ – 从文件中读取不正确
- 为什么我的getline不正确读取.csv文件
- 逐行从文件读取到矢量对于<T>二进制数据C++不正确
- freopen和fwprintf将不正确的宽字符写入TXT文件
- 从堆栈中读取字符后,如何修复不正确的文件输出
- C :不正确的文件大小计算Winapi
- Mingw.thread.h标头文件安装不正确
- #import生成不正确的TLH文件
- #line 指令的 nul.h 文件名的文件路径不正确
- C cstdiofile :: Writestring给出了不正确的文件输出
- 在C++中搜索二进制文件分隔符时出现不正确的偏移量
- 使用C++(基于C#程序)保存wav文件时,音频数据不正确
- C++循环算法不正确(或文件处理问题)
- 读取PPM文件并使用Opengl和c++进行显示.颜色不正确
- 写入和读取 bin 文件数据不正确
- 将 IWICBtmap 写入文件 - 解析不正确