从dll调用函数进行字符集转换时,应用程序崩溃

时间:2016-11-13 22:58:06

标签: c# character-encoding pinvoke dllimport

f的功能

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#project中的函数声明

[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,现在没有理由崩溃了。

所以没有人不需要我做什么?

1 个答案:

答案 0 :(得分:0)

一些问题:

  • 您传递了1251个文字,但要求将其视为UTF8。因此API函数调用可能会失败。您不检查失败的返回值。
  • 您的输入是8位文本,输出是16位文本,但您的pinvoke假设两位都是8位。
  • 返回值类型RequestException in CurlFactory.php line 187: cURL error 56: Recv failure: Connection timed out (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) 导致返回的指针被传递string以进行解除分配。

退出代码是STATUS_HEAP_CORRUPTION,表明最终的子弹是当前问题。通过返回CoTaskMemFree并使用IntPtr转换为文本来解决此问题。并且还导出deallocator。或者分配共享堆。或者返回COM Marshal.PtrToStringUni。确实使用任何正确的方法来返回字符串。

解决了这个问题,你也需要修复其他问题。

您不会使用BStr的原因超出了我的范围。