2012-03-10 45 views
2

我已經遍佈這一塊,而且我只是陷入了沉澱。我一直在構建一個項目,我想將一個文本文件作爲資源嵌入到可執行文件中。我理解這個「應該」如何工作的所有基本知識,但由於某種原因,這不是。所以,讓我從我迄今爲止的事情開始,也許問題可以被固定下來。即使數據在exe中,FindResource()也無法找到數據

這裏有兩個函數,第一個,EnumResNameProc是一個嘗試調試我自己的問題,第二個,LoadFileInResource是我想要工作的函數。 這有點混亂,因爲當我開始有問題時,我正在建造它。

確切的問題是,FindResourceExA返回NULL,並且我失去了確切的原因。我知道這是一個錯誤,並且返回代碼是1813,「未找到資源」。我有一個版本節點,一個mainifest節點(其中,我不直接閱讀)我有一個圖標節點(我正在應用到我的窗口系統菜單圖標)和一個位圖(我作爲紋理加載)。這些都定義了類型,例如,位圖的類型是12.現在,我試圖加載一個文本文件,並且是一個'user defined'類型的10.我知道數據是INSIDE的可執行文件,因爲if我用文本編輯器打開它(是的,我試過了)它是存在的,所以它被包含在內。

第一個函數是試圖遍歷所有文件資源以嘗試定位數據。它發現類型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?它被定義爲:

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

好了,我已經嘗試了HINSTANCE,空的hInstance傳遞給我的窗戶在WinMain中,甚至GetModuleHandleA的結果,沒有骰子。

對於LPCSTR,它是資源ID,我嘗試了你所看到的MAKEINTRESOURCE(IDR_textfile1),並且我也嘗試了對ID號進行硬編碼,在這種情況下,沒有骰子。 對於這個類型,我已經厭倦了其他變體,根據微軟的正確值應該是10.這就是爲什麼我編寫了EnumResNameProc,試圖從0到500看看還有其他的ID是什麼,我回來的只是列出的那些上面,有一些事情被定義爲有趣的。沒有骰子。

我已經嘗試了FindResourceExA FindResourceA(有和沒有'Ex') 沒有骰子。

我知道它在那裏,我已經學會了更多,然後我關心這個功能,但它不會找到它,並且我在其他方面嘗試失敗。

至於開發環境,我使用MinGW + Eclipse + CDT,並使用GCC工具中的winres來構建資源對象文件。我已經在winres中查找錯誤,以查看它是否在二進制類型上做了一些有趣的事情。 (即使我正在加載一個文本文件,這也是未定義的東西)。哦,我還嘗試將文件重新保存爲ANSI,UTF-8和UNICODE以防文本的二進制格式重要。

我不知所措,我不知道還有什麼可以嘗試的。我知道數據在那裏,我只是不明白爲什麼它不會訪問它。 Windows API調用既不能看到數據,也不能以screwey的方式對數據進行編碼,因此它不能訪問它。

我還能試試嗎?

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)資源樹?我記得VS在將文件嵌入爲「RCDATA」而不是RCDATA時遇到了麻煩。 – pezcode 2012-03-10 13:26:18

+0

您可以使用資源黑客來查找可執行文件中的資源,而不是在文本編輯器中打開它們。 – 2017-04-25 08:13:29

回答

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是錯誤的,資源類型在第三個第二個參數和ID通過。

FindResourceEx at MSDN

+2

哈哈哈不錯。讓你想知道是什麼天才提出這個想法。 「讓我們在最後加上這一個參數......並......將這兩個開關切換到這裏,我不喜歡這樣看起來如何。」 – pezcode 2012-03-10 13:45:19

+0

該死!這節省了我的一天!謝謝! :) – 2015-12-03 18:33:40

相關問題