6
votes

LoadLibrary ne parvient pas à charger la dll

    *******************UseDll1.cpp*********************

        #include <windows.h>

typedef int (*function1_ptr) ();

function1_ptr function1=NULL;

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 

    HMODULE myDll = LoadLibrary("Dll1.dll"); 

    if(myDll!=NULL) {  
        function1 = (function1_ptr) GetProcAddress(myDll,"function1");  

        if(function1!=NULL)  
            function1();
        else
            exit(4);

        FreeLibrary(myDll);
    }
    else
        exit(6);

    return 0;
}
This is done in order to call Dll1.dll which was created with the functionality to send mail to my own mail server. The above code runs and exits,and no mail is sent. And i also placed the Dll1.dll in the same folder as UseDll1.EDIT:
 I added the Dll1.dll into the system32 folder.

3 commentaires

Ne le mettez pas dans le système32. Ce n'est pas supposé aller là-bas et vous passez simplement autour sans résoudre le problème réel.


J'ai lu sur Internet dans lequel ils disent qu'il y a de chances que la DLL ne soit pas capable de se charger car elle a également certaines dépendances, mais dans ce cas, la fonction1 rendrait Null..wht dire ??


Si la variable mydll n'est pas nulle mais GetProcAddress renvoie NULL, vérifiez si la DLL exporte la fonction requise. Prenez note de "Nom Mangling" si vous exportez comme C ++


7 Réponses :


4
votes

Juste parce que le code fonctionne et les sorties ne signifie pas que c'est juste! Êtes-vous sûr que:

  • La DLL est correctement chargée (mydll! = null)
  • getprocAddress retourne un programme valide Pointeur (Fonction1! = NULL)

    Vous devez parcourir le code dans un débogueur pour vous assurer que tout cela se passe et que le code accède à fonction1 () . Si tel est le cas, je suppose que votre fonction de messagerie a un bogue dedans.


2 commentaires

mydll retourne null ... Comment puis-je le réparer .. ?? J'ai la DLL dans le même dossier que l'endroit où ce code est exécuté


Je suppose que vous n'exécutez pas votre application à partir de System32, alors retirez simplement le chemin de l'appel à LoadLibrary afin qu'il lit LoadLibrary ("dll1.dll") et voyez ce qui se passe ...



1
votes

Pourquoi ne pas le déboguer et voir où il échoue? Assurez-vous que votre DLL est en cours de chargement (cela pourrait simplement être un problème de chemin ou une mauvaise dll (vous n'avez peut-être pas importé / exporté les fonctions).

Découvrez d'abord le problème. C'est soit en chargement de la DLL, appelant la fonction ou à l'intérieur de la fonction


0 commentaires

11
votes

Avez-vous vérifier que vous avez toutes les dépendances externes pour "dll1.dll"?

LoadLibrary échouera même si l'une des bibliothèques liées indirecte n'est pas disponible.


0 commentaires

6
votes

Merci beaucoup, votre page Web m'a beaucoup aidé :) Je n'ai eu qu'à utiliser Tchar.h pour le faire fonctionner. Vous pouvez le voir dans le reste de la réponse.

#pragma once
#include <windows.h>
#include "spinapi.h"
#include <tchar.h>

typedef int (*count_boards_ptr)(void);

int x = 0;
HINSTANCE hinstDLL;
hinstDLL = LoadLibrary(_T("C:\\Smajdalf\\doucko_C\\DLLProblem\\DLLProblem\\spinapi.dll"));
count_boards_ptr count_boards = NULL;
count_boards = (count_boards_ptr) GetProcAddress(hinstDLL, "pb_count_boards");

if(count_boards != NULL) {
    x = count_boards();
}

FreeLibrary(hinstDLL);


1 commentaires

Quelle page Web voulez-vous dire? Je ne semble pas trouver une URL que vous parlez de.



6
votes

Dans mon expérience d'appel de la DLL, j'ai eu le même problème. J'ai tout fait pour avoir donné le chemin à juste titre, mais ma bibliothèque ne peut pas être chargée. Tout d'abord, je pensais que ma DLL avait une erreur, mais rien n'a résolu mon problème au début. Je conseille en dessous de l'étape pour les amis qui pensent leur projet écrit à juste titre, mais toujours avoir le même problème:

  1. Allez dans votre projet DLL et assurez-vous que vous avez sélectionné débogage multi-threadé au lieu de la DLL multi-threads (débogage) (N'utilisez pas la DLL, car il utilise une fonction de la DLL au lieu de les incorporer à l'intérieur) comme bibliothèque d'exécution (spécialement pour le mode de débogage). Vous pouvez voir la sélection de la bibliothèque d'exécution sous Propriété> Propriété de configuration> C / C ++> Code Génération.
  2. Une fois que notre fichier DLL est correct, nous devons nous assurer que notre projet utilise la plate-forme droite . Si notre DLL utilise x64 , notre projet doit utiliser x64 . Vous pouvez le contrôler à partir de Configuration Manager et vous pouvez sélectionner une bonne dans la zone de la plate-forme.

    Après avoir construit le projet avec la bonne configuration, il fonctionne maintenant.


0 commentaires

1
votes

Je pense que vous avez déjà vérifié l'existence de DLL.

Essayez maintenant ceci ::

Essayez de changer "Toute CPU" à 86 ou 64.

Essayez d'exécuter votre application en tant qu'administrateur.


0 commentaires

0
votes

J'ai eu le même problème. Ce lien le résolu. La question était que je n'utilisais pas la macro.


0 commentaires