在windows.h中使用GetProcAddress()时出现奇怪的编译器消息

时间:2011-08-24 16:46:33

标签: c++ windows winapi networking pcap

我正在为某种目的开发一个简单的数据包发送器/接收器(在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 :(得分:0)

首先,请参阅pcap_open()的官方文档:

pcap_t* pcap_open  ( const char *  source,  
  int  snaplen,  
  int  flags,  
  int  read_timeout,  
  struct pcap_rmtauth *  auth,  
  char *  errbuf   
 ) 

然后查看FARPROCwindef.h的定义:

typedef INT_PTR (FAR WINAPI *FARPROC)();

您尝试使用完全错误的功能签名来呼叫pcap_open()。这就是编译器抱怨说有太多参数的原因。如果你甚至设法进行编译,你几乎肯定会搞砸堆栈。

<击> 为什么要使用LoadLibrary()动态加载WinPcap dll?为什么不使用the method outlined in the official documentation

创建一个将wpcap.dll与Microsoft Visual一起使用的应用程序  C ++,请按照以下步骤操作:

在每个源文件的开头包含文件 pcap.h  使用库导出的函数。

如果您的程序使用WinPcap的Win32特定功能,请记住  在预处理器定义中包含 WPCAP

如果您的程序使用WinPcap的远程捕获功能,请添加  *预处理器定义中的HAVE_REMOTE *。 包含   remote-ext.h 直接在您的源文件中。

设置链接器的选项以包含 wpcap.lib 库文件  特定于您的目标(x86或x64)。可以找到x86的wpcap.lib  在WinPcap开发人员包的\ lib文件夹中,wpcap.lib for 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;
}