4

这是我在 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。知道这里出了什么问题吗?

4

1 回答 1

6

您可以简单地Address通过ref. 您还需要确保调用约定匹配。在我看来,本机代码好像是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);
}
于 2013-06-11T08:00:33.120 回答