如何在C中导入DLL函数?

发布于 2024-09-16 07:07:21 字数 564 浏览 3 评论 0原文

我得到了一个我正在尝试使用的 DLL。 DLL 包含函数“发送”。 这就是我所做的:

#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。(未找到过程)

我做错了什么?

I was given a DLL that I'm trying to use. The DLL contains the function "send".
this is what I did:

#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 returns NULL, and the last error value is 127. (procedure was not found)

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

已下线请稍等 2024-09-23 07:07:21

代码看起来或多或少都不错,所以 *.dll 可能有问题。请下载Dependency Walker应用程序并检查该库导出了哪些类型的函数。

Code look more or less good, so probably something is wrong with *.dll. Please download Dependency Walker application and check what kind of functions are exported by this library.

泅渡 2024-09-23 07:07:21

如果您运行 64 位环境并且“sendsms.dll”被编译为 32 位,则 loadlibrary 不起作用。您需要将项目编译为 32 位才能加载 dll。

If you running 64bit environment and "sendsms.dll" is compiled as 32bit loadlibrary does not work. You need to compile your project as 32bit to load dlls.

风吹雨成花 2024-09-23 07:07:21

DLL 可能不导出这样的函数。

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

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

要解决此问题,您应该执行以下操作:

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

Probably the DLL doesn't export such a function.

This is usually caused by the "decorations" the compiler adds to the function name. For instance "send" may actually be seen as:

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

To resolve this that's what you should do:

  1. Use the "depends" utility (depends32.exe, shipped with MSVC) to view what your DLL actually exports.
  2. If you're the author of the DLL - you may force the export name to be what you want, by using "def" file (for linker)
誰ツ都不明白 2024-09-23 07:07:21

我注意到您在 LoadLibrary 上使用 TEXT,但不在 GetProcAddress 上使用 TEXT。如果 GetProcAddress 误解了您的字符串,则它可能正在寻找错误的函数。

I noticed that you're using TEXT on LoadLibrary, but not on GetProcAddress. If GetProcAddress is misinterpreting your string, it could be looking for the wrong function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文