2009-02-06 6 views
8

Compte tenu de cette déclaration d'API C, comment serait-il importé en C#?Comment faire pour importer void * C API en C#?

int _stdcall z4ctyget(CITY_REC *, void *); 

Je suis en mesure d'obtenir jusqu'ici:

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

naturellement en C# le "vide *" ne compile pas.

Certains googling indique qu'il devrait être traduit comme "objet". Ce qui semble devoir fonctionner. Mais d'autres indiquent que "Void * est appelé un pointeur de fonction en C/C++ qui en termes C# est un délégué". Cela n'a pas beaucoup de sens ici, en quoi déléguerait-il? Certains appels similaires pour d'autres API trouvées dans Googling utilisent d'autres fonctions dans l'API respective. Mais dans cette API, aucun autre appel n'aurait de sens.

La documentation de l'appel montre un exemple:

z4ctyget(&city, “00000”); 

qui semble montrer que même une valeur statique pourrait être adoptée.

Il compilera avec l'objet à la place du vide *. Je ne sais pas si c'est juste et je n'ai pas eu l'occasion de le tester (problème de licence).

+0

Ma proposition est IntPtr –

+0

Qu'avez-vous l'intention de faire avec le pointeur une fois que vous l'avez? Je suppose que tout ce dont vous avez besoin est la structure CITY_REC, et vous avez l'intention d'ignorer 'ptr'? –

+0

@Erik - Eh bien, je ne suis pas sûr. La documentation disponible n'est pas claire sur l'objectif du param. –

Répondre

13

Pour le paramètre void * vous pouvez simplement utiliser un IntPtr

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

Darn vous Jared, 30 secondes! Vous allez droit au diable! - = P –

+0

@Erick :) Quelques victoires rapides ont été remportées aujourd'hui – JaredPar

1

Vous pouvez également utiliser void * si vous marquez votre classe comme dangereux.

Cela dépend vraiment de ce que l'API recherche dans ce paramètre.

Vous pouvez ajouter IntPtr ou Object * pour obtenir le compilateur passé, mais vous devrez toujours lui transmettre les données correctes lorsque vous l'appelez.

0

Pour autant que je peux dire la déclaration C de z4ctyget est:

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

Le second paramètre est une chaîne ANSI 5 caractères représentant le code postal auquel vous voulez commencer votre recherche ou « 00000 » à commence au début du fichier. Donc, votre déclaration devrait être:

[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)] 
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode); 
+0

La déclaration C que j'ai montrée a été tirée directement du fichier .h fourni par USPS. –

+0

La documentation de 2007 montre ma déclaration. Dans tous les cas, l'exemple "00000" montre que l'entrée attendue est une chaîne (presque certainement ANSI). Donc, ma déclaration C# devrait être ce que vous cherchez. –

Questions connexes