【发布时间】:2010-12-15 21:42:35
【问题描述】:
我正在使用 Thottam R. Sriram http://blogs.msdn.com/b/thottams/archive/2007/06/02/pinvoke-reverse-pinvoke-and-stdcall-cdecl.aspx 所描述的 PInvoke,反向 PInvoke 方案
除了将字符串从 C++ 传递到 C 之外,一切似乎都运行良好。
(在 Sriram 中,字符串是用 c# 构造的,并通过 c++ 原封不动地传递,因此避免了这个问题。)
c#代码如下所示
class Program
{
public delegate void callback(string str);
public static void callee(string str)
{
System.Console.WriteLine("Managed: " + str);
}
static void Main(string[] args)
{
gpscom_start(new callback(Program.callee));
Console.WriteLine("NMEA COM Monitor is running");
System.Threading.Thread.Sleep(50000);
}
[DllImport("gpscomdll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void gpscom_start(callback call);
}
C++ 代码如下所示
extern "C" dllapi void __stdcall gpscom_start(void (__stdcall *callback) (BSTR str))
{
BSTR bstr = SysAllocString(L"starting monitor");
(*callback)(bstr);
SysFreeString(bstr);
运行时,除了回调字符串,一切看起来都很好
Managed: m
看起来像是一个 ANSI 例程打印出来的 UNICODE 字符串,但 C# 字符串肯定是 unicode 吗?
TIA
【问题讨论】: