« Arrived in Salzburg | Home | FileMaker Pro, Server… »

Detect PrinterSetup data format

As you may know Xojo 2016r4 to 2017r2 made a move to use DirectDraw for printing. Xojo 2016r3 and older use DEVMODE structure to describe the printer setup in the ANSI version. Xojo 2016r4 and newer use the unicode version. You run into problems if you use an older SetupString with newer Xojo versions. Sadly Xojo missed to increment the version number in their string to ignore older setup strings automatically!

While the exact format of SetupString is not published, you can see it’s text with an embedded binary part. One of the values listed is DevModeStructureSizePS which shows the size of the binary data. Values are for example 1292 for older format and 1356 for newer format of the same printer. Please note the format can be printer specific and change depending on which fields are checked in the printer dialog!

In the byte stream you see first 32 characters in both versions, either unicode (64 bytes!) or ANSI text. Followed is the spec version &h0401 for Windows 2000 and newer. Next value is driver version. The following field is the size of the structure, not including any private, driver-specified data. This value can be &h00DC for size of DEVMODEW structure for Xojo 2017r2 and &h009C for size of DEVMODEA structure for Xojo 2016r3. The next number is the driver’s data size in bytes, e.g. &h0470 for my printer in both cases. If you sum it up, you get &h054C and &h50C, which are exactly the sizes above.

To detect the format of a setup string, you can do the following: You find the string DevModeStructurePS= in the setup string. If you don’t have it, this is an incomplete setup string, e.g. from a new PrinterSetup object and you can simply use it. But if you find it, you look in the binary data, if you find the bytes &h01 and &h04 exactly 32 or 64 bytes after the start of the binary data. Skipping two bytes the next two bytes should be &hDC &h00 for Xojo 2017r2 and &h9C &h00 for Xojo 2016r3.

Implementing the proper function to test a setup string is left as homework to the reader.

PS: If SetupString odes not start with "DoNotAlterThis=SetupString.2" or you are not on TargetWindows, you should not touch it as that may be a new future format.

PPS: The WindowsDeviceModeMBS class in MBS Win Plugin can help to convert from ANSI to Unicode and back if needed.
09 10 17 - 23:28