2013-06-07 2 views
0

정말 잘못하고 있는지 잘 모르겠습니다. C#에서 C로 작성된 문자열에 문자열을 전달하는 중입니다. 그 이유는 문자열이 C DLL에서 NULL로 나오기 때문입니다. 내가 뭘 잘못하고 있는지 알 겠어?관리되지 않는 C 드라이버 (dll)를 호출하는 C#

C :

extern __declspec(dllexport) void Cmd(long CmdType,long DataPar, const char *DataStr); 

void Cmd(long CmdType,long DataPar,const char *DataStr) 
{ 
    // DataStr is NULL here even when passing a string with data in it 
} 

C 번호 :

[DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 

    public static extern void Cmd(long CmdType, long DataPar,[MarshalAs(UnmanagedType.LPStr)]String s); 

    Cmd(1,0,"TEST"); 

는 또한 IntPtr입니다 같은 다른 것들을 시도하고 문자열을 통해 마샬링하지만 모두 NULL과 같은 밝혀했습니다. 그리고 다른 것들도.

답변

2

Microsoft C++ 및 C에서 32 비트 및 64 비트 빌드에서 long은 32 비트입니다.

그러나 C#에서는 long이 항상 64 비트입니다.

그래서 나는 C#에서 Data*으로 C# 코드를 호출하여 스택에 푸시 된 두 개의 64 비트 long 바이트 중 일부 바이트가 튀어 나오고 있다고 생각합니다.

푸시하는 두 번째 매개 변수가 0이기 때문에 값 0 인 바이트가 포인터에 사용되고 있으므로 null입니다.

long 대신 int으로 변경하여 문제를 해결하십시오.

+0

감사합니다 :) – user1499190

0

당신이 아래 옵션을 시도 했 : 당신이 최고야

[DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
    public static extern void Cmd(int CmdType, int DataPar,IntPtr s); 

    Cmd(1,0,Marshal.StringToHGlobalAnsi(str));