Delphi XE中的CreateFile / WriteFile api

时间:2014-02-04 14:38:06

标签: delphi createfile

我们正在使用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函数。

1 个答案:

答案 0 :(得分:5)

显而易见的变化是Delphi 7使用ANSI文本,而XE使用UTF-16文本。我想你需要明确地将文本转换为ANSI才能匹配以前的行为。

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

然后您可以像以前一样将其发送到文件句柄。

此代码中还有许多其他问题,但我不想执行完整的重写。这是您面临的主要问题。

在你做任何其他事情之前,你必须阅读MarcoCantù关于Delphi and Unicode的白皮书。在您对Delphi 2009中引入的这一重大突破性变化有充分了解之前,没有必要继续下去。