Сначала обратитесь к официальной документации для pcap_open()
:
pcap_t* pcap_open ( const char * source,
int snaplen,
int flags,
int read_timeout,
struct pcap_rmtauth * auth,
char * errbuf
)
Тогда посмотрите на определение FARPROC
в windef.h
:
typedef INT_PTR (FAR WINAPI *FARPROC)();
Вы пытаетесь вызвать pcap_open()
, используя совершенно неверную сигнатуру функции. Вот почему компилятор жалуется, что аргументов слишком много. Если вам даже удастся собрать этот компилятор, вы почти наверняка испортите стек.
И почему вы динамически загружаете WinPcap dll, используя LoadLibrary()
? Почему бы не использовать метод, описанный в официальной документации ?
Чтобы создать приложение, которое использует wpcap.dll с Microsoft Visual
C ++, выполните следующие действия:
Включите файл pcap.h в начале каждого исходного файла, который
использует функции, экспортируемые библиотекой.
Если ваша программа использует Win32-специфичные функции WinPcap, запомните
включить WPCAP в определения препроцессора.
Если ваша программа использует возможности удаленного захвата WinPcap, добавьте
* HAVE_REMOTE * среди определений препроцессора. не включать
remote-ext.h непосредственно в исходных файлах.
Установите параметры компоновщика для включения файла библиотеки wpcap.lib
специфичный для вашей цели (x86 или x64). wpcap.lib для x86 можно найти
в папке \ lib пакета разработчика WinPcap, wpcap.lib для x64
можно найти в папке \ lib \ x64.
Вы используете Dev C ++, который, вероятно, не имеет компилятора VC ++. Вам все еще нужно объявить правильную сигнатуру функции. Один из возможных путей - через typedef
:
#include <iostream>
#include <windows.h>
struct pcap_t;
struct pcap_rmtauth;
typedef pcap_t* (*pcap_open_func_ptr)(const char *source,
int snaplen, int flags, int read_timeout,
pcap_rmtauth *auth, char *errbuf);
int main(int argc, char *argv[])
{
HINSTANCE dllhandle = LoadLibrary("wpcap.dll");
pcap_open_func_ptr iface_handle =
reinterpret_cast<pcap_open_func_ptr>(
GetProcAddress(dllhandle, "pcap_open"));
char *errbuf[256];
pcap_t* iface = iface_handle(iface_name, 1000, 1, 500, NULL, errbuf);
// ...
return 0;
}