簡體   English   中英

C#調用非托管C驅動程序(DLL)

[英]C# calling an unmanaged C driver(dll)

我真的不確定我做錯了什么。 我正在將一個字符串傳遞給我用C#編寫的Cll作為網絡狀態下的大量示例..由於某種原因,字符串在C dll中顯示為NULL。 我知道我做錯了什么?

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相同。 還有一堆其他的東西。

在Microsoft C ++和C中,在32位和64位構建上,long只有32位。

但是,在C#中,long總是64位。

所以我認為正在發生的是,C#調用被壓入堆棧的兩個64位長的一些字節被彈出作為C ++中的Data*

因為您要推送的第二個參數是0,所以會發生值為0的字節用於指針,因此它為空。

將聲明更改為int而不是long來解決您的問題。

您是否嘗試過以下選項:

    [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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM