2012-03-10 8 views
2

私はこのすべての上にあり、ちょうど窮地に立たされています。私はプロジェクトを構築しており、テキストファイルをリソースとして実行可能ファイルに埋め込みたいと考えています。私はこれが "うまくいかなければならない"という基本的なことをすべて理解していますが、何らかの理由でそうではありません。だから、私がこれまでにしてきたものから始めましょう。おそらく、問題は固定されているかもしれません。データがexeになっていても、FindResource()がデータを見つけることができません

ここでは2つの機能があります。最初はEnumResNameProcが問題をデバッグしようとしていましたが、2番目のLoadFileInResourceは機能しようとしています。 問題が起き始めたら、ビルドの途中だったのでちょっと厄介です。

正確な問題は、FindResourceExAがNULLを返していて、正確な理由がわかりません。私はそれがエラーであることを知り、戻りコードは1813、 "リソースが見つかりません"です。

私はこのプロジェクトには他のリソースがありますが、私はバージョンノード、メインノードノードを持っています(そのうちの私は直接読んでいません)アイコンノードを持っています(私のウィンドウシステムメニューアイコンに適用しています)。ビットマップ(テクスチャとしてロードしています)。これらはすべて定義済みの型を持っています。例えば、ビットマップの型は12です。今、私はテキストファイルを読み込もうとしています。ユーザー定義の型は10です。データは実行可能ファイルの中にあります。私はテキストエディタでそれを開きます...(はい、私はそれを試しました)それが存在するので、それが含まれています。

最初の機能は、データを探すためにすべてのファイルリソースを処理しようとする試みでした。タイプ2,3,14,16,24が見つかりましたが、10は見つかりませんでした。私は、これらの他のタイプを上記のリソースとして排除しました。 (ビットマップ= 2)、(アイコン= 3)、(RT_ICON(3)+ RT_ICON_GROUP(11)= 14)(バージョン= 16)、(マニフェスト= 24)。ユーザー定義はタイプ10であり、見つからなかった。

マイResources.rcファイルには以下が含まれます。

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
IDR_textfile1  textfile  ".\\Data\\World.txt" 

これは、ロードするファイルを定義します(再び、私はこの作品を知って、私は実行可能ファイルにコードのテキストを見ることができます。)

マイresources.hファイルには、次のように定義しています建て、

#define IDR_textfile1       102 

だから、それが定義されている、含まれており、他のすべてのリソースの作業、およびまだ、FindResourceExAはこの上のNULLを返します。すべてのインクルードファイルが並んでいます(そうでない場合は警告とエラーが表示されます)。

FindResourceExAを正しく呼びますか?それは次のように定義されますだけでなく、私がnull、HINSTANCEのために試してみました

WINBASEAPI HRSRC WINAPI FindResourceExA(HINSTANCE,LPCSTR,LPCSTR,WORD); 

、hInstanceはさえGetModuleHandleAの結果、無サイコロ、WinMain関数の私のWindowsであることを渡されました。

リソースIDであるLPCSTRの場合は、MAKEINTRESOURCE(IDR_textfile1)と表示されているものを試してみましたが、ID番号もこの場合は102でハードコーディングしています。 タイプには、私はMicrosoftによると正しい値は10でなければならない他のバリエーションを疲れさせています。その理由は、EnumResNameProcを作成し、0から500までの他のIDが存在するのを見てみるためです。上の、オフチャンスで何かが面白いと定義されていた。ダイスはありません。

私はFindResourceExA FindResourceA(「Ex」ありとなし)の両方を試しました ダイスなし。

私はそれがあることを知っています。私はこの機能についてもっと気にしていますが、それは見つからないでしょう。

私は開発環境として、MinGW + Eclipse + CDTを使用しています。また、GCCツールのwinresを使用してリソースオブジェクトファイルを構築しています。私はバイナリタイプで面白いことをしているかどうかを調べるためにwinresのバグを探しました。 (テキストファイルを読み込んでいても、未定義とみなされます)。テキストのバイナリ形式が重要な場合に備えて、ANSI、UTF-8、およびUNICODEとしてファイルを再保存しようとしました。

私は迷っています。他に何を試していいのか分かりません。私はデータがそこにあることを知っている、私はちょうどそれがそれにアクセスしない理由はありません。 Windows API呼び出しでデータが表示されないか、データが不正にエンコードされるため、データにアクセスできません。

