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用于回调 来自扫描仪设备。是什么 问题?
答案 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参与了!! :(