2013-05-22 96 views
1

我在將自定義二進制數據嵌入Windows可執行文件時遇到問題。這個問題也可能是連接資源或檢索它,我不知道。無論如何,FindResource返回NULL,錯誤代碼是1814Windows,FindResource錯誤1814

我發現的所有示例都包括使用某種或另一種IDE來創建資源並構建/製作可執行文件。我需要它自動通過致電nmakemakefile

我使用的是安裝在默認目錄(S)MS Visual Studio中/ C++的個人版做它64位Windows 7

這是我放在一起設置(在同一目錄下的所有文件; NMAKE也是從這個目錄叫):

  1. 文件:與follofing內容custom.data.txt

    My own personal custom data. 
    

    請注意,我只爲本示例使用文本資源。實際上,我將使用非特定格式的自定義數據。

  2. 文件:custom.h具有以下內容:

    #define IDR_RCDATA1 101 
    
  3. 文件:custom.rc具有以下內容:

    IDR_RCDATA1 RCDATA "custom.data.txt" 
    

    編輯:如果的#include 「custom.h」被添加到custom.rc,該示例按預期工作:

    #include "custom.h" 
    IDR_RCDATA1 RCDATA "custom.data.txt" 
    
  4. 文件: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; 
    } 
    
  5. 文件的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 
    
  6. 文件的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),它解決了這個問題。

+0

您在'custom.rc'文件中包含了「#include」custom.h「'嗎? –

+0

不,我沒有。在我發現的所有例子中,包含不在那裏。另外,資源編譯器在生成.res文件時沒有抱怨。 – user2408539

+1

那麼你需要它,否則它不會知道'IDR_RCDATA1是101,然後'FindResource'將會失敗(就像它那樣)。如果你做了''#include'它會怎麼樣? –

回答