2014-02-04 2 views
0

Мы используем код ниже для печати данных билетов в порту LPT1. Этот код работает отлично в Win-7 Delphi-7 Exe, но тот же код не работает на Win-7 Delphi XE. Я попробовал решение, доступное в сети. но это не помогает мне решить проблемы. Можете ли вы предложить какое-либо решение для этого.CreateFile/WriteFile api в Delphi XE

function TdmDisneyCastTrac.SendToParallelPort(pContent : TStringList): boolean; 
var 
    slPrintLines : TStringList; 
    hFile : THandle; 
    Overlapped : TOverlapped; 
    I : integer; 
    bContentPrinted : boolean; 
    dw : DWORD; 
begin 
    slPrintLines := TStringList.Create; 
    result := True; 
    try 
     slPrintLines.AddStrings(pContent); 
     FillChar(Overlapped, SizeOf(Overlapped),0); 
     I := 0; 
     repeat 
     hFile := INVALID_HANDLE_VALUE; 
     bContentPrinted := True; 
     hFile := CreateFile(PChar('LPT1:'), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
     if hFile = INVALID_HANDLE_VALUE then 
      bContentPrinted := False 
     else 
     begin 
      Overlapped.hEvent := CreateEvent(nil, False, False, nil); 
      if Overlapped.hEvent = 0 then 
       bContentPrinted := False 
      else 
      begin 
       if not WriteFile(hFile, slPrintLines.Text[1], length(slPrintLines.Text), dw, @Overlapped) then 
       case WaitForSingleObject(Overlapped.hEvent, 4000) of // wait 3 seconds 
        WAIT_OBJECT_0 : ; 
        WAIT_TIMEOUT, 
        WAIT_ABANDONED : begin 
            bContentPrinted := False; 
            if hFile <> INVALID_HANDLE_VALUE then 
             CloseHandle(hFile); 
             if Overlapped.hEvent <> 0 then 
              CloseHandle(Overlapped.hEvent); 
            end; 
      end; 
      end; 
      end; 
      inc(I); 
     until bContentPrinted or (I = 3); 
     result := bContentPrinted; 
    finally 
    slPrintLines.Free; 
     if hFile <> INVALID_HANDLE_VALUE then 
     CloseHandle(hFile); 
     if Overlapped.hEvent <> 0 then 
     CloseHandle(Overlapped.hEvent); 
    end; 
end; 

Отмечено: - Это функция Win API.

+0

Просьба описать режим сбоя –

+0

Когда вы говорите, что не работаете - что вы имеете в виду? Сообщение об ошибке? Ничего не печатает? Мусор печатается? Какие? –

+1

Как в сторону, вы передаете пустой список строк этой функции, он умрет ужасно. –

ответ

4

Очевидное изменение заключается в том, что Delphi 7 использует текст ANSI, а XE использует текст UTF-16. Думаю, вам нужно будет явно преобразовать текст в ANSI, чтобы соответствовать предыдущему поведению.

var 
    ansistr: AnsiString; 
.... 
ansistr := AnsiString(slPrintLines.Text); 

Тогда вы можете отправить это в дескриптор файла так же, как и ранее.

В этом коде есть много других проблем, но я не хочу выполнять полную перезапись. Это главная проблема, с которой вы сталкиваетесь.

Прежде чем что-либо сделать, вы должны прочитать белую бумагу Марко Канту по телефону Delphi and Unicode. Нет смысла продолжать, пока у вас не будет хорошее понимание этого серьезного изменения, внесенного в Delphi 2009.