他に何を試すことができますか?

BOOL CALLBACK EnumResNameProc (
    HMODULE hModule, 
    LPCTSTR lpszType, 
    LPTSTR lpszName, 
    LONG_PTR lParam) 
{ 
    std::cerr << "WTF INFO BEGIN here! \n"; 
    // std::string info = lpszName; 
    int a = lParam; 
    std::cerr << "We found something: " << a << std::endl; 
    MessageBoxA (NULL, lpszName, (LPCSTR) "Found: ", MB_OK); 
    std::cerr << "WTF INFO END here! \n"; 
    return true; 
} 

void LoadFileInResource(HINSTANCE hInstance, 
         int name, 
         int type, 
         DWORD size, 
         const char* data) 
{ 
    // HMODULE handle = GetModuleHandleA(NULL); 

    for (int a = 0;a<500;a++) { 
    EnumResourceNamesA(hInstance, MAKEINTRESOURCE(a), 
         (ENUMRESNAMEPROCA) & EnumResNameProc, (LONG_PTR) a); 
    } 

    HRSRC rc = FindResourceExA(hInstance, 
           MAKEINTRESOURCE(IDR_textfile1), 
           MAKEINTRESOURCE(10), 
           MAKELANGID(LANG_NEUTRAL, 
           SUBLANG_NEUTRAL)); 
    if (rc == NULL) { 
     DWORD fup = GetLastError(); 
     MessageBoxA (NULL, (LPCSTR) "Crap not loaded.", (LPCSTR) "Error", MB_OK); 
     std::cerr << "Crap not loaded, ERR: " << fup << std::endl; 
    } 

    // MessageBoxA (NULL, (LPCSTR) " Test ", (LPCSTR) "Found: ", MB_OK); 
    HGLOBAL rcData = LoadResource(hInstance, rc); 
    // data = static_cast<const char*>(LockResource(rcData)); 
    data = (const char*) LockResource(rcData); 
    size = SizeofResource(hInstance, rc); 
    std::cout << "Res size = " << (long) size << std::endl; 
    std::cout << "data =" << data << :: std::endl; 
    // wsprintf(szMsg,"Values loaded : %d, %d, %d\nSize = %d", 
    // pmem->Value1,pmem->Value2,pmem->Value3); 
    // MessageBox(hWnd, szMsg,lpszAppName,MB_OK); 
} 
+1

あなたはテキストファイルがRCDATA(タイプ10)リソースツリーに保存されますか? RCDATAの代わりにVS埋め込みファイルに「RCDATA」として問題があることを覚えています。 – pezcode

+0

テキストエディタでリソースハッカーを開くのではなく、リソースハッカーを使用して実行可能ファイル内のリソースを見つけることができます。 –

答えて

5
IDR_textfile1  textfile  ".\\Data\\World.txt" 

あなたは、 "テキストファイル" としてリソースタイプを宣言しました。どちらがうまいですか。それは数字ではなく文字列です。したがって、リソースタイプにMAKEINTRESOURCE()を使用すると、それを見つけるのに役立たないので、EnumResourceNamesはそれを見つけられません。修正:

IDR_textfile1  RC_DATA  ".\\Data\\World.txt" 

そして

HRSRC rc = FindResourceEx(hInstance, 
          MAKEINTRESOURCE(RC_DATA), 
          MAKEINTRESOURCE(IDR_textfile1), 
          MAKELANGID(LANG_NEUTRAL, 
          SUBLANG_NEUTRAL)); 

か、あなたのオリジナルのアプローチを使用する場合:

HRSRC rc = FindResourceEx(hInstance, 
          L"textfile", 
          MAKEINTRESOURCE(IDR_textfile1), 
          MAKELANGID(LANG_NEUTRAL, 
          SUBLANG_NEUTRAL)); 
3

FindResourceExAへのコールは、リソースタイプが第2番目のパラメータとIDに渡され、間違っています。

FindResourceEx at MSDN

+2

ハハハイ。どのような天才がそのアイデアを思いついたのか疑問に思います。 「この1つのパラメータを最後に追加して... ...これらの2つをここに切り替えてください、私はその見た目が気に入らない」 – pezcode

+0

ダーン!これは私の日を救った!ありがとう! :) –

関連する問題