【发布时间】:2010-12-09 09:21:25
【问题描述】:
我为 C++-DLL 编写了 C++/CLI 包装器,以便在 C# 程序中使用该 DLL。
但是,当我调用一个需要 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 以下方式(感谢马特,还找到了一些文档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 仍然发生,可能是 methodX() 中的错误(这是一个第三方 DLL)。
编辑 2 结束
我在这里阅读了一些相关问题,但尚未找到解决方案。
有什么提示吗? 谢谢。
【问题讨论】: