簡體   English   中英

將C#結構的指針傳遞給C ++ API

[英]Passing a pointer of C# structure to C++ API

這是我在C ++ dll中的結構和功能

struct Address
{
    TCHAR* szAddress;
};

extern "C" DllExport void SetAddress(Address* addr);

從C#中,我想通過傳遞地址結構來調用此API。 所以,我在C#中有以下內容

[StructLayout(LayoutKind.Sequential)] 
public struct Address
{
    [MarshalAs(UnmanagedType.LPTStr)]
    public String addressName;
}

[DllImport("Sample.dll")]
extern static void SetAddress(IntPtr addr);

現在,這就是我從C#調用C ++ API的方式

Address addr = new Address();
addr.addressName = "Some Address";
IntPtr pAddr = Marshal.AllocHGlobal(Marshal.SizeOf(addr));
Marshal.StructureToPtr(addr , pAddr , false);
SetAddress(pAddr); //CALLING HERE

我在C ++代碼中獲取Address.szAddress的NULL。 知道這里出了什么問題嗎?

您可以簡單地通過ref傳遞Address結構。 您還需要確保調用約定匹配。 在我看來,本機代碼是cdecl 最后, UnmanagedType.LPTStr表示Win9x上的ANSI和其他地方的Unicode。 因此,如果本機代碼需要UTF-16字符串,則這是適當的。 如果期望使用ANSI,則改用UnmanagedType.LPStr

該代碼可以正常工作,並且本機代碼會接收C#代碼中指定的字符串。

[StructLayout(LayoutKind.Sequential)]
public struct Address
{
    [MarshalAs(UnmanagedType.LPTStr)]
    public string addressName;
}

[DllImport(@"test.dll", CallingConvention=CallingConvention.Cdecl)]
extern static void SetAddress(ref Address addr);

static void Main(string[] args)
{
    Address addr;
    addr.addressName = "boo";
    SetAddress(ref addr);
}

暫無
暫無

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

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