Einzelnen Beitrag anzeigen

bjoernga

Registriert seit: 26. Nov 2014
3 Beiträge
 
#1

Funktion von PAnsiChar zu PWideChar ändern - wie?

  Alt 14. Dez 2014, 02:16
Delphi-Version: 7
Hallo,

ich habe im alten Borland C++Builder 6 ein Projekt mit Hilfe der Tnt Unicode Controls auf Unicode umgebaut. Anschließend hab ich festgestellt, das beim Drucken immer die Titel der Druckaufträge durch Fragezeichen ersetzt werden, was kein Wunder ist, da die Printers.pas ja immer noch mit AnsiString/AnsiChar arbeitet. Also die Klasse TPrinter in eine neue Unit kopiert und ebenfalls umgestrickt (heißt jetzt TPrinterW), was trotz meiner bescheidenen Delphi-Kenntnisse relativ problemlos war. Nicht problemlos ist allerdings eine Funktion aus TPrinterSetupDialog - ich hab kein Plan, was ich da falsch mache.

Hier die originale Funktion aus der dialogs.pas vom BCB6 (PChar = PAnsiChar):
Delphi-Quellcode:
procedure GetPrinter(var DeviceMode, DeviceNames: THandle);
var
  Device, Driver, Port: array[0..1023] of char;
  DevNames: PDevNames;
  Offset: PChar;
begin
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  if DeviceMode <> 0 then
  begin
    DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
     StrLen(Device) + StrLen(Driver) + StrLen(Port) + 3);
    DevNames := PDevNames(GlobalLock(DeviceNames));
    try
      Offset := PChar(DevNames) + SizeOf(TDevnames);
      with DevNames^ do
      begin
        wDriverOffset := Longint(Offset) - Longint(DevNames);
        Offset := StrECopy(Offset, Driver) + 1;
        wDeviceOffset := Longint(Offset) - Longint(DevNames);
        Offset := StrECopy(Offset, Device) + 1;
        wOutputOffset := Longint(Offset) - Longint(DevNames);;
        StrCopy(Offset, Port);
      end;
    finally
      GlobalUnlock(DeviceNames);
    end;
  end;
end;

Und hier meine WideString-Variante (die W-Funktionen sind aus TntWideStrUtils):
Delphi-Quellcode:
procedure TPrinterSetupDialogW.GetPrinter(var DeviceMode, DeviceNames: THandle);
var
  Device, Driver, Port: array[0..1023] of WideChar;
  DevNames: PDevNames;
  Offset: PWideChar;
begin
  PrinterW.GetPrinter(Device, Driver, Port, DeviceMode);
  if DeviceMode <> 0 then
  begin
    DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
     (WStrLen(Device) + WStrLen(Driver) + WStrLen(Port) + 3) * sizeof(WideChar));
    DevNames := PDevNames(GlobalLock(DeviceNames));
    try
      Offset := PWideChar(PByte(DevNames)) + SizeOf(TDevnames);
      with DevNames^ do
      begin
        wDriverOffset := (Longint(Offset) - Longint(DevNames)) div 2;
        Offset := WStrECopy(Offset, Driver) + 1;
        wDeviceOffset := (Longint(Offset) - Longint(DevNames)) div 2;
        Offset := WStrECopy(Offset, Device) + 1;
        wOutputOffset := (Longint(Offset) - Longint(DevNames)) div 2;
        WStrCopy(Offset, Port);
      end;
    finally
      GlobalUnlock(DeviceNames);
    end;
  end;
end;
Das wird anstandslos kompiliert, aber beim ausführen ploppt jedesmal das CPU-Fenster auf. Der Fehler liegt IMHO irgendwo nach dem "try". Kann mir da jemand helfen?

Vielen Dank!
  Mit Zitat antworten Zitat