Loadlibrary无法加载DLL

时间:2011-01-16 19:24:42

标签: visual-c++ 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;
}

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

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

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

7 个答案:

答案 0 :(得分:7)

您是否确认您拥有“DLL1.dll”的所有外部依赖项?

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

答案 1 :(得分: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);

答案 2 :(得分:6)

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

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

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:1)

为什么不调试它并查看它失败的地方?确保你的dll实际上正在加载(它可能只是路径问题或坏dll(你可能没有导入/导出函数)。

首先找出问题所在。它可以是加载dll,调用函数,也可以是函数内部

答案 5 :(得分:1)

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

现在试试这个::

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

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

答案 6 :(得分:0)

我有同样的问题。 This链接解决了它。问题是我没有使用_T宏。