C # Dll вызывает проблему кодирования строки - PullRequest
0 голосов
/ 12 апреля 2011
    StringBuilder codeline = new StringBuilder(100);


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

Это то, что я получаю с * ref StringBuilder *

ĞÑĞÒĞÓĞÔĞÕĞÖĞ × ĞØĞÙĞÚĞÛĞÜĞİĞŞĞßĞàĞáĞâĞãĞäĞåĞæĞçĞèĞéĞêĞëĞìĞíĞîĞïĞğĞñĞòĞóĞôĞõĞöĞ ÷ ĞøĞùĞúĞûĞüĞıĞşĞÿĞÑÑÑÑÑÑ NNN

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

и только с 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 для обратного вызова со сканера устройства. Что проблема?

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

Вы не должны передавать StringBuilder по ссылке.Когда вы делаете это, вы говорите, что получаете только одного персонажа.Это признак ожидания кодирования ANSI, но фактического получения Unicode (UTF-16).Исправьте это, указав набор символов:

[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet=CharSet.Unicode)]
public delegate int MFS100_CodeLineDelegate(int code, int docId, StringBuilder codeline);
1 голос
/ 12 апреля 2011

Я не понимаю, чего вы пытаетесь достичь, но если вы хотите собрать строку, сгенерированную внутри OnCodeLine, вам не нужно передавать StringBuilder по ссылке, так как это ссылочный тип .

Просто передайте StringBuilder без ref , заполните его, и когда вы вернетесь, у вас будет нужная строка.

Относительно того, что вы получите после вызоваOnCodeLine, можете ли вы предоставить некоторую информацию относительно реализации?

Извините, я не заметил, что PInvoke был вовлечен !!(

...