我们正在使用Below代码在LPT1端口中打印票证数据。这些代码在Win-7 Delphi-7 Exe中运行良好,但相同的代码不适用于Win-7 Delphi XE。 我试过net中提供的解决方案。但它并没有帮助我解决问题。请你能为此提出任何解决方案。
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 :(得分:5)
显而易见的变化是Delphi 7使用ANSI文本,而XE使用UTF-16文本。我想你需要明确地将文本转换为ANSI才能匹配以前的行为。
var
ansistr: AnsiString;
....
ansistr := AnsiString(slPrintLines.Text);
然后您可以像以前一样将其发送到文件句柄。
此代码中还有许多其他问题,但我不想执行完整的重写。这是您面临的主要问题。
在你做任何其他事情之前,你必须阅读MarcoCantù关于Delphi and Unicode的白皮书。在您对Delphi 2009中引入的这一重大突破性变化有充分了解之前,没有必要继续下去。