Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WriteBinary Registry - Datenformat (https://www.delphipraxis.net/199780-writebinary-registry-datenformat.html)

TKNU 19. Feb 2019 20:36

WriteBinary Registry - Datenformat
 
Hallo zusammen,

stehe gerade etwas auf dem Schlauch.

In meinem aktuellen Projekt (noch in Delphi 6) werden mit Write- & ReadBinary aus der Unit Registry Druckereigenschaften (DEVMODE) gelesen & geschrieben. Geht auch, funktioniert aber nicht:


Im Regedit sieht der Original - Eintrag z.B. so aus:

43 00 54 00 EA 00 etc.

Wenn ich über WriteBinary schreibe, erhalte ich die folgende Ansicht:

43 54 EA … -> fehlt also jeweils das 2. Byte (0). Wird dann leider auch vom Druckertreiber nicht erkannt.

Was übersehe ich?

Delphi.Narium 19. Feb 2019 20:41

AW: WriteBinary Registry - Datenformat
 
Unicode <-> Nicht Unicode?

TKNU 19. Feb 2019 20:53

AW: WriteBinary Registry - Datenformat
 
Stimmt - das könnte eine Erklärung sein. Eine Idee, wo ich das umstelle?

Der WriteBinary Befehl in meinem Programm sieht wie folgt aus:

reg.WriteBinaryData(device,printerdevmode,devmodes ize);

wobei printerdevmode vom Typ tdevmode ist.

Problem von Delphi6?

Delphi.Narium 19. Feb 2019 21:14

AW: WriteBinary Registry - Datenformat
 
Da wird es jetzt eher schwierig was sinnvolles als Tipp abzugeben.

Delphi würd' ich jetzt erstmal keine Schuld zuweisen, binär ist binär, egal was da drinne steht, ob nun jedes zweite Byte 00 ist oder nicht, sollte bei diesem Datentyp eigentlich eher egal sein.

Den Inhalt des Binärtypes hast Du "irgendwo" her, vom Drucker, über 'ne API ... (keine Ahnung).

Kannst Du diese Werte irgendwie auslesen? Wenn ja, einmal mit Delphi 6 und einmal mit dem aktuellen Delphi?

Diese Werte dann vergleichen, gibt's Unterschiede?

Von was für 'nem Drucker reden wir hier, hat der irgendwas besonderes oder wurde da nur das Datenformat zwischen zwei Treiberversionen, Windowsversionen, werwiewowasauchimmer geändert und Du stolperst hier nur gerade über einen Nebeneffekt, der suggeriert, dass die Ursache bei Delphi 6 liegen könnte?

TKNU 19. Feb 2019 21:22

AW: WriteBinary Registry - Datenformat
 
Ausgelesen wird hiermit:


gpResult := WinSpool.GetPrinter(
PrinterHandle,
LEVEL_2,
pBuffer,
bytesNeeded,
@bytesNeeded
);
if gpResult then
begin
printerInfo := PPrinterInfo2(pBuffer)^;
move(printerInfo.pDevMode^,printerdevmode,printerI nfo.pDevMode^.dmSize+printerInfo.pDevMode^.dmDrive rExtra);
end;


Es geht darum, bestimmte Druckeigenschaften (doppelseitig etc.) zu setzten und mit einer Arbeitsdatei zusammen zu speichern. Sind Standarddrucker von HP.

Ich muss mal schauen, wo hier Unicode auftaucht und wo nicht.

Delphi.Narium 19. Feb 2019 21:32

AW: WriteBinary Registry - Datenformat
 
Mach Dir bitte zwei Programmversionen, eine Delphi 6 und eine aktuelles Delphi.

Stimmen die gelesenen Werte überein?

TKNU 19. Feb 2019 21:59

AW: WriteBinary Registry - Datenformat
 
Habe erstmal eine lauffähige Version mit Umwegen.

- devmode per copymemory in ein Byte Array kopieren,
- dann dieses in ein 2. Array kopieren, aber in 2er Schritten und die 0 manuell einfügen


Probiere es morgen aber mal in der Fa. mit der aktuellen Version aus. Interessiert mich dann doch :-D

HolgerX 20. Feb 2019 04:38

AW: WriteBinary Registry - Datenformat
 
Hmm...

Zitat:

Zitat von TKNU (Beitrag 1426027)
Habe erstmal eine lauffähige Version mit Umwegen.

- devmode per copymemory in ein Byte Array kopieren,
- dann dieses in ein 2. Array kopieren, aber in 2er Schritten und die 0 manuell einfügen


Probiere es morgen aber mal in der Fa. mit der aktuellen Version aus. Interessiert mich dann doch :-D


Das ist murks....

D6 verwendet von GetPrinter immer per default die ANSI-Version, welche ein PRINTER_INFO_2 mit Ansi-Strings liefert.
Verwende stattdessen direkt GetPrinterW mit PRINTER_INFO_2W und Du erhälst alle Strings als WideSting, somit incl. des 2. Bytes je Char.

TKNU 20. Feb 2019 12:43

AW: WriteBinary Registry - Datenformat
 
Perfekt - hat bestens funktioniert. Den Murks habe ich schon gelöscht :-D:-D:-D

TKNU 22. Feb 2019 22:52

AW: WriteBinary Registry - Datenformat
 
In diesem Zusammenhang noch eine Frage:

Gibt es eine Möglichkeit DevmodeA und DevmodeW gegenseitig zu konvertieren?

HolgerX 23. Feb 2019 06:17

AW: WriteBinary Registry - Datenformat
 
Hmm..

StringToWideChar
WideCharToString

....

TKNU 24. Feb 2019 16:33

AW: WriteBinary Registry - Datenformat
 
Danke für die erneute Hilfe :-)

Die Richtung StringToWideChar funktioniert ohne Probleme-

Die andere Richtung bekomme ich nicht hin - die Einträge dmDeviceName und dmforms haben den Dateintyp:

array[0..CCHDEVICENAME - 1] of WideChar;

Ich bekomme diesen Typ nicht mit WideCharToString konvertiert (falscher Typ). Was mache ich wieder falsch? Bei diesem Thema bin ich komplett durcheinander ….

Danke schon mal

peterbelow 25. Feb 2019 11:17

AW: WriteBinary Registry - Datenformat
 
Zitat:

Zitat von TKNU (Beitrag 1426341)
Danke für die erneute Hilfe :-)

Die Richtung StringToWideChar funktioniert ohne Probleme-

Die andere Richtung bekomme ich nicht hin - die Einträge dmDeviceName und dmforms haben den Dateintyp:

array[0..CCHDEVICENAME - 1] of WideChar;

Ich bekomme diesen Typ nicht mit WideCharToString konvertiert (falscher Typ). Was mache ich wieder falsch? Bei diesem Thema bin ich komplett durcheinander ….

Danke schon mal

WidecharToString erwartet einen PWidechar als input und Delphi ist normalerweise schlau genug bei einen array [0..x] of widechar automatisch die Addresse des ersten Zeichens zu verwenden. Falls das nicht klappt versuch mal, explizit zu sein:

S:= WidecharToString(PWidechar(@pDevmode^.dmDevicename[0]));


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz