Windows printing

frame frame86 at
Thu Oct 7 01:55:15 UTC 2021

Is there some Windows expert or someone you can tell me if I do 
things wrong?

I can open the printer and also print but I'm failing to restore 
the printer settings from a file.

import std;

pragma(lib, "winspool.lib");

extern (Windows) BOOL IsValidDevmodeA(PDEVMODEA pDevmode, size_t 

// ...

string path; // contains a valid path to a previously saved 
printer properties struct file
char* cPrinterName; // just to simplify, it comes from toStringz 
and contains the correct name

const(ubyte)[] pDevModeInputBuf = cast(ubyte[]) read(path); // 
reads 1689 bytes
DEVMODEA* initData = cast(DEVMODEA*) pDevModeInputBuf.ptr;

HANDLE pHandle;
OpenPrinterA(cPrinterName, &pHandle, null); // success, pHandle 
points to something

// returns the bytes needed for the printer properties
long docRs = DocumentPropertiesA(null, pHandle, cPrinterName, 
null, null, 0); // 1689 bytes, so also correct

// everyting correct:
// initData.dmDeviceName == cPrinterName
// initData.dmSize + initData.dmDriverExtra == docRs, 1689 bytes

IsValidDevmodeA(initData, docRs); // true

// just to be sure
SetLastError(0); // GetLastError() is 0

// and now this fails:
uint flags = DM_IN_BUFFER;
docRs = DocumentPropertiesA(null, pHandle, cPrinterName, null, 
initData, flags);

// docRs is -1
// GetLastError() is 131

Negative seek? This is file related - what's going on here?

More information about the Digitalmars-d-learn mailing list