Pregunta

Estoy usando una DLL escrito en C ++ en mi proyecto de C #. He sido capaz de llamar a las funciones dentro de la DLL utilizando este código:

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

Ahora tengo que llamar a una función que requres un puntero de tipo personalizado. El Docs para la DLL de diseño La función como esta:

hid_get_info(int n,PDEV_INFO *pdi)

No sé cómo utilizar este puntero personalizado. Se define esta en el archivo DLL? Si es así, ¿cómo puede utilizarlo de proyecto de C #? Si no lo necesito incluir el archivo de cabecera en C #? Gracias de antemano por tu ayuda.

¿Fue útil?

Solución

Dada la "P" como prefijo, parece que la declaración es verdadera

hid_get_info(int n, DEV_INFO **pdi)

donde dev_info es una estructura. Tendrá que encontrar la declaración de esta estructura y añadirlo a su código C # con el atributo [StructLayout]. A continuación, tendría declara la función como esto en su código C #:

[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);

y utilizar Marshal.PtrToStructure () para obtener el valor de estructura. Esperemos que no tiene que liberar la estructura, estaría jodido.

A segunda interpretación es que "PID" devuelve una matriz de punteros a dev_info estructuras. Algo probable dado el argumento de la "n", que bien podría significar el número de elementos de la matriz se pasan a ser llenado por la función. En ese caso, pasar una IntPtr [] y ajuste "n" a su longitud.

Otros consejos

Es necesario crear un struct en C # que refleja el PDEV_INFO struct C ++ en C ++.

Usted debe aplicar [StructLayout(LayoutKind.Sequential)] a la estructura y luego copiar los campos de la estructura C ++ (mira el archivo de cabecera) en orden.

A continuación, puede escribir un método que toma la extern struct como parámetro ref.

Vamos a suponer con seguridad PDEV_INFO* es un DEV_INFO**.

Con esto en C #:

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top