【发布时间】:2013-12-15 21:32:09
【问题描述】:
int __stdcall getProps( /* [ in ] */ void * context,
/* [ in ] */ const UINT32 index,
/* [ in ] */ WCHAR * const pwszFilterPath,
/* [ in, out ]*/ UINT32 * const pFilterPathSizeInCch,
/* [ in ]*/ WCHAR * const pwszFilterName,
/* [ in, out ] */ UINT32 * const pFilterNameSizeInCch );
对于上面签名的 C 函数,这是正确的 C# 签名吗:
[DllImport("myLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public static extern int getProps( IntPtr context,
uint index,
[MarshalAs(UnmanagedType.LPWStr)]
out StringBuilder pwszFilterPath,
ref uint pFilterPathSizeInCch,
[MarshalAs(UnmanagedType.LPWStr)]
out StringBuilder pwszFilterName,
ref uint pFilterNameSizeInCch );
这里出了点问题,我不知道是什么(我不懂 C#)。有时当我让它工作时,我会在 StringBuilder 变量中收到 ANSI 字符串,它们应该包含 UNICODE 字符。
这个想法是调用这个函数两次。首先将 pwszFilterPath 和 pwszFilterName 设置为 NULL,以便检索所需的大小,然后为这两个缓冲区分配内存,然后在第二次调用时检索值。我知道如何在 C/C++ 中做到这一点,但在 C# 中不知道。
【问题讨论】:
标签: c# c++ pinvoke marshalling