Domanda

Data questa dichiarazione API C come sarebbe importato in C #?

int _stdcall z4ctyget(CITY_REC *, void *);

Sono stato in grado di arrivare a questo punto:

   [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);

Naturalmente in C # il "void *" non viene compilato.

Alcuni Googling indica che dovrebbe essere tradotto come "oggetto". Che sembra dovrebbe funzionare. Ma altri indicano che "Void * viene chiamato un puntatore a funzione in termini / C C ++, che in C # termini è un delegato". Questo non fa un sacco di senso qui come ciò che sarebbe delegare? Alcune chiamate simili per altre API trovati attraverso Googling utilizzare altre funzioni nella rispettiva API. Ma in questa API nessun altra chiamata avrebbe senso.

La documentazione per la chiamata mostra un esempio:

z4ctyget(&city, “00000”);

che sembra dimostrare che anche un valore statico potrebbe essere passato.

Si compilerà con oggetto al posto del vuoto *. Non so se questo è giusto e non ho avuto l'opportunità di provarlo (problema di licenza).

È stato utile?

Soluzione

Per il void * parametro si può semplicemente utilizzare un IntPtr

  [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);

Altri suggerimenti

Si può anche usare void * se si contrassegna la classe come non sicuri.

In realtà dipende da ciò che l'API sta cercando in quel parametro.

È possibile aggiungere IntPtr o Oggetto * per ottenere compilatore passato, ma sarà ancora bisogno di passarlo i dati corretti quando si chiama esso.

Per quanto posso dire la dichiarazione di C z4ctyget è:

int z4ctyget(CITY_REC *cityrec, char *zipcode);

Il secondo parametro è una stringa ANSI 5 caratteri che rappresenta il codice di avviamento postale in cui si desidera iniziare la ricerca, o "00000" per cominciare all'inizio del file. Così la vostra dichiarazione deve essere:

[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)]
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top