使用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错误,该错误与值的常量有关。 有什么问题?
答案 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);
}
重要的部分是固定指针,以便它不会在垃圾收集中重新定位。