c ++ - Underlig compiler besked, når du bruger GetProcAddress () i windows.h

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg udvikler en simpel pakke afsender/modtager til noget formål (i Dev c ++) .. vil du tilføje flere funktioner til det. Men jeg er fast på et punkt, hvor jeg får en mærkelig fejl 'For mange argumenter for at fungere' ..Min kode er


#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;
}


Kan nogen fortælle mig, hvor jeg går galt?

Bedste reference


Først henvises til den officielle dokumentation for pcap\_open(): [11]


pcap\_t* pcap\_open  ( const char *  source,  
  int  snaplen,  
  int  flags,  
  int  read\_timeout,  
  struct pcap\_rmtauth *  auth,  
  char *  errbuf   
 ) 


Se derefter på definitionen af ​​FARPROC i windef.h:


typedef INT\_PTR (FAR WINAPI *FARPROC)();


Du forsøger at ringe til pcap\_open() ved hjælp af en helt forkert funktions signatur. Det er derfor kompilatoren klager over, at der er for mange argumenter. Hvis du selv klarer at kompilere det, vil du næsten helt sikkert gå til skru op i stakken.



Og hvorfor lægger du dynamisk på WinPcap dll'en ved hjælp af LoadLibrary()? Hvorfor ikke bruge metoden beskrevet i den officielle dokumentation? [12]


At oprette et program, der bruger wpcap.dll med Microsoft Visual
 C + +, følg disse trin:


Medtag filen pcap.h i begyndelsen af ​​hver kildefil, som
 bruger de funktioner, der eksporteres af biblioteket.


Hvis dit program bruger Win32-specifikke funktioner i WinPcap, skal du huske
 at medtage WPCAP blandt præprocessordefinitionerne.


Hvis dit program bruger fjernoptagelsesfunktionerne i WinPcap, skal du tilføje
 * HAVE\_REMOTE * blandt præprocessor definitionerne. Indsæt ikke
  remote-ext.h direkte i dine kildefiler.


Indstil linkerens muligheder for at inkludere wpcap.lib biblioteksfilen
 specifik for dit mål (x86 eller x64). wpcap.lib for x86 kan findes
 i mappen \ lib i WinPcap-udviklerens pakke, wpcap.lib for x64
 kan findes i mappen \ lib \ x64.



Du bruger Dev C ++, som sandsynligvis ikke har VC ++-kompilatoren. Du skal stadig angive den korrekte funktions signatur. En mulig måde er gennem en 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;
}