Pergunta

Eu preciso chamar uma dll externa de c #. Esta é a definição de cabeçalho:

enum WatchMode { 
   WATCH_MODE_SYSTEM = 0,          
   WATCH_MODE_APPLICATION  = 1 };  

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

Eu adicionei a enumeração ea chamada em C #:

public enum WatchMode
{
    WATCH_MODE_SYSTEM = 0,
    WATCH_MODE_APPLICATION = 1       
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

Isso gera um AccessViolationException. Eu sei que a dll é 'trabalhar' porque eu também adicionamos uma chamada para GetHandle que retorna o hHandle mencionado acima. Eu tentei mudar o param a um int (ref int watchmode), mas obter o mesmo erro. Doesn Alguém sabe como eu pode PInvoke a chamada acima?

Foi útil?

Solução

Você está correndo em uma diferença problema do tamanho de parâmetro entre C # e C ++. No mundo do C ++ / janelas Long é um inteiro assinado de 4 bytes. No mundo do C # longa é um inteiro assinado de 8 bytes. Você deve mudar a sua # assinatura C para tomar um int.

ffpf está errado em dizer que você deve usar um IntPtr aqui. Ele irá corrigir este problema em particular em uma máquina de 32 bits desde que um IntPtr vai empacotar como um int. Se você executar isso em uma máquina de 64 bits vai empacotar como um inteiro assinado de 8 bytes novamente e irá falhar.

Outras dicas

O Managed, Native, e Interop Equipe COM lançou o Assistente Interop PInvoke no CodePlex. Talvez ele pode criar a assinatura adequada. http://www.codeplex.com/clrinterop/Release/ProjectReleases. aspx? ReleaseId = 14120

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