FindResource() ne parvient pas à trouver des données même si les données sont en exe

J'ai été partout dans celui-ci, et que je suis juste à l'aplomb coincé. J'ai été la construction d'un projet et je veux intégrer un fichier texte comme une ressource dans l'exécutable. Je comprends tous les éléments de base de la façon dont cela "devrait" travailler, mais pour quelque raison il ne l'est pas. Alors, permettez-moi de commencer par ce que j'ai jusqu'à présent et peut-être le problème, peut-être clouée au sol.

Il y a deux fonctions, la première, EnumResNameProc était une tentative pour déboguer le problème de mon auto, la deuxième, LoadFileInResource est la fonction que j'suis en train d'essayer de se mettre au travail.
C'est un peu bordélique parce que j'étais dans le milieu de la construction quand j'ai commencé à avoir des problèmes.

La cause exacte est, FindResourceExA est de retourner la valeur NULL, et je suis perdu quant à la raison exacte. Je sais que c'est une erreur, et le code de retour est de 1813, la "Ressource Non Trouvée".

J'ai d'autres ressources dans ce projet, j'ai une version nœud, un mainifest nœud, (dont je ne suis pas directement de la lecture), j'ai une icône nœud (que j'applique à ma fenêtre icône du menu système) et une image bitmap (que je suis le chargement de la texture.). Ils ont tous des types définis, par exemple, le type de l'image Bitmap est de 12. Maintenant, je tente de charger un fichier texte, avec un "défini par l'utilisateur" type de 10. Je sais que les données sont dans le fichier exécutable, parce que si je l'ouvre dans un éditeur de texte... (oui, j'ai essayé), il est présent, alors, il est inclus.

la première fonction était une tentative pour marcher à travers tout le fichier de ressources dans une tentative de trouver les données. Il a trouvé dans les types 2, 3, 14, 16 et 24., mais pas 10. J'ai déclaré que ces autres types comme mentionné ci-dessus de ressources. (bitmap=2), (icône=3), (RT_ICON(3)+RT_ICON_GROUP(11)=14) (version=16), (manifest=24). Défini par l'utilisateur doit être de type 10, et il n'a pas à le trouver.

Mes Ressources.fichier rc comprend les éléments suivants:

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

Ceci définit le fichier à charger, (encore une fois, je sais que cela fonctionne, je peux voir le texte de ce code DANS le fichier exécutable.)

Mes ressources.h fichier définit les éléments suivants:

#define IDR_textfile1                           102

Donc, il est défini, compris, intégré, et toutes les autres ressources de travail, et pourtant, FindResourceExA renvoie la valeur NULL. Tous les fichiers à inclure sont alignés, (j'aimerais obtenir des avertissements et des erreurs si il ne l'était pas.)

Donc la question est, suis-je appeler FindResourceExA correctement? il est défini comme:

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

bien, j'ai essayé de HINSTANCE, null, hInstance passé à mon Windows en WinMain, même GetModuleHandleA de résultats, pas de dés.

Pour LPCSTR, qui est l'ID de ressource, j'ai essayé ce que vous voyez, MAKEINTRESOURCE(IDR_textfile1), et j'ai essayé dur de codage du numéro d'identification ainsi, dans ce cas, 102. Pas de dés.
Pour le type, j'en ai marre d'autres variations, la valeur correcte selon Microsoft devrait être de 10. C'est pourquoi j'ai créé le EnumResNameProc, en essayant de voir ce que les autres Id existant, de 0 à 500, et tous je suis de retour a la liste ci-dessus, les chances que quelque chose a été défini drôle. Pas De Dés.

J'ai essayé les deux FindResourceExA FindResourceA (avec et sans les "Ex")
Pas De Dés.

Je sais qu'elle est là, j'ai appris de plus en plus alors je l'aime à propos de cette fonction, mais il ne l'a pas trouvé, et je suis à une perte, à quoi d'autre pour essayer.

Que pour l'environnement de développement, je suis en utilisant MinGW+Eclipse+CDT, et à l'aide de winres de la GCC outils pour construire l'objet de la ressource de fichier. J'ai regardé pour les bugs en winres pour voir si elle est en train de faire quelque chose de drôle sur les types binaires. (c'est ce que undefined sont considérées, même si je suis le chargement d'un fichier texte.) oh, j'ai essayé de ré-enregistrer le fichier en tant que norme ANSI, UTF-8, UNICODE et dans le cas où le format binaire du texte qui importait.

Je suis à une perte, je ne sais pas quoi d'autre pour essayer. Je sais que les données sont là, je ne vois pas pourquoi il ne sera pas accès. L'appel d'API Windows ne peut pas voir les données, ou les données sont codées dans un screwey façon et n'a donc pas d'accès.

Quoi d'autre puis-je essayer?

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);
}
Êtes-vous sûr que le texte est enregistré dans le RCDATA (type 10) de l'arborescence des ressources? Je me souviens d'avoir des ennuis avec VS l'inclusion des fichiers comme "RCDATA" au lieu de RCDATA.
Vous pouvez utiliser la ressource hacker pour trouver des ressources dans un fichier exécutable, par opposition à l'ouvrir dans un éditeur de texte.

OriginalL'auteur Quade2002 | 2012-03-10