我正在为某种目的开发一个简单的数据包发送器/接收器(在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;
}
谁能告诉我哪里出错了?
答案 0 :(得分:0)
首先,请参阅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()
。这就是编译器抱怨说有太多参数的原因。如果你甚至设法进行编译,你几乎肯定会搞砸堆栈。
<击>
为什么要使用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;
}