我已經遍佈這一塊,而且我只是陷入了沉澱。我一直在構建一個項目,我想將一個文本文件作爲資源嵌入到可執行文件中。我理解這個「應該」如何工作的所有基本知識,但由於某種原因,這不是。所以,讓我從我迄今爲止的事情開始,也許問題可以被固定下來。即使數據在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);
}
確定文本文件保存在RCDATA(類型10)資源樹?我記得VS在將文件嵌入爲「RCDATA」而不是RCDATA時遇到了麻煩。 – pezcode 2012-03-10 13:26:18
您可以使用資源黑客來查找可執行文件中的資源,而不是在文本編輯器中打開它們。 – 2017-04-25 08:13:29