Loadlibrary не может загрузить DLL - PullRequest
5 голосов
/ 16 января 2011
    *******************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;
}

Это сделано для вызова Dll1.dll, которая была создана с возможностью отправлять почту на мой собственный почтовый сервер.Приведенный выше код запускается и завершается, а почта не отправляется.

И я также поместил Dll1.dll в ту же папку, что и UseDll1.

РЕДАКТИРОВАТЬ: Я добавил Dll1.dll в папку system32.

Ответы [ 7 ]

7 голосов
/ 17 января 2011

Убедитесь, что у вас есть все внешние зависимости для "DLL1.dll"?

LoadLibrary завершится ошибкой, даже если какая-либо из косвенных связанных библиотек недоступна.

6 голосов
/ 06 августа 2014

В моем опыте вызова dll у меня была такая же проблема. Я сделал все, чтобы правильно указать путь, но моя библиотека не может быть загружена. Сначала я думал, что моя DLL имеет ошибку, но ничего не решило мою проблему при запуске. Я советую сделать шаг ниже для друзей, которые думают, что их проект написан правильно, но все еще имеет ту же проблему:

  1. Перейдите в свой проект DLL и убедитесь, что вы выбрали Многопоточная отладка вместо многопоточной (отладочной) DLL (не используйте dll, потому что она использует некоторую функцию из dll вместо встраивания их внутрь ) как библиотека времени выполнения (специально для режима отладки). Вы можете увидеть выбор библиотеки времени выполнения в Свойство> Свойство конфигурации> C / C ++> Код Генерация.
  2. После того, как наш DLL-файл исправен, мы должны убедиться, что наш проект использует правильная платформа . Если наша DLL использует x64 , наш проект должен использовать x64 . Вы можете управлять им из диспетчера конфигурации, и вы можете выбрать прямо из окна платформы.

После сборки проекта с правильной конфигурацией он работает.

6 голосов
/ 15 июля 2012

Большое спасибо, ваша веб-страница мне очень помогла :) Мне только пришлось использовать tchar.h, чтобы она заработала. Вы можете увидеть это в остальной части ответа.

#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);
4 голосов
/ 16 января 2011

Тот факт, что код запускается и завершается, не означает, что он прав!Вы уверены, что:

  • DLL загружается правильно (myDll! = Null)
  • GetProcAddress возвращает действительный указатель (function1! = Null)

Вам следует пройтись по коду в отладчике, чтобы убедиться, что все это происходит и что код действительно достигает function1 () .Если это произойдет, то я думаю, что ваша функция электронной почты содержит ошибку.

1 голос
/ 29 июня 2016

Я думаю, вы уже проверили существование dll.

Теперь попробуйте это ::

Попробуйте изменить «Любой процессор» на 86 или 64.

Попробуйте запустить приложение от имени администратора.

1 голос
/ 16 января 2011

Почему бы не отладить его и не увидеть, где он выходит из строя?Убедитесь, что ваша dll на самом деле загружается (это может быть просто проблема с путём или плохая dll (возможно, вы не импортировали / не экспортировали функции).

Узнайте, где проблема в первую очередь. Это либо при загрузкеdll, вызывающая функцию, или внутри функции

0 голосов
/ 27 февраля 2017

У меня была такая же проблема. Эта ссылка разрешила это.Проблема заключалась в том, что я не использовал макрос _T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...