如何在C语言中导入DLL函数?

5
我得到了一个DLL文件,我正在尝试使用它。该DLL包含函数“send”。 以下是我的操作:
#include <stdio.h>
#include <Windows.h>

int main(int argc, char * argv[])
{
    HMODULE libHandle;

    if ((libHandle = LoadLibrary(TEXT("SendSMS.dll"))) == NULL)
    {
        printf("load failed\n");
        return 1;
    }
    if (GetProcAddress(libHandle, "send") == NULL)
    {
        printf("GetProcAddress failed\n");
        printf("%d\n", GetLastError());
        return 1;
    }
    return 0;
}

GetProcAddress返回了NULL,并且最后的错误值是127。(找不到过程)

我做错了什么?


1
你是否已经将send函数进行了DLLEXPORT? - kennytm
我没有编写那个DLL文件... - Mikey
4个回答

4

代码看起来还不错,所以可能是*.dll出了问题。请下载Dependency Walker应用程序,并检查此库导出了哪些函数。


只有一个函数被导出 - “MAGIC_BIND”。 实际上,给出的示例代码是用Magic编写的。这个dll是否只能通过Magic使用? - Mikey

2

如果您正在运行64位环境,并且"sendsms.dll"被编译为32位,那么loadlibrary将无法工作。您需要将项目编译为32位以加载dll。


0

可能 DLL 没有导出这样的函数。

这通常是由编译器添加到函数名称中的“修饰”引起的。例如,“发送”实际上可能被视为:

  • _send
  • _send@4
  • ?send@@ABRACADABRA

要解决此问题,请执行以下操作:

  1. 使用“depends”实用程序(depends32.exe,随 MSVC 一起提供)查看 DLL 实际导出的内容。
  2. 如果您是 DLL 的作者,可以通过使用“def”文件(用于链接器)来强制导出名称为您想要的名称。

0

我注意到你在LoadLibrary上使用了TEXT,但在GetProcAddress上没有使用。如果GetProcAddress误解了你的字符串,它可能会寻找错误的函数。


GetProcAddress不接受宽字符串。 - dreamlax

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