2012-06-16 1 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

Нет, нет. Не без разбора библиотеки и много догадок. Считайте это безнадежным, в общем.

Однако, такие функции, как InetNtopW и inet_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.

Сноска: В InetNtopW и inet_ntop функции в основном то же самое, за исключением версии W принимает wchar_t и inet_ntop принимает char. Многие функции Windows дублируются таким образом.

+0

У меня есть требуемые #defines, но я могу заверить, что это определение не в заголовке (как в grep). Я знаю функции WSA *, но я не могу их использовать в этом случае. Ваша ссылка указывает на MSDN для InetNtop, но если вы заметили, что это не представлено в файле библиотеки (по строкам) – Huckle

+0

@Huckle: 'InetNtop' не будет отображаться в библиотеке, потому что это не функция, это препроцессор макрос, который определяется как 'InetNtopW' или' inet_ntop' в зависимости от значения макроса 'UNICODE'. Есть ли причина, по которой вы не можете использовать функции WSA? –

+0

Перед всеми функциями WSA требуется вызов WSAStartup, но основная цель моей программы - не работать с сокетами вообще, поэтому я не хочу тратить время/память на инициализацию чего-то, когда есть один раз которая будет делать то же самое без дополнительных накладных расходов. Мне не нужно использовать это ни на чем раньше, чем на Vista (так как это будет использоваться в * nix в 80% случаев в любом случае). Не могли бы вы отправить свою копию Ws2tcpip.h в pastebin, чтобы я мог ее разграничить? – Huckle

Смежные вопросы