Pergunta

Eu ainda tenho que encontrar uma boa referência sobre este tema. Para este exemplo vamos dar algum código C ++ que eu estou tentando porta sobre a C #.

terreno em C ++, temos o seguinte protótipo para uma função de biblioteca externa:

extern "C" DWORD EXPORT FILES_GetMemoryMapping(
  PSTR pPathFile,
  PWORD Size,
  PSTR MapName,
  PWORD PacketSize,
  PMAPPING pMapping,
  PBYTE PagesPerSector);

e ele é usado como tal:

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);

Agora eu estou tentando porta a primeira linha sobre a C # e aqui é onde eu sou apresentado com nenhum caminho claro.

Este é o que eu tenho até agora:

[DllImport("Files.DLL")]
public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)]
    string pPathFile,
    out ushort Size,
    [MarshalAs(UnmanagedType.LPStr)]
    string MapName,
    out ushort PacketSize,
    IntPtr pMapping,
    out byte PagesPerSector);

Agora, a pergunta é: Existe algum bom guia lá fora, que me diz "PSTR pPathFile" deve ser "[MarshalAs (UnmanagedType.LPStr)] string pPathFile" ... Supondo que está correto

Ou, a que um ponteiro para um struct "PMAPPING" se torna um "out IntPtr pMapping" ... assumindo que é correto?

Qualquer ajuda sobre este caras?

Foi útil?

Solução

Eu ainda tenho que encontrar uma boa referência sobre este tema

Aqui está.

Curiosamente, o site está no momento, mas é um recurso muito bom para mobilizar problemas. Nesse meio tempo, você pode usar arquivo de pinvoke.net de Archive.net em http://web.archive.org/web/20080202041852/http://www.pinvoke.net

Outras dicas

Isso parece certo. A primeira parte da sua pergunta (relativa a MarshalAs) diz ao compilador para converter o C # variável gerenciado em um PSTR. Empacotamento no ambiente .NET refere-se a transferência de dados entre o ambiente gerenciados e não gerenciados. Estes atributos (entre vários outros) dizer ao compilador como fazê-lo especificamente.

O segundo ponto indica que ele vai passar um ponteiro para a estrutura. O tipo IntPtr em .NET é um tipo gerenciado que é usado para segurar uma determinada peça de memória. No mundo da NET, ponteiros (em geral) não existem, embora ainda existem tipos de referência. Ponteiro e gestão de punho é feito para nós pelo CLR. O struct IntPtr é usado quando o empacotamento ponteiros para estruturas de dados ou tipos primitivos

Além de site P / Invoke , Adam Nathan 's NET e cOM: O Guia completo Interoperabilidade é algo que vale a pena acrescentar à sua estante se você tiver mais do que um interesse passageiro em interoperabilidade .NET

.

Kev

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top