Hello, Huw promised to have a look at CreateDC in wineps soon. Changelog: Dmitry Timoshkov <dmitry@codeweavers.com> Convert CreateDC to unicode in the driver interface. diff -up cvs/hq/wine/dlls/gdi/driver.c wine/dlls/gdi/driver.c --- cvs/hq/wine/dlls/gdi/driver.c Wed Jun 25 15:58:14 2003 +++ wine/dlls/gdi/driver.c Tue Aug 12 18:28:45 2003 @@ -26,6 +26,7 @@ #include "winreg.h" #include "gdi.h" +#include "wine/unicode.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(driver); @@ -232,22 +233,23 @@ static struct graphics_driver *load_disp /********************************************************************** * DRIVER_load_driver */ -const DC_FUNCTIONS *DRIVER_load_driver( LPCSTR name ) +const DC_FUNCTIONS *DRIVER_load_driver( LPCWSTR name ) { HMODULE module; struct graphics_driver *driver; + static const WCHAR displayW[] = { 'd','i','s','p','l','a','y',0 }; EnterCriticalSection( &driver_section ); /* display driver is a special case */ - if (!strcasecmp( name, "display" )) + if (!strcmpiW( name, displayW )) { driver = load_display_driver(); LeaveCriticalSection( &driver_section ); return &driver->funcs; } - if ((module = GetModuleHandleA( name ))) + if ((module = GetModuleHandleW( name ))) { for (driver = first_driver; driver; driver = driver->next) { @@ -260,7 +262,7 @@ const DC_FUNCTIONS *DRIVER_load_driver( } } - if (!(module = LoadLibraryA( name ))) + if (!(module = LoadLibraryW( name ))) { LeaveCriticalSection( &driver_section ); return NULL; @@ -273,7 +275,7 @@ const DC_FUNCTIONS *DRIVER_load_driver( return NULL; } - TRACE( "loaded driver %p for %s\n", driver, name ); + TRACE( "loaded driver %p for %s\n", driver, debugstr_w(name) ); LeaveCriticalSection( &driver_section ); return &driver->funcs; } @@ -332,33 +334,74 @@ void DRIVER_release_driver( const DC_FUN * DRIVER_GetDriverName * */ -BOOL DRIVER_GetDriverName( LPCSTR device, LPSTR driver, DWORD size ) +BOOL DRIVER_GetDriverName( LPCWSTR device, LPWSTR driver, DWORD size ) { - char *p; + static const WCHAR displayW[] = { 'd','i','s','p','l','a','y',0 }; + static const WCHAR devicesW[] = { 'd','e','v','i','c','e','s',0 }; + static const WCHAR empty_strW[] = { 0 }; + WCHAR *p; /* display is a special case */ - if (!strcasecmp( device, "display" )) + if (!strcmpiW( device, displayW )) { - lstrcpynA( driver, "display", size ); + lstrcpynW( driver, displayW, size ); return TRUE; } - size = GetProfileStringA("devices", device, "", driver, size); + size = GetProfileStringW(devicesW, device, empty_strW, driver, size); if(!size) { - WARN("Unable to find '%s' in [devices] section of win.ini\n", device); + WARN("Unable to find %s in [devices] section of win.ini\n", debugstr_w(device)); return FALSE; } - p = strchr(driver, ','); + p = strchrW(driver, ','); if(!p) { - WARN("'%s' entry in [devices] section of win.ini is malformed.\n", device); + WARN("%s entry in [devices] section of win.ini is malformed.\n", debugstr_w(device)); return FALSE; } - *p = '\0'; - TRACE("Found '%s' for '%s'\n", driver, device); + *p = 0; + TRACE("Found %s for %s\n", debugstr_w(driver), debugstr_w(device)); return TRUE; } + +/*********************************************************************** + * GdiConvertToDevmodeW (GDI32.@) + */ +DEVMODEW * WINAPI GdiConvertToDevmodeW(const DEVMODEA *dmA) +{ + DEVMODEW *dmW; + WORD dmW_size; + + dmW_size = dmA->dmSize + CCHDEVICENAME; + if (dmA->dmSize >= (char *)dmA->dmFormName - (char *)dmA + CCHFORMNAME) + dmW_size += CCHFORMNAME; + + dmW = HeapAlloc(GetProcessHeap(), 0, dmW_size + dmA->dmDriverExtra); + if (!dmW) return NULL; + + MultiByteToWideChar(CP_ACP, 0, dmA->dmDeviceName, CCHDEVICENAME, + dmW->dmDeviceName, CCHDEVICENAME); + /* copy slightly more, to avoid long computations */ + memcpy(&dmW->dmSpecVersion, &dmA->dmSpecVersion, dmA->dmSize - CCHDEVICENAME); + + if (dmA->dmSize >= (char *)dmA->dmFormName - (char *)dmA + CCHFORMNAME) + { + MultiByteToWideChar(CP_ACP, 0, dmA->dmFormName, CCHFORMNAME, + dmW->dmFormName, CCHFORMNAME); + if (dmA->dmSize > (char *)&dmA->dmLogPixels - (char *)dmA) + memcpy(&dmW->dmLogPixels, &dmA->dmLogPixels, dmA->dmSize - ((char *)&dmA->dmLogPixels - (char *)dmA)); + } + + if (dmA->dmDriverExtra) + memcpy((char *)dmW + dmW_size, (char *)dmA + dmA->dmSize, dmA->dmDriverExtra); + + dmW->dmSize = dmW_size; + + return dmW; +} + + /***************************************************************************** * @ [GDI32.100] * @@ -400,12 +443,16 @@ INT WINAPI GDI_CallExtDeviceModePropShee * * This should load the correct driver for lpszDevice and calls this driver's * ExtDeviceMode proc. + * + * FIXME: convert ExtDeviceMode to unicode in the driver interface */ INT WINAPI GDI_CallExtDeviceMode16( HWND hwnd, LPDEVMODEA lpdmOutput, LPSTR lpszDevice, LPSTR lpszPort, LPDEVMODEA lpdmInput, LPSTR lpszProfile, DWORD fwMode ) { + WCHAR deviceW[300]; + WCHAR bufW[300]; char buf[300]; HDC hdc; DC *dc; @@ -415,7 +462,12 @@ INT WINAPI GDI_CallExtDeviceMode16( HWND TRACE("(%p, %p, %s, %s, %p, %s, %ld)\n", hwnd, lpdmOutput, lpszDevice, lpszPort, lpdmInput, lpszProfile, fwMode ); - if(!DRIVER_GetDriverName( lpszDevice, buf, sizeof(buf) )) return -1; + if (!lpszDevice) return -1; + if (!MultiByteToWideChar(CP_ACP, 0, lpszDevice, -1, deviceW, 300)) return -1; + + if(!DRIVER_GetDriverName( deviceW, bufW, 300 )) return -1; + + if (!WideCharToMultiByte(CP_ACP, 0, bufW, -1, buf, 300, NULL, NULL)) return -1; if (!(hdc = CreateICA( buf, lpszDevice, lpszPort, NULL ))) return -1; @@ -449,11 +501,15 @@ INT WINAPI GDI_CallAdvancedSetupDialog16 * * This should load the correct driver for lpszDevice and calls this driver's * DeviceCapabilities proc. + * + * FIXME: convert DeviceCapabilities to unicode in the driver interface */ DWORD WINAPI GDI_CallDeviceCapabilities16( LPCSTR lpszDevice, LPCSTR lpszPort, WORD fwCapability, LPSTR lpszOutput, LPDEVMODEA lpdm ) { + WCHAR deviceW[300]; + WCHAR bufW[300]; char buf[300]; HDC hdc; DC *dc; @@ -461,7 +517,12 @@ DWORD WINAPI GDI_CallDeviceCapabilities1 TRACE("(%s, %s, %d, %p, %p)\n", lpszDevice, lpszPort, fwCapability, lpszOutput, lpdm ); - if(!DRIVER_GetDriverName( lpszDevice, buf, sizeof(buf) )) return -1; + if (!lpszDevice) return -1; + if (!MultiByteToWideChar(CP_ACP, 0, lpszDevice, -1, deviceW, 300)) return -1; + + if(!DRIVER_GetDriverName( deviceW, bufW, 300 )) return -1; + + if (!WideCharToMultiByte(CP_ACP, 0, bufW, -1, buf, 300, NULL, NULL)) return -1; if (!(hdc = CreateICA( buf, lpszDevice, lpszPort, NULL ))) return -1; diff -up cvs/hq/wine/dlls/gdi/gdi32.spec wine/dlls/gdi/gdi32.spec --- cvs/hq/wine/dlls/gdi/gdi32.spec Sun May 11 13:30:08 2003 +++ wine/dlls/gdi/gdi32.spec Tue Aug 12 18:37:13 2003 @@ -130,6 +130,7 @@ @ stub GdiConvertMetaFilePict @ stub GdiConvertPalette @ stub GdiConvertRegion +@ stdcall GdiConvertToDevmodeW(ptr) @ stub GdiCreateLocalBitmap @ stub GdiCreateLocalBrush @ stub GdiCreateLocalEnhMetaFile diff -up cvs/hq/wine/dlls/ttydrv/dc.c wine/dlls/ttydrv/dc.c --- cvs/hq/wine/dlls/ttydrv/dc.c Wed May 14 15:25:53 2003 +++ wine/dlls/ttydrv/dc.c Tue Aug 12 17:34:35 2003 @@ -39,14 +39,14 @@ BOOL TTYDRV_GDI_Initialize(void) /*********************************************************************** * TTYDRV_DC_CreateDC */ -BOOL TTYDRV_DC_CreateDC(DC *dc, TTYDRV_PDEVICE **pdev, LPCSTR driver, LPCSTR device, - LPCSTR output, const DEVMODEA *initData) +BOOL TTYDRV_DC_CreateDC(DC *dc, TTYDRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR device, + LPCWSTR output, const DEVMODEW *initData) { TTYDRV_PDEVICE *physDev; TRACE("(%p, %s, %s, %s, %p)\n", - dc, debugstr_a(driver), debugstr_a(device), - debugstr_a(output), initData); + dc, debugstr_w(driver), debugstr_w(device), + debugstr_w(output), initData); physDev = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TTYDRV_PDEVICE)); if(!physDev) { diff -up cvs/hq/wine/dlls/wineps/init.c wine/dlls/wineps/init.c --- cvs/hq/wine/dlls/wineps/init.c Tue Jul 1 16:17:59 2003 +++ wine/dlls/wineps/init.c Tue Aug 12 18:54:49 2003 @@ -35,6 +35,7 @@ #include "winreg.h" #include "winspool.h" #include "winerror.h" +#include "heap.h" WINE_DEFAULT_DEBUG_CHANNEL(psdrv); @@ -251,14 +252,53 @@ static void PSDRV_UpdateDevCaps( PSDRV_P } +/*********************************************************** + * DEVMODEdupWtoA + * + * Creates an ascii copy of supplied devmode on heap + * + * Copied from dlls/winspool/info.c until full unicodification + */ +static LPDEVMODEA DEVMODEdupWtoA(HANDLE heap, const DEVMODEW *dmW) +{ + LPDEVMODEA dmA; + DWORD size; + BOOL Formname; + ptrdiff_t off_formname = (char *)dmW->dmFormName - (char *)dmW; + + if(!dmW) return NULL; + Formname = (dmW->dmSize > off_formname); + size = dmW->dmSize - CCHDEVICENAME - (Formname ? CCHFORMNAME : 0); + dmA = HeapAlloc(heap, HEAP_ZERO_MEMORY, size + dmW->dmDriverExtra); + WideCharToMultiByte(CP_ACP, 0, dmW->dmDeviceName, -1, dmA->dmDeviceName, + CCHDEVICENAME, NULL, NULL); + if(!Formname) { + memcpy(&dmA->dmSpecVersion, &dmW->dmSpecVersion, + dmW->dmSize - CCHDEVICENAME * sizeof(WCHAR)); + } else { + memcpy(&dmA->dmSpecVersion, &dmW->dmSpecVersion, + off_formname - CCHDEVICENAME * sizeof(WCHAR)); + WideCharToMultiByte(CP_ACP, 0, dmW->dmFormName, -1, dmA->dmFormName, + CCHFORMNAME, NULL, NULL); + memcpy(&dmA->dmLogPixels, &dmW->dmLogPixels, dmW->dmSize - + (off_formname + CCHFORMNAME * sizeof(WCHAR))); + } + dmA->dmSize = size; + memcpy((char *)dmA + dmA->dmSize, (char *)dmW + dmW->dmSize, + dmW->dmDriverExtra); + return dmA; +} + + /********************************************************************** * PSDRV_CreateDC */ -BOOL PSDRV_CreateDC( DC *dc, PSDRV_PDEVICE **pdev, LPCSTR driver, LPCSTR device, - LPCSTR output, const DEVMODEA* initData ) +BOOL PSDRV_CreateDC( DC *dc, PSDRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR device, + LPCWSTR output, const DEVMODEW* initData ) { PSDRV_PDEVICE *physDev; PRINTERINFO *pi; + char deviceA[CCHDEVICENAME]; /* If no device name was specified, retrieve the device name * from the DEVMODE structure from the DC's physDev. @@ -266,11 +306,14 @@ BOOL PSDRV_CreateDC( DC *dc, PSDRV_PDEVI if ( !device && *pdev ) { physDev = *pdev; - device = physDev->Devmode->dmPublic.dmDeviceName; + strcpy(deviceA, physDev->Devmode->dmPublic.dmDeviceName); } - pi = PSDRV_FindPrinterInfo(device); + else + WideCharToMultiByte(CP_ACP, 0, device, -1, deviceA, sizeof(deviceA), NULL, NULL); + pi = PSDRV_FindPrinterInfo(deviceA); - TRACE("(%s %s %s %p)\n", driver, device, output, initData); + TRACE("(%s %s %s %p)\n", debugstr_w(driver), debugstr_w(device), + debugstr_w(output), initData); if(!pi) return FALSE; @@ -301,14 +344,15 @@ BOOL PSDRV_CreateDC( DC *dc, PSDRV_PDEVI physDev->logPixelsY = physDev->pi->ppd->DefaultResolution; if (output) { - physDev->job.output = HeapAlloc( PSDRV_Heap, 0, strlen(output)+1 ); - strcpy( physDev->job.output, output ); + physDev->job.output = HEAP_strdupWtoA( PSDRV_Heap, 0, output ); } else physDev->job.output = NULL; physDev->job.hJob = 0; if(initData) { - PSDRV_MergeDevmodes(physDev->Devmode, (PSDRV_DEVMODEA *)initData, pi); + DEVMODEA *devmodeA = DEVMODEdupWtoA(PSDRV_Heap, initData); + PSDRV_MergeDevmodes(physDev->Devmode, (PSDRV_DEVMODEA *)devmodeA, pi); + HeapFree(PSDRV_Heap, 0, devmodeA); } PSDRV_UpdateDevCaps(physDev); diff -up cvs/hq/wine/dlls/winspool/Makefile.in wine/dlls/winspool/Makefile.in --- cvs/hq/wine/dlls/winspool/Makefile.in Tue May 20 14:07:41 2003 +++ wine/dlls/winspool/Makefile.in Tue Aug 12 18:38:52 2003 @@ -4,7 +4,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = winspool.drv -IMPORTS = user32 advapi32 kernel32 ntdll +IMPORTS = user32 gdi32 advapi32 kernel32 ntdll LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o diff -up cvs/hq/wine/dlls/winspool/info.c wine/dlls/winspool/info.c --- cvs/hq/wine/dlls/winspool/info.c Wed Jun 25 15:58:43 2003 +++ wine/dlls/winspool/info.c Tue Aug 12 18:44:29 2003 @@ -516,27 +516,6 @@ static LPDEVMODEW DEVMODEcpyAtoW(DEVMODE } /*********************************************************** - * DEVMODEdupAtoW - * Creates a unicode copy of supplied devmode on heap - */ -static LPDEVMODEW DEVMODEdupAtoW(HANDLE heap, const DEVMODEA *dmA) -{ - LPDEVMODEW dmW; - DWORD size; - BOOL Formname; - ptrdiff_t off_formname; - - TRACE("\n"); - if(!dmA) return NULL; - - off_formname = (char *)dmA->dmFormName - (char *)dmA; - Formname = (dmA->dmSize > off_formname); - size = dmA->dmSize + CCHDEVICENAME + (Formname ? CCHFORMNAME : 0); - dmW = HeapAlloc(heap, HEAP_ZERO_MEMORY, size + dmA->dmDriverExtra); - return DEVMODEcpyAtoW(dmW, dmA); -} - -/*********************************************************** * DEVMODEdupWtoA * Creates an ascii copy of supplied devmode on heap */ @@ -590,7 +569,7 @@ static LPPRINTER_INFO_2W PRINTER_INFO_2A piW->pDriverName = asciitounicode(&usBuffer,piA->pDriverName); piW->pComment = asciitounicode(&usBuffer,piA->pComment); piW->pLocation = asciitounicode(&usBuffer,piA->pLocation); - piW->pDevMode = DEVMODEdupAtoW(heap, piA->pDevMode); + piW->pDevMode = GdiConvertToDevmodeW(piA->pDevMode); piW->pSepFile = asciitounicode(&usBuffer,piA->pSepFile); piW->pPrintProcessor = asciitounicode(&usBuffer,piA->pPrintProcessor); piW->pDatatype = asciitounicode(&usBuffer,piA->pDatatype); @@ -711,6 +690,7 @@ INT WINAPI DeviceCapabilitiesW(LPCWSTR p /****************************************************************** * DocumentPropertiesA [WINSPOOL.@] * + * FIXME: implement DocumentPropertiesA via DocumentPropertiesW, not vice versa */ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter, LPSTR pDeviceName, LPDEVMODEA pDevModeOutput, @@ -752,6 +732,8 @@ LONG WINAPI DocumentPropertiesA(HWND hWn /***************************************************************************** * DocumentPropertiesW (WINSPOOL.@) + * + * FIXME: implement DocumentPropertiesA via DocumentPropertiesW, not vice versa */ LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter, LPWSTR pDeviceName, @@ -802,8 +784,7 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinter if(pDefault) { DefaultW.pDatatype = asciitounicode(&usBuffer,pDefault->pDatatype); - DefaultW.pDevMode = DEVMODEdupAtoW(GetProcessHeap(), - pDefault->pDevMode); + DefaultW.pDevMode = GdiConvertToDevmodeW(pDefault->pDevMode); DefaultW.DesiredAccess = pDefault->DesiredAccess; pDefaultW = &DefaultW; } @@ -1565,7 +1546,7 @@ static void WINSPOOL_GetDefaultDevMode( if(unicode) { if(buflen >= sizeof(DEVMODEW)) { - DEVMODEW *pdmW = DEVMODEdupAtoW(GetProcessHeap(), &dm ); + DEVMODEW *pdmW = GdiConvertToDevmodeW(&dm); memcpy(ptr, pdmW, sizeof(DEVMODEW)); HeapFree(GetProcessHeap(),0,pdmW); } @@ -1608,7 +1589,7 @@ static BOOL WINSPOOL_GetDevModeFromReg(H if(unicode) { sz += (CCHDEVICENAME + CCHFORMNAME); if(buflen >= sz) { - DEVMODEW *dmW = DEVMODEdupAtoW(GetProcessHeap(), (DEVMODEA*)ptr); + DEVMODEW *dmW = GdiConvertToDevmodeW((DEVMODEA*)ptr); memcpy(ptr, dmW, sz); HeapFree(GetProcessHeap(),0,dmW); } diff -up cvs/hq/wine/graphics/x11drv/init.c wine/graphics/x11drv/init.c --- cvs/hq/wine/graphics/x11drv/init.c Wed May 14 15:25:57 2003 +++ wine/graphics/x11drv/init.c Tue Aug 12 17:34:35 2003 @@ -87,8 +87,8 @@ void X11DRV_GDI_Finalize(void) /********************************************************************** * X11DRV_CreateDC */ -BOOL X11DRV_CreateDC( DC *dc, X11DRV_PDEVICE **pdev, LPCSTR driver, LPCSTR device, - LPCSTR output, const DEVMODEA* initData ) +BOOL X11DRV_CreateDC( DC *dc, X11DRV_PDEVICE **pdev, LPCWSTR driver, LPCWSTR device, + LPCWSTR output, const DEVMODEW* initData ) { X11DRV_PDEVICE *physDev; diff -up cvs/hq/wine/include/gdi.h wine/include/gdi.h --- cvs/hq/wine/include/gdi.h Sat Jun 28 14:30:54 2003 +++ wine/include/gdi.h Tue Aug 12 17:34:35 2003 @@ -181,7 +181,7 @@ typedef struct tagDC_FUNCS BOOL (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT); BOOL (*pCloseFigure)(PHYSDEV); BOOL (*pCreateBitmap)(PHYSDEV,HBITMAP); - BOOL (*pCreateDC)(DC *,PHYSDEV *,LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*); + BOOL (*pCreateDC)(DC *,PHYSDEV *,LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*); HBITMAP (*pCreateDIBSection)(PHYSDEV,BITMAPINFO *,UINT,LPVOID *,HANDLE,DWORD,DWORD); BOOL (*pDeleteBitmap)(HBITMAP); BOOL (*pDeleteDC)(PHYSDEV); @@ -451,10 +451,10 @@ extern void *GDI_GetObjPtr( HGDIOBJ, WOR extern void GDI_ReleaseObj( HGDIOBJ ); extern void GDI_CheckNotLock(void); -extern const DC_FUNCTIONS *DRIVER_load_driver( LPCSTR name ); +extern const DC_FUNCTIONS *DRIVER_load_driver( LPCWSTR name ); extern const DC_FUNCTIONS *DRIVER_get_driver( const DC_FUNCTIONS *funcs ); extern void DRIVER_release_driver( const DC_FUNCTIONS *funcs ); -extern BOOL DRIVER_GetDriverName( LPCSTR device, LPSTR driver, DWORD size ); +extern BOOL DRIVER_GetDriverName( LPCWSTR device, LPWSTR driver, DWORD size ); extern POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut ); diff -up cvs/hq/wine/include/wingdi.h wine/include/wingdi.h --- cvs/hq/wine/include/wingdi.h Tue May 20 14:07:44 2003 +++ wine/include/wingdi.h Tue Aug 12 18:19:52 2003 @@ -3228,6 +3228,7 @@ BOOL WINAPI FlattenPath(HDC); BOOL WINAPI FloodFill(HDC,INT,INT,COLORREF); BOOL WINAPI FrameRgn(HDC,HRGN,HBRUSH,INT,INT); BOOL WINAPI GdiComment(HDC,UINT,const BYTE *); +DEVMODEW * WINAPI GdiConvertToDevmodeW(const DEVMODEA *); BOOL WINAPI GdiFlush(void); INT WINAPI GetArcDirection(HDC); BOOL WINAPI GetAspectRatioFilterEx(HDC,LPSIZE); diff -up cvs/hq/wine/objects/dc.c wine/objects/dc.c --- cvs/hq/wine/objects/dc.c Wed Jun 25 15:59:08 2003 +++ wine/objects/dc.c Tue Aug 12 17:34:35 2003 @@ -24,11 +24,13 @@ #include <string.h> #include "windef.h" #include "wingdi.h" +#include "winternl.h" #include "winerror.h" #include "wownt32.h" #include "wine/winuser16.h" #include "gdi.h" #include "heap.h" +#include "wine/unicode.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(dc); @@ -565,27 +567,27 @@ BOOL WINAPI RestoreDC( HDC hdc, INT leve /*********************************************************************** - * CreateDCA (GDI32.@) + * CreateDCW (GDI32.@) */ -HDC WINAPI CreateDCA( LPCSTR driver, LPCSTR device, LPCSTR output, - const DEVMODEA *initData ) +HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output, + const DEVMODEW *initData ) { HDC hdc; DC * dc; const DC_FUNCTIONS *funcs; - char buf[300]; + WCHAR buf[300]; GDI_CheckNotLock(); - if (!device || !DRIVER_GetDriverName( device, buf, sizeof(buf) )) + if (!device || !DRIVER_GetDriverName( device, buf, 300 )) { if (!driver) return 0; - strcpy(buf, driver); + strcpyW(buf, driver); } if (!(funcs = DRIVER_load_driver( buf ))) { - ERR( "no driver found for %s\n", buf ); + ERR( "no driver found for %s\n", debugstr_w(buf) ); return 0; } if (!(dc = DC_AllocDC( funcs, DC_MAGIC ))) @@ -597,7 +599,7 @@ HDC WINAPI CreateDCA( LPCSTR driver, LPC dc->hBitmap = GetStockObject( DEFAULT_BITMAP ); TRACE("(driver=%s, device=%s, output=%s): returning %p\n", - debugstr_a(driver), debugstr_a(device), debugstr_a(output), dc->hSelf ); + debugstr_w(driver), debugstr_w(device), debugstr_w(output), dc->hSelf ); if (dc->funcs->pCreateDC && !dc->funcs->pCreateDC( dc, &dc->physDev, buf, device, output, initData )) @@ -622,20 +624,31 @@ HDC WINAPI CreateDCA( LPCSTR driver, LPC /*********************************************************************** - * CreateDCW (GDI32.@) + * CreateDCA (GDI32.@) */ -HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output, - const DEVMODEW *initData ) +HDC WINAPI CreateDCA( LPCSTR driver, LPCSTR device, LPCSTR output, + const DEVMODEA *initData ) { - LPSTR driverA = HEAP_strdupWtoA( GetProcessHeap(), 0, driver ); - LPSTR deviceA = HEAP_strdupWtoA( GetProcessHeap(), 0, device ); - LPSTR outputA = HEAP_strdupWtoA( GetProcessHeap(), 0, output ); - HDC res = CreateDCA( driverA, deviceA, outputA, - (const DEVMODEA *)initData /*FIXME*/ ); - HeapFree( GetProcessHeap(), 0, driverA ); - HeapFree( GetProcessHeap(), 0, deviceA ); - HeapFree( GetProcessHeap(), 0, outputA ); - return res; + UNICODE_STRING driverW, deviceW, outputW; + HDC ret; + + if (driver) RtlCreateUnicodeStringFromAsciiz(&driverW, driver); + else driverW.Buffer = NULL; + + if (device) RtlCreateUnicodeStringFromAsciiz(&deviceW, device); + else deviceW.Buffer = NULL; + + if (output) RtlCreateUnicodeStringFromAsciiz(&outputW, output); + else outputW.Buffer = NULL; + + + ret = CreateDCW( driverW.Buffer, deviceW.Buffer, outputW.Buffer, + (const DEVMODEW *)initData /*FIXME*/ ); + + RtlFreeUnicodeString(&driverW); + RtlFreeUnicodeString(&deviceW); + RtlFreeUnicodeString(&outputW); + return ret; } @@ -681,7 +694,8 @@ HDC WINAPI CreateCompatibleDC( HDC hdc ) } else { - funcs = DRIVER_load_driver( "DISPLAY" ); + static const WCHAR displayW[] = { 'd','i','s','p','l','a','y',0 }; + funcs = DRIVER_load_driver( displayW ); physDev = NULL; }