@@ -212,19 +212,26 @@ HANDLE DibFromBitmap (
212212}
213213
214214BOOL WriteDIB (
215- LPSTR szFile ,
215+ LPCWSTR szFile ,
216216 HANDLE hdib )
217217{
218218 BITMAPFILEHEADER hdr ;
219219 LPBITMAPINFOHEADER lpbi ;
220- HFILE fh ;
221- OFSTRUCT of ;
220+ HANDLE fh ;
221+ DWORD nbwritten ;
222222
223223 if (!hdib )
224224 return FALSE;
225225
226- fh = OpenFile (szFile , & of , (UINT )OF_CREATE |OF_READWRITE );
227- if (fh == -1 )
226+ fh = CreateFileW (szFile ,
227+ (GENERIC_READ | GENERIC_WRITE ) ,
228+ FILE_SHARE_READ ,
229+ NULL , /* No security descriptor */
230+ OPEN_ALWAYS ,
231+ FILE_ATTRIBUTE_NORMAL ,
232+ NULL /* No template */ );
233+
234+ if (fh == INVALID_HANDLE_VALUE )
228235 return FALSE;
229236
230237 lpbi = (VOID FAR * )GlobalLock (hdib );
@@ -240,16 +247,16 @@ BOOL WriteDIB (
240247 /* Write the file header */
241248
242249 /* write bfType*/
243- _lwrite (fh , (LPSTR )& hdr .bfType , (UINT )sizeof (WORD ));
250+ WriteFile (fh , (LPSTR )& hdr .bfType , (UINT )sizeof (WORD ), & nbwritten , NULL );
244251 /* now pass over extra word, and only write next 3 DWORDS!*/
245- _lwrite (fh , (LPSTR )& hdr .bfSize , sizeof (DWORD ) * 3 );
252+ WriteFile (fh , (LPSTR )& hdr .bfSize , sizeof (DWORD ) * 3 , & nbwritten , NULL );
246253
247254 /* this struct already DWORD aligned!*/
248255 /* Write the DIB header and the bits */
249- _lwrite (fh , (LPSTR )lpbi , GlobalSize (hdib ));
256+ WriteFile (fh , (LPSTR )lpbi , GlobalSize (hdib ), & nbwritten , NULL );
250257
251258 GlobalUnlock (hdib );
252- _lclose (fh );
259+ CloseHandle (fh );
253260 return TRUE;
254261}
255262
@@ -509,7 +516,7 @@ STDMETHODIMP DropTarget_Drop(DropTarget *dt,
509516 DWORD i ;
510517
511518 DPRINTF (("Success\n" ));
512- numDropFiles = DragQueryFile (hDrop , -1 , NULL , 0 );
519+ numDropFiles = DragQueryFileW (hDrop , -1 , NULL , 0 );
513520 dropFiles = calloc (numDropFiles , sizeof (char * ));
514521 for (i = 0 ; i < numDropFiles ; i ++ ) {
515522 WCHAR * tmpPath ;
@@ -546,17 +553,20 @@ STDMETHODIMP DropTarget_Drop(DropTarget *dt,
546553
547554 hRes = ido -> lpVtbl -> GetData (ido , & fmtetc , & medium );
548555 if (hRes == S_OK ) {
549- TCHAR tmpName [MAX_PATH + 1 ];
556+ WCHAR tmpNameW [MAX_PATH + 1 ];
550557 HANDLE hDib = medium .hGlobal ;
551558
552559 DPRINTF (("Success\n" ));
553560
554- GetTempPath (MAX_PATH ,tmpName );
555- strcat (tmpName ,"$$squeak$$.bmp" );
556- if (WriteDIB (tmpName , hDib )) {
557- numDropFiles = 1 ;
558- dropFiles = calloc (1 , sizeof (void * ));
559- dropFiles [0 ] = _strdup (tmpName );
561+ GetTempPathW (MAX_PATH ,tmpNameW );
562+ wcscat (tmpNameW ,L"$$squeak$$.bmp" );
563+ if (WriteDIB (tmpNameW , hDib )) {
564+ char tmpNameA [MAX_PATH_UTF8 + 1 ];
565+ if (WideCharToMultiByte (CP_UTF8 , 0 , tmpNameW , -1 , tmpNameA , MAX_PATH_UTF8 , NULL , NULL )) {
566+ numDropFiles = 1 ;
567+ dropFiles = calloc (1 , sizeof (void * ));
568+ dropFiles [0 ] = _strdup (tmpNameA );
569+ }
560570 }
561571 if (medium .pUnkForRelease == NULL ) {
562572 GlobalFree (hDib );
@@ -580,20 +590,23 @@ STDMETHODIMP DropTarget_Drop(DropTarget *dt,
580590
581591 hRes = ido -> lpVtbl -> GetData (ido , & fmtetc , & medium );
582592 if (hRes == S_OK ) {
583- TCHAR tmpName [MAX_PATH + 1 ];
593+ WCHAR tmpNameW [MAX_PATH + 1 ];
584594 HANDLE hDib ;
585595 HBITMAP hBM = medium .hBitmap ;
586596
587597 DPRINTF (("Success\n" ));
588598
589- GetTempPath (MAX_PATH ,tmpName );
590- strcat ( tmpName , "$$squeak$$.bmp" );
599+ GetTempPathW (MAX_PATH ,tmpNameW );
600+ wcscat ( tmpNameW , L "$$squeak$$.bmp" );
591601 hDib = DibFromBitmap (hBM , BI_RGB , 0 , NULL );
592602 if (hDib ) {
593- if (WriteDIB (tmpName , hDib )) {
594- numDropFiles = 1 ;
595- dropFiles = calloc (1 , sizeof (void * ));
596- dropFiles [0 ] = _strdup (tmpName );
603+ if (WriteDIB (tmpNameW , hDib )) {
604+ char tmpNameA [MAX_PATH_UTF8 + 1 ];
605+ if (WideCharToMultiByte (CP_UTF8 , 0 , tmpNameW , -1 , tmpNameA , MAX_PATH_UTF8 , NULL , NULL )) {
606+ numDropFiles = 1 ;
607+ dropFiles = calloc (1 , sizeof (void * ));
608+ dropFiles [0 ] = _strdup (tmpNameA );
609+ }
597610 }
598611 DeleteObject (hDib );
599612 }
@@ -618,7 +631,7 @@ STDMETHODIMP DropTarget_Drop(DropTarget *dt,
618631
619632 hRes = ido -> lpVtbl -> GetData (ido , & fmtetc , & medium );
620633 if (hRes == S_OK ) {
621- TCHAR tmpName [MAX_PATH + 1 ];
634+ WCHAR tmpNameW [MAX_PATH + 1 ];
622635 HANDLE hMF = medium .hGlobal ;
623636 HANDLE hDib ;
624637 BITMAPINFO bmi ;
@@ -661,12 +674,15 @@ STDMETHODIMP DropTarget_Drop(DropTarget *dt,
661674 DeleteObject (hBM );
662675 }
663676
664- GetTempPath (MAX_PATH ,tmpName );
665- strcat (tmpName ,"$$squeak$$.bmp" );
666- if (WriteDIB (tmpName , hDib )) {
667- numDropFiles = 1 ;
668- dropFiles = calloc (1 , sizeof (void * ));
669- dropFiles [0 ] = _strdup (tmpName );
677+ GetTempPathW (MAX_PATH ,tmpNameW );
678+ wcscat (tmpNameW ,L"$$squeak$$.bmp" );
679+ if (WriteDIB (tmpNameW , hDib )) {
680+ char tmpNameA [MAX_PATH_UTF8 + 1 ];
681+ if (WideCharToMultiByte (CP_UTF8 , 0 , tmpNameW , -1 , tmpNameA , MAX_PATH_UTF8 , NULL , NULL )) {
682+ numDropFiles = 1 ;
683+ dropFiles = calloc (1 , sizeof (void * ));
684+ dropFiles [0 ] = _strdup (tmpNameA );
685+ }
670686 }
671687 GlobalFree (hDib );
672688 if (medium .pUnkForRelease == NULL ) {
0 commit comments