我在將自定義二進制數據嵌入Windows可執行文件時遇到問題。這個問題也可能是連接資源或檢索它,我不知道。無論如何,FindResource返回NULL,錯誤代碼是1814。Windows,FindResource錯誤1814
我發現的所有示例都包括使用某種或另一種IDE來創建資源並構建/製作可執行文件。我需要它自動通過致電nmake在makefile。
我使用的是安裝在默認目錄(S)MS Visual Studio中/ C++的個人版做它64位Windows 7。
這是我放在一起設置(在同一目錄下的所有文件; NMAKE也是從這個目錄叫):
文件:與follofing內容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
文件的setup.bat我就是調用nmaking之前,其內容如下:
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),它解決了這個問題。
您在'custom.rc'文件中包含了「#include」custom.h「'嗎? –
不,我沒有。在我發現的所有例子中,包含不在那裏。另外,資源編譯器在生成.res文件時沒有抱怨。 – user2408539
那麼你需要它,否則它不會知道'IDR_RCDATA1是101,然後'FindResource'將會失敗(就像它那樣)。如果你做了''#include'它會怎麼樣? –