Loadlibrary无法加载DLL

Vin*_*d K 5 dll visual-c++

    *******************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;
}
Run Code Online (Sandbox Code Playgroud)

这样做是为了调用Dll1.dll,它是使用将邮件发送到我自己的邮件服务器的功能创建的.上面的代码运行并退出,并且不发送任何邮件.

我还将Dll1.dll放在与UseDll1相同的文件夹中.

编辑:我将Dll1.dll添加到system32文件夹中.

Yee*_*Fei 8

您是否验证了"DLL1.dll"的所有外部依赖项?

即使任何间接链接库不可用,LoadLibrary也将失败.

  • 实际上有错误126。 (2认同)

小智 6

非常感谢,你的网页帮助了我很多:)我只需要使用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);
Run Code Online (Sandbox Code Playgroud)


Mus*_*mal 6

在我的dll通话体验中,我遇到了同样的问题.我做了一切正确的路径,但我的图书馆无法加载.首先我认为我的DLL有错误,但在开始时没有解决我的问题.我建议为那些认为他们的项目写得正确但仍然有同样问题的朋友做下面的步骤:

  1. 转到你的DLL项目,并确保你选择多线程调试而不是多线程(调试)DLL(不要使用DLL,因为它使用dll中的一些函数而不是嵌入它们)作为运行时库(特别是对于调试模式) ).您可以在" 属性">"配置属性">"C/C++">"代码生成" 下查看运行时库选择.
  2. 我们的DLL文件正常后,我们必须确保我们的项目使用正确的平台.如果我们的dll使用x64,我们的项目必须使用x64.您可以从配置管理器控制它,您可以从平台框中选择正确的一个.

在使用正确的配置构建项目之后,它现在正在运行.


Sea*_*ean 4

仅仅因为代码运行并退出并不意味着它是正确的!您确定:

  • DLL 正在正确加载 (myDll!=null)
  • GetProcAddress 返回一个有效的指针 (function1!=null)

您应该在调试器中单步调试代码,以确保所有这些都发生并且代码确实到达了function1()。如果确实如此,那么我的猜测是您的电子邮件功能存在错误。