【问题标题】:Strange compiler message when using GetProcAddress() in windows.h在 windows.h 中使用 GetProcAddress() 时出现奇怪的编译器消息
【发布时间】:2011-11-03 00:15:38
【问题描述】:

出于某种目的(在 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;
}

谁能告诉我哪里出错了?

【问题讨论】:

  • 对不起,我不知道答案。
  • @Rushil:在 Stack Overflow 上,您至少需要接受一些答案​​,尤其是那些有帮助的答案。您可以通过单击答案左侧的复选标记来做到这一点。
  • 只有在有任何答案的情况下才会发生这种情况.. :-D
  • @Rushil:所以thesearenotanswers?我至少看到一个答案,您说“正是 [您] 想要的”。您应该接受您认为最有帮助的答案。如果没有任何有用的答案,您应该尝试为您的问题澄清/添加更多详细信息。如果您不接受足够的答案,人们可​​能不太愿意回答您的问题。
  • 哦,我不知道你在谈论我以前的帖子!不过很抱歉..

标签: c++ windows winapi networking pcap


【解决方案1】:

首先,参考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;
}

【讨论】:

  • @silico,谢谢,我会试试的。顺便说一句,出于某种原因,我不想使用 winpcap 开发人员包。我使用的是 Dev C++,因为我用 Visual C++ 制作了程序(工作正常)但是当我在另一台计算机上运行它时,它给出了一个错误,说需要 xyz.dll,即使在提供了 d 开发人员的包之后..
  • 我试过你的方法,但它再次给出错误:无效转换来自int (*)()' to pcap_t*()(const char, int, int, int, pcap_rmtauth*, char*)' 在 GetProcAddress 一号行中。
  • @Rushil:您必须将reinterpret_cast&lt;&gt;GetProcAddress() 返回的地址转换为正确的类型。为了将来参考,您可以尝试查看 this onethis one 等文档,了解如何使用 GetProcAddress()
  • 我很难理解..你能用正确的方式重写那个函数吗?..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多