我在将自定义二进制数据嵌入 Windows 可执行文件时遇到问题。问题也可能与链接资源或检索它有关,我不知道。无论如何FindResource 返回 NULL 并且错误代码是 1814。
我发现的所有示例都包括使用某种 IDE 来创建资源和构建/制作可执行文件。我需要通过在makefile上调用nmake来自动完成它。
我正在使用安装在默认目录中的个人版MS Visual Studio / C++在64 位 Windows 7上执行此操作。
这是我放在一起的设置(同一目录中的所有文件;nmake 也从该目录调用):
文件:custom.data.txt,内容如下:
My own personal custom data.
请注意,我仅在此示例中使用文本资源。实际上,我将使用没有特定格式的自定义数据。
文件:custom.h,内容如下:
#define IDR_RCDATA1 101
文件:custom.rc,内容如下:
IDR_RCDATA1 RCDATA "custom.data.txt"
编辑:如果将#include "custom.h" 添加到custom.rc,则示例按预期工作:
#include "custom.h" IDR_RCDATA1 RCDATA "custom.data.txt"
文件:example.cpp,内容如下:
#include "custom.h" #include <windows.h> #include <fstream> #include <iostream> using namespace std; int main(int argc, char* argv[]) { HRSRC myResource = FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); if(myResource == NULL) { DWORD WINAPI errorCode = GetLastError(); cout << "Could not find resource! Error code: " << errorCode << "." << endl; return 0; } unsigned int myResourceSize = SizeofResource(NULL, myResource); cout << "Resource size: " << myResourceSize << endl; if(myResourceSize > 0) { HGLOBAL myResourceData = LoadResource(NULL, myResource); void* pMyBinaryData = LockResource(myResourceData); std::ofstream f("C:\\Users\\draver\\win_custom_resource\\extracted_resource.txt", std::ios::out | std::ios::binary); f.write((char*)pMyBinaryData, myResourceSize); f.close(); BOOL bResult = UnlockResource(myResource); bResult = FreeResource(myResource); } return 0; }
文件makefile包含以下内容:
NAME = example CC = "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cl.exe" RC = "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\RC.exe" RESOURCE_NAME = custom all : link link : compile $(CC) $(NAME).obj $(RESOURCE_NAME).res compile : resource $(CC) -c $(NAME).cpp /EHsc resource : $(RC) $(RESOURCE_NAME).rc clean : del *.obj del *.exe del *.res del extracted_resource.txt
我在 nmaking 之前调用的文件setup.bat ,内容如下:
call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
生成的可执行文件 (example.exe) 包含“我自己的个人自定义数据”。字符串(通过转储验证)如预期的那样,但在运行时无法检索它。
输出是
Could not find resource! Error code: 1814.
我究竟做错了什么?
编辑:见上面的编辑(3.文件:custom.rc)解决了这个问题。