我在将自定义二进制数据嵌入Windows可执行文件时遇到问题。问题也可能是链接资源或检索它,我不知道。无论如何, FindResource返回NULL并且错误代码是1814 。
我发现的所有示例都包括使用某种或那种IDE,用于创建资源和构建/制作可执行文件。我需要通过在 makefile 上调用 nmake 来自动。
我在 64位Windows 7 上使用安装在默认目录中的 MS Visual Studio / C ++ 个人版进行此操作。
这是我放在一起的设置(所有文件在同一目录中; 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 ),以解决问题。
答案 0 :(得分:0)
(在评论中回答。见Question with no answers, but issue solved in the comments (or extended in chat))
@Roger Rowland写道:
你的custom.rc文件中有
#include "custom.h"
吗?嗯,你需要它,否则,它不会知道
IDR_RCDATA1
是101
,然后FindResource
会失败(就像它一样)。如果你做#include
会怎么样?