有谁知道如何固定以下字符串数组参数:
function signature int TestMethod(int argc, array<String^>^ data)
{
pin_ptr<char> p1 = &data[0];
char** p2 = &p1[0];
// char** argv = (char**)calloc(argc+1, sizeof(char*));
}
我想固定一个array<String^>^
对象并将其转换为以下内容:
char** argv = (char**)calloc(argc+1, sizeof(char*));
所以我可以将它传递给原生的c ++函数
任何想法?
以下情况如何?
更新:好奇吗?以下怎么样?
char** argv = (char**)calloc(argc+1, sizeof(char*));
for (int i = 0; i < data->Length; i++)
{
argv[i] = (char*)Marshal::StringToHGlobalAnsi(data[i]).ToPointer();
}
// Use argv as needed here...
// Cleanup
for (int i = 0; i < data->Length; i++)
{
Marshal::FreeHGlobal((IntPtr)argv[i]);
}
答案 0 :(得分:1)
您无法直接将托管String^
固定到char*
。 .NET字符串实际上是每个字符2个字节,因此您需要手动编组数据。这可能需要建立角色阵列,将数据复制到其中,然后在完成后进行清理。
在这种情况下,您可能需要将数据复制到char**
,使用它,然后自行清理。这可以通过以下方式完成:
// Requires #include <msclr\marshal.h>
marshal_context context;
char** argv = new char*[data->Length];
for (int i=0;i<Length;++i)
{
const char* tmp = context.marshal_as<const char*>(clrString);
int length = strlen(tmp);
argv[i] = new char[length+1]();
strncpy(argv[i],tmp,length);
}
// Use argv as needed here...
// Cleanup
for (int i=0;i<Length;++i)
delete[] argv[i];
delete[] argv;