加载库失败无法加载dll文件。

6
    *******************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文件夹中。


不要把它放在system32里。那不是它应该去的地方,你只是在胡乱尝试而没有解决真正的问题。 - Sean
我在互联网上读到有人说,dll文件无法加载的原因可能是它还有一些依赖项,但在这种情况下,function1将返回NULL。你怎么看? - Vinod K
2
如果变量 myDll 不为空但 GetProcAddress 返回 null,请检查 DLL 是否导出所需函数。如果您正在导出为 C++,请注意名称修饰。 - YeenFei
7个回答

12

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

即使任何间接链接的库不可用,LoadLibrary也会失败。


7
在我的dll调用经验中,我遇到了同样的问题。我尽力保证路径正确,但库仍无法加载。起初,我认为我的dll存在错误,但是一切都没有解决我的问题。我建议以下步骤给那些认为他们的项目已经正确编写但仍然存在相同问题的朋友们:
  1. 进入您的DLL项目,并确保您选择了多线程调试而不是多线程(Debug)DLL(不要使用dll,因为它使用某些来自dll的函数而不是将它们嵌入其中)作为运行时库(特别是对于调试模式)。您可以在属性>配置属性> C/C++>代码生成下看到运行时库选择。
  2. 在我们的DLL文件没问题之后,我们必须确保我们的项目使用正确的平台。如果我们的dll使用了x64,我们的项目就必须使用x64。您可以从“配置管理器”中进行控制,然后可以从平台框中选择合适的一个。
构建正确配置的项目后,现在这个问题已经得到解决了。

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);

你指的是哪个网页?我好像找不到你所提到的URL。 - Styxxy

4

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

  • DLL被正确地加载了 (myDll!=null)
  • GetProcAddress返回有效的指针 (function1!=null)

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


我的 DLL 返回了 NULL...我该怎么解决它..?? 我把 DLL 放在与运行此代码的位置相同的文件夹中。 - Vinod K
我假设您不是从system32运行应用程序,因此只需从调用LoadLibrary的路径中删除路径,使其读取LoadLibrary("Dll1.dll"),然后看看会发生什么... - Sean

1

为什么不调试一下,看看出了哪些问题?确保你的 DLL 实际被加载了(可能只是路径问题或者 DLL 不好(你可能没有导入/导出函数)。

首先找出问题所在。它要么在加载 DLL、调用函数中,要么在函数内部。


1

我想你已经检查了dll的存在。

现在尝试这样做:

尝试将“任何CPU”更改为86或64。

尝试以管理员身份运行您的应用程序。


0

我曾经遇到过同样的问题。这个链接解决了它。问题在于我没有使用_T宏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接