Windows Vista:Impossible de charger la DLL 'x.dll' :Accès invalide à l'emplacement mémoire.(Exception DllNotFound)

StackOverflow https://stackoverflow.com/questions/29284

Question

J'ai testé cet après-midi sur la machine d'un client qui a Windows Vista (il avait chez lui, mais je teste sur une Business Edition avec les mêmes résultats).

Nous utilisons un .DLL qui obtient l'ID matériel de l'ordinateur.Son utilisation est très simple et l'exemple de programme que j'ai créé fonctionne.La DLL est Ceci d'AzSdk.En fait, cela fonctionne parfaitement sous Windows XP.Cependant, pour une raison étrange, dans notre projet (beaucoup plus grand), nous obtenons cette exception :

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

Je ne sais pas quelle peut être la cause du problème, car j'ai le contrôle total sur le dossier.Le projet est une application Windows Forms c#.net et tout fonctionne bien, à l'exception de l'appel à la bibliothèque externe.

Je le déclare ainsi :(note:c'est pas une bibliothèque COM et il n'est pas nécessaire de l'enregistrer).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

Et puis le code appelant est assez simple :

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

Lorsque vous créez un exemple d’application, cela fonctionne, mais pas dans mon projet.Sous XP fonctionne bien.Avez-vous des idées sur ce que je dois faire dans Vista pour que cela fonctionne ?Comme je l'ai dit, le dossier et ses sous-dossiers ont un contrôle total pour « Tout le monde ».

MISE À JOUR: Je n'ai pas installé Vista SP 1.

MISE À JOUR 2 : J'ai installé Vista SP1 et maintenant, avec l'UAC désactivé, même le simple exemple ne fonctionne pas !!!:( Merde de Vista.

Était-ce utile?

La solution

@Martin

La raison pour laquelle vous ne receviez pas l'invite UAC est que l'UAC ne peut modifier que la manière dont un processus est exécuté. commencé, une fois le processus en cours d'exécution, il doit rester au même niveau d'élévation.L'invite UAC se produira si :

  • Vista pense que c'est un installateur (beaucoup de règles ici, le plus simple est s'il s'appelle "setup.exe"),
  • S'il est marqué comme "Exécuter en tant qu'administrateur" (vous pouvez le modifier en modifiant les propriétés du raccourci ou de l'exe), ou
  • Si l'exe contient un manifeste demandant des privilèges d'administrateur.

Les deux premières options sont des solutions de contournement pour les applications « héritées » qui existaient avant l'UAC. La bonne façon de procéder pour les nouvelles applications est de intégrer une ressource manifeste demander les privilèges dont vous avez besoin.

Certains programmes, tels que Explorateur de processus semblent élever un processus en cours d'exécution (lorsque vous choisissez "Afficher les détails de tous les processus" dans le menu Fichier dans ce cas), mais ce qu'ils font en réalité, c'est démarrer une nouvelle instance, et c'est cette nouvelle instance qui est élevée - pas celle qui était en cours d'exécution à l'origine.C'est la méthode recommandée si seules certaines parties de votre application nécessitent une élévation (par ex.une boîte de dialogue spéciale « options d'administration »).

Autres conseils

Impossible de charger la DLL 'HardwareID.dll' :Accès invalide à l'emplacement mémoire.(Exception de HRESULT :0x800703E6)

Le nom de DllNotFoundException vous confond - ce n'est pas un problème pour trouver ou charger le fichier DLL, le problème est que lorsque la DLL est chargée, elle effectue un accès illégal à la mémoire, ce qui entraîne l'échec du processus de chargement.

Comme une autre affiche ici, je pense qu'il s'agit d'un problème DEP, et que vos modifications UAC, etc. vous ont finalement permis de désactiver DEP pour cette application.

La machine sur laquelle vous avez le code est-elle déployée sur une machine 64 bits ?Vous pourriez également tomber sur un DEP problème.

Modifier

Il s’agit d’un Macbook Pro de 1ère génération avec un processeur Intel Core Duo 2 de 1ère génération.Loin du 64 bits.

J'ai mentionné 64 bits, car à bas niveau, les structures de 32 bits à 64 bits ne sont pas correctement gérées.Étant donné que les machines ne sont pas en 64 bits, il est plus que probable que la désactivation de DEP serait une bonne prochaine étape logique.Vista est devenu plus sécurisé que XP SP2.

Eh bien, je viens de désactiver DEP globalement, en vain.Même erreur.

Eh bien, j'ai également lu que des personnes recevaient cette erreur après avoir mis à jour une machine vers Vista SP1.Ces installations Vista contiennent-elles le SP1 ?

Il s'avère que c'est quelque chose de complètement différent.Juste pour des raisons de test, j'ai désactivé l'UAC (remarque :Je ne recevais aucune invite).

Super, j'allais en fait suggérer cela, mais je pensais que vous l'aviez probablement déjà essayé.

Avez-vous fait une demande d'assistance au fournisseur ?Il y a peut-être quelque chose dans le matériel du MacBook Pro qui empêche le produit de fonctionner.

Étant donné que l'exception est une DllNotFoundException, vous souhaiterez peut-être essayer de vérifier le HardwareID.dll avec Dépendance Walker AVANT d'installer des outils de développement sur l'installation de Vista pour voir s'il manque effectivement une dépendance.

En plus de permettre un contrôle total à « Tout le monde », l'emplacement permet-il également aux processus ayant un niveau d'intégrité moyen d'écrire ?

Comment puis-je vérifier cela ?Je suis nouveau sur Vista, je ne l'aime pas trop, c'est trop lent dans une VM pour le travail quotidien et pour une utilisation de VStudio dans une Machine Virtuelle, ça n'apporte rien de nouveau.

Depuis une invite de commande, vous pouvez exécuter :

icacls C:\Folder

Si vous voyez une ligne telle que « Mandatory Label\High Mandatory Level », alors le dossier n'est accessible qu'à un processus à haute intégrité.S'il n'existe pas de ligne de ce type, les processus à intégrité moyenne peuvent y accéder à condition qu'aucune autre ACL ne refuse l'accès (en fonction de l'utilisateur par exemple).

MODIFIER:J'ai oublié de mentionner que vous pouvez utiliser le commutateur /setintegritylevel pour modifier réellement le niveau d'intégrité requis pour accéder à l'objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top