【问题标题】:Converting String^ and Collection of String^ to const char*将 String^ 和 String^ 集合转换为 const char*
【发布时间】:2010-05-03 16:05:42
【问题描述】:

使用 VS2008 Managed 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 错误,这与值的 const 性有关。 有什么问题?

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

    您的代码 sn-ps 没有帮助,它们无法按照给定的方式编译,也没有显示错误的真正来源。查看MSDN Library docs for C2663,它与论点没有任何关系。对象指针是问题。

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

    【讨论】:

    • 鉴于错误是在非常量函数调用 insert(const char* str) 上引发的,它抱怨的“this”指针是 str。我的问题是如何让来自 ArrayList 的字符串成为插入函数正在寻找的“const char *”?我完全知道需要清理 char* 指针,但是只需要清理您成功创建的内容。现在我在创建东西时遇到问题。我的研究表明,您发布的链接仅涵盖 C2663 的一个原因。
    • “this”指针不是str。我建议您发布可以重现此编译错误的真实代码。
    • 对不起,它抱怨的this指针是我声明为const的TF_StringList的实例指针,实例化,并试图通过insert方法添加字符串。删除了 const 修饰符,它工作正常。谢谢
    • @Jim:不用道歉,在这里你可以通过点赞有用的答案来表示抱歉。
    【解决方案2】:

    包括

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

    重要的部分是固定指针,这样它就不会在垃圾回收中重新定位到你身上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多