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).

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top