2010-08-29 180 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。