2009-02-06 12 views
8

Dada esta declaración C API, ¿cómo se importaría a C#?Cómo importar void * C API en C#?

int _stdcall z4ctyget(CITY_REC *, void *); 

que he podido llegar hasta aquí:

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

Naturalmente en C# el "void *" no se compila.

Algunos de Google indican que debe traducirse como "objeto". Lo cual parece que debería funcionar. Pero otros indican que "Void * se llama un puntero a la función en términos C/C++ que en términos C# es un delegado". Eso no tiene mucho sentido aquí, ¿a qué debería delegar? Algunas llamadas similares para otras API encontradas a través de Google usan otras funciones en la respectiva API. Pero en esta API ninguna otra llamada tendría sentido.

La documentación de la llamada muestra un ejemplo:

z4ctyget(&city, “00000”); 

que parece mostrar que incluso un valor estático se podría pasar.

Se compilará con el objeto en lugar del vacío *. No sé si esto es correcto y no he tenido la oportunidad de probarlo (problema de licencia).

+0

Supongo que es IntPtr –

+0

¿Qué piensas hacer con el puntero una vez que lo tienes? Supongo que todo lo que necesita es la estructura CITY_REC, y tiene la intención de ignorar 'ptr'? –

+0

@Erik - Bueno, no estoy seguro. La documentación disponible no es clara sobre el propósito del param. –

Respuesta

13

Para el void * parámetro sólo se puede utilizar 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

¡Maldito Jared, 30 segundos! ¡Maldito seas al diablo! - = P –

+0

@Erick :) Tuve pocos premios rápidos hoy – JaredPar

1

También puede utilizar void * si marca la clase como inseguro.

Realmente depende de lo que la API busca en ese parámetro.

Puede agregar IntPtr u Object * para pasar el compilador, pero igual tendrá que pasar los datos correctos cuando lo llame.

0

Por lo que yo puedo decir la declaración C de z4ctyget es:

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

El segundo parámetro es una cadena ANSI 5 caracteres que representa el código postal en la que desea iniciar su búsqueda, o "00000" para comenzar al principio del archivo. Entonces su declaración debe ser:

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

La declaración de C que mostré fue extraída directamente del archivo .h provisto por USPS. –

+0

La documentación de 2007 muestra mi declaración. En cualquier caso, el ejemplo "00000" muestra que la entrada esperada es una cadena (casi seguro ANSI). Entonces mi declaración de C# debería ser lo que estás buscando. –