2012-02-06 2 views
0

У меня есть эта DLL вызов:AccessViolation во PInvoke

[DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall)] 
    public static extern Intf_ErrorType FreqCntIntf_Init(
     ref byte InstNo, 
     string InstName, 
     string PortServerName, 
     ulong UartComPort, 
     ulong MaxBlockTime); 

enum Intf_ErrorType 
{ 
    ... 
} 

И декларация C++ заключается в следующем:

FREQCNTINTF_API Intf_ErrorType STDCALL FreqCntIntf_Init(InstanceNoType* InstNo, const char* InstName, const char* PortServerName, rsuint32 UartComPort, rsuint32 MaxBlockTime); 

где:

typedef enum 
{ 
    .... 
} RSENUM8(Intf_ErrorType); 

#define FREQCNTINTF_API __declspec(dllexport) 
typedef rsuint8 InstanceNoType; 
typedef unsigned char rsuint8; 
#define RSENUM32(EnumName) Enum_##EnumName; typedef rsuint32 EnumName 

Я получаю AccessViolation во время разговора. Где я должен искать ошибку?

+0

ULONG в C# есть 8 байт в ширину, а не 4 байта –

ответ

1

rsuint32 следует указывать как uint, что составляет 4 байта, а не ulong, что в C# составляет 8 байтов. Кроме того, вы можете захотеть, чтобы убедиться, что ваши строки выстроил proplery, указав НабораСимволов, как это:

[DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi)] 
+0

Спасибо, моя вина, я путать долго и внутр. Позор мне :) Но так или иначе это не помогает - мой код бросает AccessViolationException. Я также пробовал все charset - ничего не помогает – Archeg

+0

Нашел проблему. Вместе с тем, что вы указали, я передал одну из строк как null. Кажется, что они не должны быть пустыми. благодаря – Archeg

Смежные вопросы