Irgednwie sehe ich den Wald vor lauter Bäumen nicht.
Da sind noch mehr stellen die ein "if Res > 0 then" vertragen könnten. Bei mir funktionierte es so lange, bis ich als Drucker den FreePDF eingestellt hatte. Dann kam nämlich Res = 0 raus, was zur Zugriffsverletzung führte.
Vielleicht solltest du auch noch ein "Res := Max(Res, 255)" einbauen, damit du nicht über die Array-Grenze drüberläufst. Besser ist es, wenn du DeviceCapabilities() zuvor mit NIL als lpOutput Parameter aufrufst, damit du die genaue Anzahl an "BinNames" Einträgen bekommst und es keine Speicherüberschreibung gibt.