【发布时间】:2014-01-03 21:53:48
【问题描述】:
我有一个使用 pinvoke 从 C# 项目调用的本机 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 应该填充到 C# 端的 char 数组或字符串中,即我需要复制 ptr 指向 C# 文件中的 int 数组的位置的内容。如果我知道长度,我可以使用 Marshal.Copy 来做同样的事情。我现在该怎么做?另外,我不希望使用不安全的。 Globalsize 对此有帮助吗?
【问题讨论】:
-
没有
fun的界面更多信息,无从得知。如果您不能 100% 确定内存是使用 GlobalAlloc() 分配的,则不能使用 GlobalSize。如果您对fun了解更多,可能会有提示,例如标记值。 -
这就是为什么几乎每个使用数组指针also 的c++ 函数都使用数组长度的原因。没有办法知道!
-
您应该做的是在托管代码中分配数组并将其传递给本机代码以让本机代码填充它。对于 int 元素,在托管端是 int[],在本机端是 int*。如果 int** 是正确的解决方案,我会感到非常惊讶。