C++ LoadLibrary ERROR_NOACCESS non Valide “l'accès à l'emplacement de la mémoire.”

OK, j'ai donc une situation dans laquelle je l'appelle LoadLibrary sur une DLL que j'ai écrit. Cet appel à LoadLibrary renvoie l'erreur #998, ou ERROR_NOACCESS non Valide "l'accès à l'emplacement de la mémoire."

La DLL en question utilise les MFC dans une configuration, et pas dans un autre; seulement le MFC configuration a ce problème. Il l'habitude de travailler, mais je n'ai aucune idée de ce que j'ai changé: j'avais en fait déplacé sur de la non-MFC version et bricoler tout à fait beaucoup de mal avec cela et je n'ai aucune idée de ce que je pourrais avoir fait qui a affecté le MFC version.

Je ne sais pas beaucoup sur les Dll. L'origine du chargement de code m'a été donnée, et je n'ai pas changé. Ci-dessous, c'est que code:

//submodule loading
#ifndef MFC
//Project uses standard windows libraries, define an entry point for the DLL to handle loading/unloading
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
    _MESSAGE("DllMain called.");
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:    //dll loaded
        hModule = (HMODULE)hDllHandle;  //store module handle
        _MESSAGE("Attaching Submodule ..."); 
        break;
    case DLL_PROCESS_DETACH:    //dll unloaded
        _MESSAGE("Detaching Submodule ...");      
        break;
    }   
    return true;
}
#else
//Project uses MFC, we define here an instance of CWinApp to make this a 'well-formed' DLL
class CSubmoduleApp : public CWinApp
{
public:
    virtual BOOL InitInstance()
    {//dll loaded
        hModule = m_hInstance;  //store module handle
        _MESSAGE("Attaching Submodule ...");
        return true;
    }
    virtual int ExitInstance()
    {//dll unloaded
       _MESSAGE("Detaching Submodule ...");      
       return CWinApp::ExitInstance();
    }
} gApp;
#endif

Évidemment, MFC est défini dans la configuration du MFC, et pas autrement.

Je doute que cela soit suffisamment d'informations pour résoudre ce problème; je me rends compte que. Ce que je suis réellement espérant apprendre est où rechercher les problèmes qui peut provoquer cette erreur. Je serai heureux de fournir toutes les informations dont vous avez besoin — une fois que je sais que c'est nécessaire.

Merci pour les conseils.

  • Avez-vous essayé de l'exécuter dans un débogueur? Que devrait faire ressortir l'erreur pour vous rapidement.
  • Ce n' _MESSAGE faire?
  • Malheureusement, le code qui appelle LoadLibrary est dans une autre DLL (appelée par le code je n'ai pas accès), afin de "lancer dans un débogueur" ne fonctionne pas, alors que dans le même temps, je ne peux pas utiliser "Attach to Process" avant qu'il soit déjà essayé et abandonné sur ma DLL. Vous ne savez pas si il existe un moyen d'obtenir que cela fonctionne...
  • ah, désolé: il imprime le clos message à la .log le fichier associé à la DLL. Standard format string, ... arguments.
  • Très certainement, vous pouvez exécuter ce sous le débogueur. Vous devez définir un point d'arrêt de nice et au début du code, et d'assigner une application hôte.
  • Je suis d'accord avec David, il peut être débogué. Vous pouvez même vous contenter d'exécuter Visual Studio à partir de la ligne de commande à l'aide de l'-debugexe option, puis définissez un point d'arrêt dans le code que vous avez posté. Le point d'arrêt semble être inaccessible lorsque vous définissez, mais une fois que votre fichier DLL qui est chargée, elle va devenir accessible.
  • OK, j'ai le Débogage de la section de mon projet est de définir les Propriétés d'appeler le programme qui utilise ma DLL (celui qui appelle mes autres DLL). Quand j'appuie sur "Start Debugging", j'obtiens "les informations de Débogage pour le "programme" ne peut pas être trouvé ou ne correspond pas. Ne peut pas trouver ou ouvrir le fichier PDB. Voulez-vous continuer de débogage?" Même si je l'ai frappé, Oui, cependant, le débogage se termine avant que mon point d'arrêt se fait frapper... Est-ce que vous vouliez dire?
  • OK, je crois que j'ai compris quel est le problème avec le débogueur est. C'est l'affaire: le programme que je suis en cours d'exécution est d'une courte durée de vie du chargeur. Il exécute un autre fichier, injecte un peu de code, et ferme. Le code injecté est ce qui appelle de ma DLL. Si je joindre pour le chargeur, je mènera nulle part. J'ai à joindre à l'exécutable nommé par le chargeur, mais je dois le faire 1. Après le chargeur a appelé, et 2. Avant l'injection de code appelle ma DLL. Je ne peux pas frapper Attacher au Processus rapide. Est-il comme... de manière à provoquer une rupture? J'ai eu un peu de chance d'obtenir le Juste À Temps débogueur de travail...
  • Avez-vous essayé de chargement de votre fichier DLL à partir d'un programme de test au lieu de partir de l'hôte d'origine du programme? Si vous avez de la chance, il fera preuve de la même erreur, ce qui ferait de débogage beaucoup plus simple.
  • Malheureusement, mon code s'appuie sur un grand nombre de code de ce programme d'accueil (bien que son interface API)...
  • Peut-être, mais si l'erreur se produit dès que la DLL charges, il ne fera aucune différence, ça va?
  • Oh: avez-vous essayé de supprimer les appels à _MESSAGE? Juste sur la possibilité?
  • La même chose s'était levé sur moi après que j'ai dit cela; malheureusement, j'ai été absent à partir du code ce week-end si je n'ai pas pu le tester. Comme pour _MESSAGE, il fonctionne parfaitement dans d'autres parties du code. L'enfer, la seule raison pour laquelle je sais que l'erreur de LoadLibrary est parce que j'ai un _MESSAGE que les sorties. (à la fois la DLL qui est un échec et la DLL qui le charge de commencer avec ont _MESSAGE en eux; ils sont des copies séparées mais un code identique).
  • DllMain (et donc, probablement, InitInstance) est un cas spécial; code qui fonctionne parfaitement bien d'ailleurs peut casser lors de l'appelle de la fonction DllMain.
  • OK, j'ai essayé de prendre _MESSAGE aussi absurdes qu'est — n'a pas aidé. J'ai essayé de charger le module à partir d'un projet de test qui vient de charge; mais elle ne citant de nombreuses dépendances ("Cette application n'a pas pu démarrer car le fichier exécutable que le code est habituellement injecté dans} n'a pas été trouvé. La réinstallation de cette application peut corriger ce problème."), et je ne sais pas comment corriger ces. Je ne peux toujours pas attacher un débogueur. Toutes les autres suggestions?
  • À qui de droit, j'ai été faire cette erreur incorrecte de l'initialisation d'une variable globale dans mon .dll .fichier cpp: const PropertyConnectionChoice::ChoiceDataList s_metaRouteChoiceList( std::begin( s_metaRouteChoiceData ), std::end( s_metaMovementChoiceData ) );

InformationsquelleAutor KRyan | 2011-10-07