C# 平沃克C++;在C中使用的函数# 我有一个问题,从C++调用一个本地函数…我对所有其他本机函数都进行了pinvo,没有任何问题(params是非常简单的转换)。下面是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 );
用法:C# 平沃克C++;在C中使用的函数# 我有一个问题,从C++调用一个本地函数…我对所有其他本机函数都进行了pinvo,没有任何问题(params是非常简单的转换)。下面是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 );,c#,c++,pinvoke,marshalling,C#,C++,Pinvoke,Marshalling,用法: 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: 1) 这是PInvoke这个API的正确方法吗? 2) 我如何获得ptr的大小,其中我有255作为parm 以上这些确实有效,但我对平沃克和“本
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:
1) 这是PInvoke这个API的正确方法吗?
2) 我如何获得ptr的大小,其中我有255作为parm
以上这些确实有效,但我对平沃克和“本土”世界还不熟悉
谢谢你你在你的字符串长度上撒了谎——它明显短于127个字符——但如果
DECL\u FOOAPIDLL
宏指定了\u stdcall
调用约定,它在其他方面是正确的。你遇到了什么问题?我不确定我是否可以更好地设置PInvoke c\35; api,这样我就没有需要将字符串封送到指针。。。但经过一些研究,我认为这是唯一的办法,看看指针在使用后需要如何销毁。。。我应该使用Marshal.sizeof(ptr)来获取字符串的正确长度吗?我尝试了(text。长度+ 1),但是只有一半的字符串是由C++ API接收的……* 2是为了解释UTF 16字符单元是2字节宽的事实。C++代码使用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);
}
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);
}