Re: This does not work on XP Attn: Larry Miller
- Posted by Rod Damon <roddamon at bellsouth.net> Jan 10, 2006
- 462 views
Hi Larry I tried your fix and got an error C:\Euphoria\defaultprintername.exw:14 define_c_func takes 4 arguments {C_POINTER,C_LONG}) I wrote a small program to test this function as follows. Any help is greatly appreciated.
include dll.e include machine.e
constant winspool = open_dll("winspool.drv")
constant iEnumPrinters = define_c_func(winspool,"EnumPrintersA",{C_INT,C_INT,C_INT, C_INT,C_INT,C_INT,C_INT},C_INT) constant PRINTER_ENUM_DEFAULT = 1
Add this declaration constant iGetDefaultPrinter=define_c_func(winspool,"GetDefaultPrinterA", {C_POINTER,C_LONG})
with trace
function peeksz(atom pStr)
str = {} i = 1 c = peek(pStr) while c do str = str & c c = peek(pStr+i) i = i + 1 end while return str end function
global function DefaultPrinterName()
--
pNeeded = allocate(4) mem_set(pNeeded,0,4) pReturned = allocate(4) mem_set(pReturned,0,4) first try to know how many bytes needed for pPInfo5 ok = c_func(iEnumPrinters,{PRINTER_ENUM_DEFAULT,NULL,5,0,0,pNeeded,pReturned}) needed = peek4u(pNeeded) pPInfo5 = allocate(needed) mem_set(pPInfo5,0,needed) ok = c_func(iEnumPrinters,{PRINTER_ENUM_DEFAULT,NULL,5,pPInfo5,needed, pNeeded,pReturned}) free(pNeeded) free(pReturned) if not ok then free(pPInfo5) return {} else PrinterName = peeksz(peek4u(pPInfo5)) free(pPInfo5) return PrinterName end if end function
trace(1) object temp
temp = DefaultPrinterName()
integer k printf(1,"%s",{temp})
while 1 do k = get_key() if k != -1 then exit end if end while
- Thanks Rod Damon }}}