2012-06-16 81 views
0

我有一個庫(ws2_32)和一個頭文件(ws2tcpip.h),但由於某種原因庫中的函數不在頭文件中。有沒有一種方法可以確定方法簽名,以便我可以將它們包含在頭文件中?我可以從靜態庫中創建標題嗎?

[email protected] ~$ strings /usr/lib/w32api/libws2_32.a | grep -i 'inet_*ntop' 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
inet_ntop      <<< I need this one 
[email protected] 
[email protected] 
InetNtopW      <<< or this one 
[email protected] 
[email protected] 
[email protected] ~$ grep -i -B 4 -A 2 -R "ntop" /usr/include/w32api/ws2tcpip.h 
[email protected] ~$     

這應該是可能的,因爲鏈接器必須驗證這一點,不是嗎?

參考:InetNtop and ws2tcpip.h under GCC/Cygwin

+0

對於C函數,鏈接器通常只檢查函數名稱是否匹配,而不是它們具有相同類型或調用約定。在某些系統中,連接器甚至不會驗證你所調用的函數是一個函數,它可能是一大塊數據。 –

回答

0

沒有,沒有。不是沒有拆卸圖書館,做了很多猜測。總體來看,它絕望無望。

然而,像InetNtopWinet_ntop函數的文檔(MSDN),所以我們知道函數簽名是什麼。需要注意的是功能被標記爲需要Vista中,確實可以在WS2tcpip.h看到它們是由後衛包圍:

#if (NTDDI_VERSION >= NTDDI_VISTA) 

所以,除非你確定支持Vista的預處理宏,你不會得到原型。

// Require Vista 
#define WINVER 0x0600 
#define _WIN32_WINNT 0x0600 
#include <WS2tcpip.h> 

或者,您可以使用WSAAddressToString。它是一個類似的功能,但不完全兼容。該WSAAddressToString可從Windows 2000

腳註:InetNtopWinet_ntop功能基本上是相同的事情,除了W版本需要wchar_tinet_ntop需要char。許多Windows功能都以這種方式複製。

+0

我的確有必要的#defines,但我可以向你保證定義不在頭文件中(按照grep)。我知道WSA *函數,但在這種情況下我不能使用它們。您的鏈接指向InetNtop的MSDN,但是如果您注意到庫文件中沒有顯示(按字符串) – Huckle

+0

@Huckle:'InetNtop'不會顯示在庫中,因爲它不是一個函數,它是一個預處理器根據「UNICODE」宏的值定義爲「InetNtopW」或「inet_ntop」的宏。有沒有理由不能使用'WSA'功能? –

+0

WSA函數在使用前都需要調用WSAStartup,但是我的程序的主要目的是不使用套接字,所以我不想浪費時間/內存來初始化某些東西,功能,可以在不增加開銷的情況下實現相同的功能我沒有必要在Vista之前的任何版本上使用它(因爲無論如何,它將在80%的情況下在* nix下使用)。你可以將Ws2tcpip.h的副本發佈到pastebin,以便我區分它嗎? – Huckle