2012-06-29 42 views
0

我有一个问题PInvoking本地函数从C++ ...我有PInvoked所有其他本机函数没有问题(参数是非常简单的转换)。下面是C++原型及其在C++中使用:PInvoke C++函数在C#中使用

DECL_FOOAPIDLL DWORD WINAPI FOO_Command(
VOID *Par, //pointer to the parameter(s) needed by the command 
DWORD Len, //length of Parameter in bytes 
DWORD Id //identification number of the command 
); 

用法:

static DWORD DoSomething(WCHAR *str) 
{ 
DWORD len = (wcslen(str)+1)*sizeof(WCHAR); 
DWORD ret = FOO_Command((VOID *)str,len,FOOAPI_COMMAND_CLOSE); 
return(ret); 
} 

我的C#的PInvoke:

[DllImport("FOO.dll")] 
    static public extern uint FOO_Command(IntPtr par, uint len, uint id); 

private void DoSomething() 
{ 

    string text = "this is a test"; 
    IntPtr ptr = Marshal.StringToHGlobalUni(text); 

    uint hr = FOO_Command(ptr,255, FOOAPI_COMMAND_CLOSE); 

    Marshal.FreeHGlobal(ptr); 

} 

1)这是对的PInvoke这个API的正确方法是什么? 2)我怎么能得到ptr的大小,我有255作为parm?

以上的工作,但我是新来的PInvoke和“本地”的世界......

谢谢

+0

你说谎有关的字符串长度 - 这显然更短超过127个字符 - 但只要DECL_FOOAPIDLL宏指定了__stdcall调用约定,它就是正确的。 – ildjarn

+0

您遇到的问题是什么? –

+0

我不能确定如果我可以更好地设置PInvoke c#api,以便我不需要将字符串编组到一个指针......但是在经过一些研究之后,我认为它是唯一一种看到指针在使用后需要被销毁的方法...我应该使用Marshal.sizeof(ptr)来获得正确的字符串长度吗?我简单地尝试了(text.length + 1),但只有一半的字符串是由C++ api接收的。 – devHead

回答

1
private void DoSomething() 
{ 

    string text = "this is a test"; 
    IntPtr ptr = Marshal.StringToHGlobalUni(text); 

    uint hr = FOO_Command(ptr, (text.Length + 1) * 2, FOOAPI_COMMAND_CLOSE); 

    Marshal.FreeHGlobal(ptr); 

} 
+0

您能否解释* 2?... – devHead

+1

* 2是为了说明UTF-16字符单位为2个字节宽的事实。 C++代码使用'* sizeof(WCHAR)'来实现相同的效果。 –

+0

对不起,花了这么长时间,谢谢 – devHead