Delphi XE中的CreateFile/WriteFile api

0 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;
Run Code Online (Sandbox Code Playgroud)

注意: - 这是Win API函数.

Dav*_*nan 5

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

var
  ansistr: AnsiString;
....
ansistr := AnsiString(slPrintLines.Text);
Run Code Online (Sandbox Code Playgroud)

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

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

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