从 dll 调用函数进行字符集转换时应用程序崩溃
Aplication crashes when calling function from dll for character-set conversion
C 上的函数
TCHAR* __stdcall W1251ToUtf8(CHAR* str)//функция пребразования строки из Windows-1251 в Unicode
{
int wsize = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
TCHAR* result = new TCHAR[wsize*sizeof(TCHAR)];
MultiByteToWideChar(CP_UTF8, 0, str, -1, result, wsize);
return result;
}
c# 项目中的函数声明
[DllImport("D://EncodingStringData.dll", EntryPoint = "W1251ToUtf8")]
static extern string W1251ToUtf8(string str);
函数调用
string TextForEncoding = ReadFromFile();
string OutText = W1251ToUtf8(TextForEncoding);
第一次应用程序无故崩溃,然后我添加 try catch
try
{
string TextForEncoding = ReadFromFile();
string OutText = W1251ToUtf8(TextForEncoding);
}
catch (Win32Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
我捕获了 accessviolationexception,现在又无缘无故地崩溃了。
有人知道我需要做什么吗?
几个问题:
- 您传递 1251 文本,但要求将其视为 UTF8。所以 API 函数调用可能会失败。您不检查 return 值是否失败。
- 您的输入是 8 位文本,您的输出是 16 位文本,但是您的 pinvoke 假定两者都是 8 位。
string
的 return 值类型导致 returned 指针被传递 CoTaskMemFree
以进行释放。
退出代码是 STATUS_HEAP_CORRUPTION,这表明最后一个项目符号是紧迫的问题。通过 returning IntPtr
修复该问题并使用 Marshal.PtrToStringUni
转换为文本。并且还导出一个解除分配器。或者分配一个共享堆。或者 return 一个 COM BStr
。确实使用任何正确的方法 return 一个字符串。
解决该问题后,您还需要解决其他问题。
我不明白你为什么不使用 System.Text.Encoding
。
C 上的函数
TCHAR* __stdcall W1251ToUtf8(CHAR* str)//функция пребразования строки из Windows-1251 в Unicode
{
int wsize = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
TCHAR* result = new TCHAR[wsize*sizeof(TCHAR)];
MultiByteToWideChar(CP_UTF8, 0, str, -1, result, wsize);
return result;
}
c# 项目中的函数声明
[DllImport("D://EncodingStringData.dll", EntryPoint = "W1251ToUtf8")]
static extern string W1251ToUtf8(string str);
函数调用
string TextForEncoding = ReadFromFile();
string OutText = W1251ToUtf8(TextForEncoding);
第一次应用程序无故崩溃,然后我添加 try catch
try
{
string TextForEncoding = ReadFromFile();
string OutText = W1251ToUtf8(TextForEncoding);
}
catch (Win32Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
我捕获了 accessviolationexception,现在又无缘无故地崩溃了。
有人知道我需要做什么吗?
几个问题:
- 您传递 1251 文本,但要求将其视为 UTF8。所以 API 函数调用可能会失败。您不检查 return 值是否失败。
- 您的输入是 8 位文本,您的输出是 16 位文本,但是您的 pinvoke 假定两者都是 8 位。
string
的 return 值类型导致 returned 指针被传递CoTaskMemFree
以进行释放。
退出代码是 STATUS_HEAP_CORRUPTION,这表明最后一个项目符号是紧迫的问题。通过 returning IntPtr
修复该问题并使用 Marshal.PtrToStringUni
转换为文本。并且还导出一个解除分配器。或者分配一个共享堆。或者 return 一个 COM BStr
。确实使用任何正确的方法 return 一个字符串。
解决该问题后,您还需要解决其他问题。
我不明白你为什么不使用 System.Text.Encoding
。