Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++代码使用 *sisiof(WCHAR)实现相同的效果。
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); 

}