我有一个本机C ++函数,我使用pinvoke从C#项目调用。
extern "C" _declspec(dllexport) void GetCmdKeyword( wchar_t** cmdKeyword, uint pCmdNum )
{
int status = 1;
int count = 0;
int i = 0;
if( cmdKeyword == NULL )
return ERR_NULL_POINTER;
//search command in command list by letter from 'A' to 'Z'
count = sizeof( stCommandList ) / sizeof( COMMANDLIST ) ;
for ( i = 0 ; i < count && status != 0; i++ )
{
if ( pCmdNum != stCommandList[i].ulCommand )
continue;
*cmdKeyword = &stCommandList[i].CommandKeyWord[0];
status = 0 ;
}
}
其中stCommandList是COMMANDLIST类型的结构,CommandKeyWord成员是char数组。
要从C#调用此函数,我需要传递什么参数? cmdKeyword应填充在char数组或C#端的字符串中,即我需要复制ptr指向C#文件中的int数组的位置的内容。如果我知道长度,我可以使用Marshal.Copy来做同样的事情。我现在该怎么办?另外,我不想使用不安全的。 Globalsize对此有帮助吗?
答案 0 :(得分:1)
您无法从指针推断出长度。必须将信息作为单独的值与指向数组的指针一起传递。
我想知道你为什么使用原始IntPtr
而不是C#数组。我认为您在之前的问题中接受的答案包含您需要的代码:Pinvoking a native function with array arguments。
好的,看看问题的编辑,实际情况有点不同。该函数返回一个指向以null结尾的宽字符数组的指针。你的pinvoke应该是:
[DllImport(...)]
static extern void GetCmdKeyword(out IntPtr cmdKeyword, uint pCmdNum);
这样称呼:
IntPtr ptr;
GetCmdKeyword(ptr, cmdNum);
string cmdKeyword = Marshal.PtrToStringUni(ptr);