[REBOL] Re: View/Pro and accessing Windows Printer API (gdi32.dll)
From: cyphre:seznam:cz at: 28-Jun-2002 22:14
Hello Bo,
First of all I have to say that I'm not a C guru ;-) But we(together with
Pekr ;-)) were experimenting some time ago with Rebol DLL interface. We has
also lot of problems caused mainly by lacking the good docs but finally we
got to work rebol wrapper that is able to convert/proccess/load/save about
200 image formats!Really cool stuff. Unfortunately we couldn't get to work
showing images directly from the dll to View but I've written simple
intermediate library in C which will suit for that purposes...
I think in your case you need to pass the hprinter value as a pointer to
rebol integer!.
You could try following method:
>> hprinter: make integer! 0 ;this create an integer value in Rebol
== 0
>> hpr_str: make struct! [i [integer!]] reduce [hprinter] ;this is a
structure containing the Hprinter value
>> probe third hpr_str ;this give us the value(data) of hprinter
#{00000000}
== #{00000000}
But you probably don't need the data but pointer to this data, therefore we
make another structure which will point to the structure above....
>> phpr_str: make struct! compose/deep [pi [struct! [(first hpr_str)]]] none
;this create the struct
>> probe third phpr_str ;now you can see the real pointer in memory to the
hprinter!
#{703CD900}
== #{703CD900}
to get the data for testing if enything was changed we can made a reference
value in rebol:
hpr-ref: third phpr_str/pi
now you can put all it into the routine:
gdi32: load/library %winspool.drv
openprinter: make routine! compose/deep [
"Open Printer"
pprintername [string!]
phprinter [struct! [(first phpr_str)]]
pdefault [integer!]
return: [integer!]
] gdi32 "OpenPrinterA"
ret: openprinter "Brother MFC3100C" phpr_str 0
Unfortunately it doesnot work here under WIN XP. I was trying to get working
at least your example but it also returned 0 under so I cannot test it
further. Try to experiment with it under WIN98, maybe you will be more
succesfull.
Another thing is that I can be absoultely wrong ;-)
Good luck!
Best regards,
Cyphre
APPENDIX:
Here is explanation of argument of the OpenPrinter routine I found in my
WINAPI reference doc:
pPrinterName
The name of the printer or print server to obtain a handle to. If this is
an empty string, the function obtains a handle to the default print server.
phPrinter
Receives a handle to the newly opened printer.
pDefault
A printer defaults structure specifying some options for opening the
printer. To use the default settings, pass zero for this parameter.
----- Original Message -----
From: "Bohdan or Rosemary Lechnowsky" <[amicom--sonic--net]>
To: <[rebol-list--rebol--com]>
Sent: Friday, June 28, 2002 7:33 PM
Subject: [REBOL] Re: View/Pro and accessing Windows Printer API (gdi32.dll)
> OK, %winspool.drv is the correct library to use. Thanks! But now I have
> other problems. Hopefully some of you familiar with C and the library
> component of View/Pro will be able to help. Continuing from what I had in
> my original message (contained below):
>
> >> openprinter: make routine! ["Open Printer" pprintername [string!]
> phprinter [char*] pdefault [string!] return: [integer!]]
> winspool "OpenPrinterA"
> >> hprinter: copy ""
> == ""
>
> ;hprinter is the handle that should be returned by 'openprinter above if I
> understand how 'openprinter works.
>
> >> ret: openprinter "Brother MFC3100C" hprinter ""
> == 1
>
> ;Great! 'openprinter returned 1 which indicates it worked!
>
> >> hprinter
> == ""
>
> ;Shouldn't 'hprinter now have some value that indicates the pointer? I've
> also tried specifying 'phprinter above as LONG, but that didn't do it
either
> ;Let's retrieve Windows' error code to see if there was an error
>
> >> kernel32: load/library %kernel32.dll
> >> getlasterror: make routine! [return: [long]] kernel32 "GetLastError"
> >> ret: openprinter "Brother MFC3100C" hprinter ""
> == 1
> >> a: getlasterror
> == 0
>
> ;OK! 'getlasterror states that there wasn't an error
>
> >> hprinter
> == ""
>
> ;but hprinter still is unchanged. Maybe my printer definition is
> wrong. Let's try using an invalid name (missing the last C):
>
> >> ret: openprinter "Brother MFC3100" hprinter ""
> == 0
> >> ret: openprinter "Brother MFC3100C" hprinter ""
> == 1
>
> ;Well, I guess the second name IS valid according to 'openprinter. Maybe
> that's not the issue...let's continue with the next routine.
>
> >> startdocprinter: make routine! ["StartDocPrinter" hprinter [char*]
> dwlevel [int] lpbdocinfo [struct! [cbsize [int] lpszdocn
> ame [string!] lpszoutput [string!] lpszdatatype [string!] fwtype [int]]]
> return: [int]] winspool "StartDocPrinterA"
> >> dwjob: startdocprinter hprinter 1 docinfo
> == 0
>
> ;Oh-oh! 'startdocprinter returned 0 which means it didn't work. Let's
> find out why:
>
> >> getlasterror
> == 6
>
> ;This means the handle is invalid according to
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/errli
st_7oz7.asp