IJW C#到MC ++到C ++将字符串数组传递给char **

时间:2015-03-18 18:59:49

标签: c++-cli

有谁知道如何固定以下字符串数组参数:

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]);
}

1 个答案:

答案 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;