1

カスタム バイナリ データを Windows 実行可能ファイルに埋め込む際に問題があります。問題は、リソースのリンクまたは取得にもある可能性がありますが、わかりません。とにかく、FindResource は NULL を返し、エラー コードは 1814です。

私が見つけたすべての例には、リソースを作成し、実行可能ファイルをビルド/作成するために、何らかの IDE を使用することが含まれています。makefileでnmakeを呼び出して、自動的に実行する必要があります。

デフォルトのディレクトリにインストールされているMS Visual Studio / C++の個人版を使用して、64ビットWindows 7で実行しています。

これが私がまとめたセットアップです(同じディレクトリ内のすべてのファイル。nmakeもこのディレクトリから呼び出されます):

  1. ファイル:次の内容の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. nmake の前に呼び出しているファイル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 ) を参照してください。

4

1 に答える 1