Como importar o void * c api para c#?
Pergunta
Dada esta declaração da API C, como seria importado para C#?
int _stdcall z4ctyget(CITY_REC *, void *);
Consegui chegar tão longe:
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
Naturalmente em C# o "void *" não compila.
Alguns pesquisando no Google indica que ele deve ser traduzido como "objeto". O que parece que deve funcionar. Mas outros indicam que "void * é chamado de ponteiro de função em termos c/c ++ que em termos c# é um delegado". Isso não faz muito sentido aqui, pois o que ele delegaria? Algumas chamadas semelhantes para outras APIs encontradas através do Google usam outras funções na respectiva API. Mas nesta API, nenhuma outra chamada faria sentido.
A documentação da chamada mostra um exemplo:
z4ctyget(&city, “00000”);
O que parece mostrar que mesmo um valor estático poderia ser aprovado.
Ele compilará com o objeto no lugar do vazio *. Não sei se isso está certo e não tive a oportunidade de testá -lo (problema de licenciamento).
Solução
Para o parâmetro void*, você pode apenas usar um intptr
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
Outras dicas
Você também pode usar o void* se marcar sua classe como inseguro.
Realmente depende do que a API está procurando nesse parâmetro.
Você pode adicionar intptr ou objeto* para superar o compilador, mas ainda precisará passar os dados corretos quando chamá -los.
Tanto quanto posso dizer, a declaração C de Z4CTyget é:
int z4ctyget(CITY_REC *cityrec, char *zipcode);
O segundo parâmetro é uma string ANSI de 5 caracteres representando o código ZIP no qual você deseja iniciar sua pesquisa ou "00000" para começar no início do arquivo. Portanto, sua declaração deve ser:
[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)]
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);