static LRESULT WINAPI tc_newProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP); if (!oldproc) return 0; if (msg==WM_NCDESTROY) { SetWindowLongPtr(hwnd, GWLP_WNDPROC,(INT_PTR)oldproc); RemoveProp(hwnd,WDL_UTF8_OLDPROCPROP); } else if (msg == TCM_INSERTITEMA) { LPTCITEM pItem = (LPTCITEM) lParam; char *str; if (pItem && (str=pItem->pszText) && (pItem->mask&TCIF_TEXT) && WDL_HasUTF8(str)) { MBTOWIDE(wbuf,str); if (wbuf_ok) { LRESULT rv; pItem->pszText=(char*)wbuf; // set new buffer rv=CallWindowProc(oldproc,hwnd,TCM_INSERTITEMW,wParam,lParam); pItem->pszText = str; // restore old pointer MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } } return CallWindowProc(oldproc,hwnd,msg,wParam,lParam); }
static LRESULT WINAPI cb_newProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP); if (!oldproc) return 0; if (msg==WM_NCDESTROY) { SetWindowLongPtr(hwnd, GWLP_WNDPROC,(INT_PTR)oldproc); RemoveProp(hwnd,WDL_UTF8_OLDPROCPROP); RemoveProp(hwnd,WDL_UTF8_OLDPROCPROP "W"); } else if (msg == CB_ADDSTRING || msg == CB_INSERTSTRING || msg == LB_ADDSTRING || msg == LB_INSERTSTRING) { char *str=(char*)lParam; if (lParam && WDL_HasUTF8(str)) { MBTOWIDE(wbuf,str); if (wbuf_ok) { WNDPROC oldprocW = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP "W"); LRESULT rv=CallWindowProcW(oldprocW ? oldprocW : oldproc,hwnd,msg,wParam,(LPARAM)wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } } else if (msg == CB_GETLBTEXT && lParam) { WNDPROC oldprocW = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP "W"); LRESULT l = CallWindowProcW(oldprocW ? oldprocW : oldproc,hwnd,CB_GETLBTEXTLEN,wParam,0); if (l != CB_ERR) { WIDETOMB_ALLOC(tmp,l+1); if (tmp) { LRESULT rv=CallWindowProcW(oldprocW ? oldprocW : oldproc,hwnd,msg,wParam,(LPARAM)tmp)+1; if (rv>=0) { *(char *)lParam=0; rv=WideCharToMultiByte(CP_UTF8,0,tmp,-1,(char *)lParam,((int)l+1)*3 + 32,NULL,NULL); if (rv>0) rv--; } WIDETOMB_FREE(tmp); return rv; } } } else if (msg == CB_GETLBTEXTLEN) { WNDPROC oldprocW = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP "W"); return CallWindowProcW(oldprocW ? oldprocW : oldproc,hwnd,msg,wParam,lParam) * 3 + 32; // make sure caller allocates a lot extra } return CallWindowProc(oldproc,hwnd,msg,wParam,lParam); }
HINSTANCE ShellExecuteUTF8(HWND hwnd, LPCTSTR lpOp, LPCTSTR lpFile, LPCTSTR lpParm, LPCTSTR lpDir, INT nShowCmd) { if (IS_NOT_WIN9X_AND (WDL_HasUTF8(lpOp)||WDL_HasUTF8(lpFile)||WDL_HasUTF8(lpParm)||WDL_HasUTF8(lpDir))) { DWORD sz; WCHAR *p1=lpOp ? WDL_UTF8ToWC(lpOp,0,0,&sz) : NULL; WCHAR *p2=lpFile ? WDL_UTF8ToWC(lpFile,0,0,&sz) : NULL; WCHAR *p3=lpParm ? WDL_UTF8ToWC(lpParm,0,0,&sz) : NULL; WCHAR *p4=lpDir ? WDL_UTF8ToWC(lpDir,0,0,&sz) : NULL; HINSTANCE rv= p2 ? ShellExecuteW(hwnd,p1,p2,p3,p4,nShowCmd) : NULL; free(p1); free(p2); free(p3); free(p4); return rv; } return ShellExecuteA(hwnd,lpOp,lpFile,lpParm,lpDir,nShowCmd); }
int MessageBoxUTF8(HWND hwnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT fl) { if ((WDL_HasUTF8(lpText)||WDL_HasUTF8(lpCaption)) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,lpText); if (wbuf_ok) { MBTOWIDE(wcap,lpCaption?lpCaption:""); if (wcap_ok) { int ret=MessageBoxW(hwnd,wbuf,lpCaption?wcap:NULL,fl); MBTOWIDE_FREE(wcap); MBTOWIDE_FREE(wbuf); return ret; } MBTOWIDE_FREE(wbuf); } } return MessageBoxA(hwnd,lpText,lpCaption,fl); }
BOOL CopyFileUTF8(LPCTSTR existfn, LPCTSTR newfn, BOOL fie) { if ((WDL_HasUTF8(existfn)||WDL_HasUTF8(newfn)) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,existfn); if (wbuf_ok) { MBTOWIDE(wbuf2,newfn); if (wbuf2_ok) { int rv=CopyFileW(wbuf,wbuf2,fie); MBTOWIDE_FREE(wbuf2); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf2); } MBTOWIDE_FREE(wbuf); } return CopyFileA(existfn,newfn,fie); }
BOOL CopyFileUTF8(LPCTSTR existfn, LPCTSTR newfn, BOOL fie) { if ((WDL_HasUTF8(existfn)||WDL_HasUTF8(newfn)) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,existfn); if (wbuf_ok) { MBTOWIDE(wbuf2,newfn); if (wbuf2_ok) { int rv=CopyFileW(wbuf,wbuf2,fie); MBTOWIDE_FREE(wbuf2); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf2); } MBTOWIDE_FREE(wbuf); } return CopyFileA(existfn,newfn,fie); }
struct _ITEMIDLIST *SHBrowseForFolderUTF8(struct _browseinfoA *bi) { if (bi && (WDL_HasUTF8(bi->pszDisplayName) || WDL_HasUTF8(bi->lpszTitle)) AND_IS_NOT_WIN9X) { MBTOWIDE(wfn,bi->pszDisplayName); if (wfn_ok) { MBTOWIDE(wtxt,bi->lpszTitle); if (wtxt_ok) { BROWSEINFOW biw ={ bi->hwndOwner,bi->pidlRoot,wfn,wtxt,bi->ulFlags,bi->lpfn,(LPARAM)bi->lParam,bi->iImage }; LPITEMIDLIST idlist = SHBrowseForFolderW(&biw); MBTOWIDE_FREE(wfn); MBTOWIDE_FREE(wtxt); return (struct _ITEMIDLIST *) idlist; } MBTOWIDE_FREE(wtxt); } MBTOWIDE_FREE(wfn); } return (struct _ITEMIDLIST *)SHBrowseForFolderA(bi); }
HANDLE CreateFileUTF8(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile) { if (WDL_HasUTF8(lpFileName) AND_IS_NOT_WIN9X) { HANDLE h = INVALID_HANDLE_VALUE; MBTOWIDE(wstr, lpFileName); if (wstr_ok) h = CreateFileW(wstr,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile); MBTOWIDE_FREE(wstr); if (h != INVALID_HANDLE_VALUE) return h; } return CreateFileA(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile); }
BOOL InsertMenuUTF8(HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR str) { if (str && WDL_HasUTF8(str) && GetVersion()<0x80000000) { MBTOWIDE(wbuf,str); if (wbuf_ok) { BOOL rv=InsertMenuW(hMenu,uPosition,uFlags,uIDNewItem,wbuf); MBTOWIDE_FREE(wbuf); return rv; } } return InsertMenuA(hMenu,uPosition,uFlags,uIDNewItem,str); }
BOOL InsertMenuUTF8(HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR str) { if (!(uFlags&(MF_BITMAP|MF_SEPARATOR)) && str && WDL_HasUTF8(str) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,str); if (wbuf_ok) { BOOL rv=InsertMenuW(hMenu,uPosition,uFlags,uIDNewItem,wbuf); MBTOWIDE_FREE(wbuf); return rv; } } return InsertMenuA(hMenu,uPosition,uFlags,uIDNewItem,str); }
BOOL DeleteFileUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=DeleteFileW(wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return DeleteFileA(path); }
BOOL CreateDirectoryUTF8(LPCTSTR path, LPSECURITY_ATTRIBUTES attr) { if (WDL_HasUTF8(path) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=CreateDirectoryW(wbuf,attr); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return CreateDirectoryA(path,attr); }
BOOL DeleteFileUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=DeleteFileW(wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return DeleteFileA(path); }
BOOL CreateDirectoryUTF8(LPCTSTR path, LPSECURITY_ATTRIBUTES attr) { if (WDL_HasUTF8(path) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=CreateDirectoryW(wbuf,attr); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return CreateDirectoryA(path,attr); }
BOOL RemoveDirectoryUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=RemoveDirectoryW(wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return RemoveDirectoryA(path); }
BOOL RemoveDirectoryUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,path); if (wbuf_ok) { BOOL rv=RemoveDirectoryW(wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return RemoveDirectoryA(path); }
int WDL_UTF8_SendBFFM_SETSEL(HWND hwnd, const char *str) { if (IS_NOT_WIN9X_AND WDL_HasUTF8(str)) { MBTOWIDE(wc, str); if (wc_ok) { int r=(int)SendMessage(hwnd, BFFM_SETSELECTIONW, 1, (LPARAM)wc); MBTOWIDE_FREE(wc); return r; } MBTOWIDE_FREE(wc); } return (int) SendMessage(hwnd, BFFM_SETSELECTIONA, 1, (LPARAM)str); }
BOOL SetWindowTextUTF8(HWND hwnd, LPCTSTR str) { if (WDL_HasUTF8(str) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,str); if (wbuf_ok) { BOOL rv=SetWindowTextW(hwnd,wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return SetWindowTextA(hwnd,str); }
FILE *fopenUTF8(const char *filename, const char *mode) { if (WDL_HasUTF8(filename) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,filename); if (wbuf_ok) { FILE *rv; WCHAR tb[32]; tb[0]=0; MultiByteToWideChar(CP_UTF8,0,mode,-1,tb,32); rv=tb[0] ? _wfopen(wbuf,tb) : NULL; MBTOWIDE_FREE(wbuf); if (rv) return rv; } } return fopen(filename,mode); }
HINSTANCE LoadLibraryUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) && GetVersion()< 0x80000000) { MBTOWIDE(wbuf,path); if (wbuf_ok) { HINSTANCE rv=LoadLibraryW(wbuf); if (rv) { MBTOWIDE_FREE(wbuf); return rv; } } MBTOWIDE_FREE(wbuf); } return LoadLibraryA(path); }
int statUTF8(const char *filename, struct stat *buffer) { if (WDL_HasUTF8(filename) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,filename); if (wbuf_ok) { int rv=_wstat(wbuf,(struct _stat*)buffer); MBTOWIDE_FREE(wbuf); if (!rv) return rv; } else { MBTOWIDE_FREE(wbuf); } } return stat(filename,buffer); }
int statUTF8(const char *filename, struct stat *buffer) { if (WDL_HasUTF8(filename) && GetVersion()<0x80000000) { MBTOWIDE(wbuf,filename); if (wbuf_ok) { int rv=_wstat(wbuf,(struct _stat*)buffer); MBTOWIDE_FREE(wbuf); if (!rv) return rv; } else { MBTOWIDE_FREE(wbuf); } } return stat(filename,buffer); }
HINSTANCE LoadLibraryUTF8(LPCTSTR path) { if (WDL_HasUTF8(path) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,path); if (wbuf_ok) { HINSTANCE rv=LoadLibraryW(wbuf); if (rv) { MBTOWIDE_FREE(wbuf); return rv; } } MBTOWIDE_FREE(wbuf); } return LoadLibraryA(path); }
int DrawTextUTF8(HDC hdc, LPCTSTR str, int nc, LPRECT lpRect, UINT format) { if (WDL_HasUTF8(str) && GetVersion()<0x80000000) { if (nc<0) nc=strlen(str); { MBTOWIDE(wstr, str); if (wstr_ok) { int rv=DrawTextW(hdc,wstr,-1,lpRect,format);; MBTOWIDE_FREE(wstr); return rv; } MBTOWIDE_FREE(wstr); } } return DrawTextA(hdc,str,nc,lpRect,format); }
int DrawTextUTF8(HDC hdc, LPCTSTR str, int nc, LPRECT lpRect, UINT format) { if (WDL_HasUTF8(str) AND_IS_NOT_WIN9X) { if (nc<0) nc=(int)strlen(str); { MBTOWIDE(wstr, str); if (wstr_ok) { int rv=DrawTextW(hdc,wstr,-1,lpRect,format);; MBTOWIDE_FREE(wstr); return rv; } MBTOWIDE_FREE(wstr); } } return DrawTextA(hdc,str,nc,lpRect,format); }
BOOL SetDlgItemTextUTF8(HWND hDlg, int nIDDlgItem, LPCTSTR lpString) { HWND h = GetDlgItem(hDlg,nIDDlgItem); if (!h) return FALSE; if (WDL_HasUTF8(lpString) AND_IS_NOT_WIN9X) { MBTOWIDE(wbuf,lpString); if (wbuf_ok) { BOOL rv = SetWindowTextW(h, wbuf); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return SetWindowTextA(h, lpString); }
void MarkerList::ExportToClipboard(const char* format) { char* str = GetFormattedList(format); if (!str || !strlen(str) || !OpenClipboard(g_hwndParent)) { delete [] str; return; } EmptyClipboard(); HGLOBAL hglbCopy; #ifdef _WIN32 #if !defined(WDL_NO_SUPPORT_UTF8) if (WDL_HasUTF8(str)) { DWORD size; WCHAR* wc = WDL_UTF8ToWC(str, false, 0, &size); hglbCopy = GlobalAlloc(GMEM_MOVEABLE, size*sizeof(WCHAR)); memcpy(GlobalLock(hglbCopy), wc, size*sizeof(WCHAR)); free(wc); GlobalUnlock(hglbCopy); SetClipboardData(CF_UNICODETEXT, hglbCopy); } else #endif #endif { hglbCopy = GlobalAlloc(GMEM_MOVEABLE, strlen(str)+1); memcpy(GlobalLock(hglbCopy), str, strlen(str)+1); GlobalUnlock(hglbCopy); SetClipboardData(CF_TEXT, hglbCopy); } CloseClipboard(); delete [] str; }
static LRESULT WINAPI tv_newProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetProp(hwnd,WDL_UTF8_OLDPROCPROP); if (!oldproc) return 0; if (msg==WM_NCDESTROY) { SetWindowLongPtr(hwnd, GWLP_WNDPROC,(INT_PTR)oldproc); RemoveProp(hwnd,WDL_UTF8_OLDPROCPROP); } else if (msg == TVM_INSERTITEMA || msg == TVM_SETITEMA) { LPTVITEM pItem = msg == TVM_INSERTITEMA ? &((LPTVINSERTSTRUCT)lParam)->item : (LPTVITEM) lParam; char *str; if (pItem && (str=pItem->pszText) && (pItem->mask&TVIF_TEXT) && WDL_HasUTF8(str)) { MBTOWIDE(wbuf,str); if (wbuf_ok) { LRESULT rv; pItem->pszText=(char*)wbuf; // set new buffer rv=CallWindowProc(oldproc,hwnd,msg == TVM_INSERTITEMA ? TVM_INSERTITEMW : TVM_SETITEMW,wParam,lParam); pItem->pszText = str; // restore old pointer MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } } else if (msg==TVM_GETITEMA) { LPTVITEM pItem = (LPTVITEM) lParam; char *obuf; if (pItem && (pItem->mask & TVIF_TEXT) && (obuf=pItem->pszText) && pItem->cchTextMax > 3) { WIDETOMB_ALLOC(wbuf,pItem->cchTextMax); if (wbuf) { LRESULT rv; int oldsz=pItem->cchTextMax; *wbuf=0; *obuf=0; pItem->cchTextMax=(int) (wbuf_size/sizeof(WCHAR)); pItem->pszText = (char *)wbuf; rv=CallWindowProc(oldproc,hwnd,TVM_GETITEMW,wParam,lParam); if (!WideCharToMultiByte(CP_UTF8,0,wbuf,-1,obuf,oldsz,NULL,NULL) && GetLastError()==ERROR_INSUFFICIENT_BUFFER) obuf[oldsz-1]=0; pItem->cchTextMax=oldsz; pItem->pszText=obuf; WIDETOMB_FREE(wbuf); if (obuf[0]) return rv; } } } return CallWindowProc(oldproc,hwnd,msg,wParam,lParam); }
BOOL SetMenuItemInfoUTF8( HMENU hMenu,UINT uItem, BOOL fByPosition, LPMENUITEMINFO lpmii) { if (!lpmii) return FALSE; if ((lpmii->fMask & MIIM_TYPE) && (lpmii->fType&(MFT_SEPARATOR|MFT_STRING|MFT_BITMAP)) == MFT_STRING && lpmii->dwTypeData && WDL_HasUTF8(lpmii->dwTypeData) AND_IS_NOT_WIN9X) { BOOL rv; MENUITEMINFOW tmp = *(MENUITEMINFOW*)lpmii; MBTOWIDE(wbuf,lpmii->dwTypeData); if (wbuf_ok) { tmp.cbSize=sizeof(tmp); tmp.dwTypeData = wbuf; rv=SetMenuItemInfoW(hMenu,uItem,fByPosition,&tmp); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return SetMenuItemInfoA(hMenu,uItem,fByPosition,lpmii); }
BOOL InsertMenuItemUTF8( HMENU hMenu,UINT uItem, BOOL fByPosition, LPMENUITEMINFO lpmii) { if (lpmii && (lpmii->fMask & MIIM_TYPE) && (lpmii->fType&(MFT_SEPARATOR|MFT_STRING|MFT_BITMAP)) == MFT_STRING && lpmii->dwTypeData && WDL_HasUTF8(lpmii->dwTypeData) && GetVersion()<0x80000000) { BOOL rv; MENUITEMINFOW tmp = *(MENUITEMINFOW*)lpmii; MBTOWIDE(wbuf,lpmii->dwTypeData); if (wbuf_ok) { tmp.cbSize=sizeof(tmp); tmp.dwTypeData = wbuf; rv=InsertMenuItemW(hMenu,uItem,fByPosition,&tmp); MBTOWIDE_FREE(wbuf); return rv; } MBTOWIDE_FREE(wbuf); } return InsertMenuItemA(hMenu,uItem,fByPosition,lpmii); }