2010-08-29 220 views
2

我被给了一个我正在尝试使用的DLL。该DLL包含函数“send”。 这是我做过什么:如何在C中导入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(程序未找到)

我在做什么错?

+1

你有DLLEXPORT那个'发送'功能吗? – kennytm 2010-08-29 12:39:20

+0

我没有写入该DLL文件... – Mikey 2010-08-29 12:46:10

回答

4

代码看起来或多或少都很好,所以可能是* .dll有问题。请下载Dependency Walker应用程序,并检查该库导出的功能类型。

+0

只导出了一个函数 - “MAGIC_BIND”。实际上,给出的示例代码是Magic。有没有可能该DLL只能通过魔术使用? – Mikey 2010-08-29 13:00:11

+0

调用该函数需要魔法。 http://www.ng-sw.de/mg-wikka/MagicDLLs – 2010-08-29 13:15:55

0

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

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

要解决这一点,是你应该做的:

  1. 使用“取决于“实用程序(depends32.exe,附带MSVC)查看您的DLL 实际上是出口。
  2. 如果你是DLL的作者 - 你可能会迫使出口的名字是你想要的东西,通过使用“高清”的文件(链接)
0

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

+0

GetProcAddress不占用宽字符串。 – dreamlax 2010-08-29 23:51:03

2

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