2010-05-03 110 views
0

使用VS2008托管C++来封装dll。本地方法采用一系列单个const char *值和一组char *值。要做出表率作用:将字符串^和字符串^集合转换为常量字符*

Function1(char * value1, TF_StringList& catList); 

TF_StringList是一个DLL类3种插入方法,一个我想使用的是:

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

试过将字符串转换^为const char *和在任何情况下,TF_StringList每路: :insert(const char * str)方法抛出一个C2663错误,它与值的常量有关。 问题是什么?

回答

1

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

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

+0

鉴于错误是在非const函数调用insert(const char * str)上抛出的,它所抱怨的“this”指针是str。我的问题是如何从ArrayList中得到字符串作为插入函数正在查找的“const char *”? 我完全知道char *指针需要清理,但只需要清理已经成功创建的内容。现在我在创建事物时遇到问题。 我的研究表明,您发布的链接仅涵盖了C2663的一个原因。 – 2010-05-03 18:07:28

+0

“this”指针不是str。我建议你发布真正的代码,可以重新编译这个编译错误。 – 2010-05-03 20:10:46

+0

如果您是道歉的话,它所抱怨的这个指针是TF_StringList的实例指针,我声明为const,实例化并试图通过insert方法添加字符串。删除了const修饰符,它工作正常。谢谢 – 2010-05-04 10:58:11

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

的重要组成部分,被钉扎指针,以便它不会对你在一个垃圾收集搬迁。