将String ^和String ^的集合转换为const char *

时间:2010-05-03 16:05:42

标签: c++-cli

使用VS2008托管C ++来包装dll。本机方法采用一系列单个const char *值和一组char *值。要做一个示例函数:

Function1(char * value1, TF_StringList& catList);  

TF_StringList是一个带有3个插入方法的dll类,我想要使用的是:

TF_StringList::insert(const char* str);  

所以我设置了一个包装方法:

WrapperClass::callFunction(String^ mvalue1, ArrayList mcatList);  

mvalue1使用:

转换为const char *
const char* value1 = (char*)(Marshal::StringToHGlobalAnsi(mvalue1)).ToPointer();  

然而,当到达字符串集合时,我迭代它使用索引获取每个字符串:

String^ mstr = mcatList[i];  

尝试过将String ^转换为const char *的各种方法,并且在每种情况下,TF_StringList :: insert(const char * str)方法都会抛出C2663错误,该错误与值的常量有关。 有什么问题?

2 个答案:

答案 0 :(得分:1)

您的代码段没有帮助,它们无法按给定的方式编译,也不会显示错误的真正来源。查看MSDN Library docs for C2663,它与参数没有任何关系。对象指针是问题所在。

请注意,已发布的StringToHGlobalAnsi()调用是内存泄漏。完成字符串后,在返回的IntPtr上调用Marshal :: FreeHGlobal()。有人将不得不复制它。

答案 1 :(得分:0)

包括

#include <vcclr.h>

然后在范围

{
    String^ s = gcnew String("test string");
    pin_ptr<const wchar_t> str = PtrToStringChars(s);

    size_t origsize = wcslen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    char nstring[newsize];
    wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE);

    CallFunction(&nstring);
}

重要的部分是固定指针,以便它不会在垃圾收集中重新定位。