Странное сообщение компилятора при использовании GetProcAddress () в windows.h - PullRequest
1 голос
/ 24 августа 2011

Для какой-то цели я разрабатываю простого отправителя / получателя пакета (в Dev c ++) .. хочу добавить к нему больше возможностей.Но я застрял в точке, где я получаю странную ошибку "Слишком много аргументов для работы" .. Мой код

#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
 HINSTANCE dllhandle = LoadLibrary("wpcap.dll");
 FARPROC sendpacket = NULL, iface_handle = NULL;
 iface_handle = GetProcAddress(dllhandle, "pcap_open");
 char* iface_name = "\\Device\\NPF_{EADB4C21-B0AF-4EF2-86AB-80A37F399D1C}";
 char *errbuf[256];
 int iface = iface_handle(iface_name, 1000, 1, 500, NULL, errbuf);  // The Error is here
 system("pause");
 return 0;
}

Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

0 голосов
/ 25 августа 2011

Сначала обратитесь к официальной документации для 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;
}
...