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

时间:2011-04-12 07:23:16

标签: c# .net dll pinvoke

    StringBuilder codeline = new StringBuilder(100);


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

这就是我用* ref StringBuilder *

所得到的
  
    

ĞĞÑĞÒĞÓĞÔĞÕĞĞĞ×ĞĞĞÙĞĞÙĞĞÛĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞĞÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ     NNN

  
     

ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ

仅限StringBuilder 我只得到3

这是它想要返回的

300 078 9059431

顺便说一下,来自Checks的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用于回调 来自扫描仪设备。是什么 问题?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

只需传递不带引用的StringBuilder ,填充它,当你返回时,你将拥有所需的字符串。

关于调用OnCodeLine后得到的内容,您能否提供一些有关实施的信息?

对不起,我没注意到PInvoke参与了!! :(