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用于回调从扫描设备。是什么?问题吗?
你不应该通过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 !(