c# Dll调用字符串编码问题

本文关键字:编码 问题 字符串 调用 Dll | 更新日期: 2023-09-27 17:49:56

    StringBuilder codeline = new StringBuilder(100);

    protected virtual int OnCodeLine(int code, int docId, ref StringBuilder codeline)
            {
////
}

这是我得到的*ref StringBuilder*

ĞĞNĞOĞOĞOĞOĞOĞ×ĞØĞUĞĞUĞĞİĞŞĞßĞ一个ĞĞĞ一个ĞĞĞæĞcĞeĞeĞeĞeĞ我ĞĞ我ĞĞğĞNĞOĞOĞOĞOĞOĞ÷ĞøĞUĞĞUĞĞıĞşĞyĞNNNNNNN NNNN

NNNNNNNNNNNNNNNNNNN

仅使用StringBuilder,我只能得到3

这是返回

300 078 9059431

顺便说一下,这是支票中的MICR代码

 [DllImport("mflib.dll")]
    public static extern int mfScanFeeder(int mode, int font, int timeout);
 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
 public delegate int MFS100_CodeLineDelegate(int code, int docId, ref StringBuilder codeline);
 public event MFS100_CodeLineDelegate MFS100_CodeLine;
 private static  MFS100_CodeLineDelegate cache_CodeLine;

更新:这是在vb6中工作的原始代码

    Public Function MFS100_OnCodeline(ByVal code As Long, ByVal docId As Long, ByVal codeline As String) As Long
  Dim i As Integer
  WriteEvent "OnCodeline:"
  WriteEvent "  code = " & code
  WriteEvent "  docId = " & docId
  WriteEvent "  codeline = " & codeline
  MFS100_OnCodeline = -1        ' -1 means: sorting will be done by mfSort()
  g_codeline = codeline
  CScannerForm.TmrSort.enabled = True
End Function
更新2

  mfSetEvent((int)EventEnum.E_EVENT_CODELINE, cache_CodeLine);

[DllImport("mflib.dll")]
        private static extern int mfSetEvent(int eventID, Delegate callsback);

当我使用StringBuilder与ref时,我得到一个字符串32361的长度。没有裁判的第一个值字符串。

OnCodeLine用于回调从扫描设备。是什么?问题吗?

c# Dll调用字符串编码问题

你不应该通过ref传递StringBuilder。当你这样做时,你说你只得到一个字符。这是期望使用ANSI编码但实际接收Unicode (UTF-16)的标志。通过指定字符集来修复它:

[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet=CharSet.Unicode)]
public delegate int MFS100_CodeLineDelegate(int code, int docId, StringBuilder codeline);

我不明白你想要实现什么,但如果你想收集OnCodeLine内部生成的字符串,你不需要通过引用传递StringBuilder,因为它是一个引用类型

只要传递StringBuilder而不带ref,填充它,当你返回时,你就会得到想要的字符串。

关于调用OnCodeLine后得到什么,你能提供一些关于实现的信息吗?

对不起,我没有注意到涉及到PInvoke !(