Мы используем код ниже для печати данных билетов в порту 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.
Просьба описать режим сбоя –
Когда вы говорите, что не работаете - что вы имеете в виду? Сообщение об ошибке? Ничего не печатает? Мусор печатается? Какие? –
Как в сторону, вы передаете пустой список строк этой функции, он умрет ужасно. –