I have been banging my head against this one for a while and need some feedback about a problem I am having. I have attached the patch to convert StartDocA to call StartDocW instead of the other way around. This patch results with StartDocW looking as follows INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc) { INT ret = 0; DC *dc = DC_GetDCPtr( hdc ); TRACE("DocName = '%s' Output = '%s' Datatype = '%s'\n", debugstr_w(doc->lpszDocName), debugstr_w(doc->lpszOutput), debugstr_w(doc->lpszDatatype)); if(!dc) return SP_ERROR; if (dc->funcs->pStartDoc) ret = dc->funcs->pStartDoc( dc->physDev, doc ); GDI_ReleaseObj( hdc ); return ret; } The problem I am having is with this line. if (dc->funcs->pStartDoc) ret = dc->funcs->pStartDoc( dc->physDev, doc ); With my patch in place I get the following error printdrv.c: In function `StartDocW': printdrv.c:82: warning: passing arg 2 of pointer to function from incompatible pointer type so obviously dc->funcs->pStartDoc points to a function that expects DOCINFOA* as its second parameter but I am at a loss on what to do. I have tried to trace down where "DC_GetDCPtr( hdc )" gets this information but I just ended up confused. Please help! -- Tony Lambregts Index: printdrv.c =================================================================== RCS file: /home/wine/wine/dlls/gdi/printdrv.c,v retrieving revision 1.30 diff -u -u -r1.30 printdrv.c --- printdrv.c 22 Nov 2002 22:16:53 -0000 1.30 +++ printdrv.c 23 Mar 2003 20:36:11 -0000 @@ -48,6 +48,7 @@ #include "gdi.h" #include "heap.h" #include "file.h" +#include "winternl.h" WINE_DEFAULT_DEBUG_CHANNEL(print); @@ -58,7 +59,7 @@ /****************************************************************** - * StartDocA [GDI32.@] + * StartDocW [GDI32.@] * * StartDoc calls the STARTDOC Escape with the input data pointing to DocName * and the output data (which is used as a second input parameter).pointing at @@ -67,13 +68,14 @@ * * Note: we now do it the other way, with the STARTDOC Escape calling StartDoc. */ -INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc) +INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc) { INT ret = 0; DC *dc = DC_GetDCPtr( hdc ); TRACE("DocName = '%s' Output = '%s' Datatype = '%s'\n", - doc->lpszDocName, doc->lpszOutput, doc->lpszDatatype); + debugstr_w(doc->lpszDocName), debugstr_w(doc->lpszOutput), + debugstr_w(doc->lpszDatatype)); if(!dc) return SP_ERROR; @@ -83,32 +85,27 @@ } /************************************************************************* - * StartDocW [GDI32.@] + * StartDocA [GDI32.@] * */ -INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc) +INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc) { - DOCINFOA docA; - INT ret; - - docA.cbSize = doc->cbSize; - docA.lpszDocName = doc->lpszDocName ? - HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDocName ) : NULL; - docA.lpszOutput = doc->lpszOutput ? - HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszOutput ) : NULL; - docA.lpszDatatype = doc->lpszDatatype ? - HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDatatype ) : NULL; - docA.fwType = doc->fwType; - - ret = StartDocA(hdc, &docA); - - if(docA.lpszDocName) - HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDocName ); - if(docA.lpszOutput) - HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszOutput ); - if(docA.lpszDatatype) - HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDatatype ); - + DOCINFOW docW; + int ret; + UNICODE_STRING DocName, Output, Datatype; + + docW.cbSize = doc->cbSize; + RtlCreateUnicodeStringFromAsciiz(&DocName, doc->lpszDocName); + RtlCreateUnicodeStringFromAsciiz(&Output, doc->lpszOutput ); + RtlCreateUnicodeStringFromAsciiz(&Datatype, doc->lpszDatatype ); + docW.lpszDocName = DocName.Buffer; + docW.lpszOutput = Output.Buffer; + docW.lpszDatatype = Datatype.Buffer; + docW.fwType = doc->fwType; + ret = StartDocW(hdc, &docW); + RtlFreeUnicodeString(&DocName); + RtlFreeUnicodeString(&Output); + RtlFreeUnicodeString(&Datatype); return ret; }