我有一个问题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和“本地”的世界......
谢谢
你说谎有关的字符串长度 - 这显然更短超过127个字符 - 但只要DECL_FOOAPIDLL宏指定了__stdcall调用约定,它就是正确的。 – ildjarn
您遇到的问题是什么? –
我不能确定如果我可以更好地设置PInvoke c#api,以便我不需要将字符串编组到一个指针......但是在经过一些研究之后,我认为它是唯一一种看到指针在使用后需要被销毁的方法...我应该使用Marshal.sizeof(ptr)来获得正确的字符串长度吗?我简单地尝试了(text.length + 1),但只有一半的字符串是由C++ api接收的。 – devHead