我已经为一个C++-DLL写了一个C++/CLI包装器,以便在C#程序中使用该DLL。
C++函数的签名为:
然而,在调用一个需要char*参数的函数时,我会遇到AccessViolation错误。
int Wrapper::Net_methodX(int a, String^ key, long v)
{
IntPtr ptr = Marshal::StringToHGlobalAnsi(key);
pin_ptr<char> cKey = static_cast<char*>(ptr.ToPointer());
int val = methodX(a,cKey, v); // AccessViolation here
Marshal::FreeHGlobal(ptr);
return val;
}
C++函数的签名为:
int methodX(int a, char *Key, long v);
编辑1
仅仅像下面这样“固定”也不起作用:
int Wrapper::Net_methodX(int a, String^ key, long v)
{
IntPtr ptr = Marshal::StringToHGlobalAnsi(key);
char* cKey = static_cast<char*>(ptr.ToPointer());
pin_ptr<char> pinned = cKey;
int val = methodX(a,cKey, v);
Marshal::FreeHGlobal(ptr);
return val;
}
编辑1结束
编辑2
我也尝试了以下方式使用PtrToStringChars(感谢Matt,我还在这里找到了一些文档here):
int Wrapper::Net_methodX(int a, String^ key, long v)
{
pin_ptr<const wchar_t> wkey = PtrToStringChars(key);
size_t convertedChars = 0;
size_t sizeInBytes = ((key->Length + 1) * 2);
errno_t err = 0;
char * ckey = (char * ) malloc(sizeInBytes);
err = wcstombs_s(&convertedChars, ckey, sizeInBytes, wkey, sizeInBytes);
int val = methodX(A_Symbol_Table,ckey, Value);
return val;
}
仍然发生AccessViolation,可能是方法X()(第三方DLL)中的错误。
编辑2结束
我已经阅读了一些相关的问题,但还没有找到解决方案。
有什么提示吗? 谢谢。
marshal_as<const char*>
对我非常有效,之前使用Marshal::StringToHGlobalAnsi
时遇到了麻烦。 - KChaloux