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); }
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 BOOL GetOpenSaveFileNameUTF8(LPOPENFILENAME lpofn, BOOL save) { OPENFILENAMEW tmp={sizeof(tmp),lpofn->hwndOwner,lpofn->hInstance,}; BOOL ret; // allocate, convert input if (lpofn->lpstrFilter) tmp.lpstrFilter = WDL_UTF8ToWC(lpofn->lpstrFilter,TRUE,0,0); tmp.nFilterIndex = lpofn->nFilterIndex ; if (lpofn->lpstrFile) tmp.lpstrFile = WDL_UTF8ToWC(lpofn->lpstrFile,FALSE,lpofn->nMaxFile,&tmp.nMaxFile); if (lpofn->lpstrFileTitle) tmp.lpstrFileTitle = WDL_UTF8ToWC(lpofn->lpstrFileTitle,FALSE,lpofn->nMaxFileTitle,&tmp.nMaxFileTitle); if (lpofn->lpstrInitialDir) tmp.lpstrInitialDir = WDL_UTF8ToWC(lpofn->lpstrInitialDir,0,0,0); if (lpofn->lpstrTitle) tmp.lpstrTitle = WDL_UTF8ToWC(lpofn->lpstrTitle,0,0,0); if (lpofn->lpstrDefExt) tmp.lpstrDefExt = WDL_UTF8ToWC(lpofn->lpstrDefExt,0,0,0); tmp.Flags = lpofn->Flags; tmp.lCustData = lpofn->lCustData; tmp.lpfnHook = lpofn->lpfnHook; tmp.lpTemplateName = (const WCHAR *)lpofn->lpTemplateName ; ret=save ? GetSaveFileNameW(&tmp) : GetOpenFileNameW(&tmp); // free, convert output if (ret && lpofn->lpstrFile && tmp.lpstrFile) { if ((tmp.Flags & OFN_ALLOWMULTISELECT) && tmp.lpstrFile[wcslen(tmp.lpstrFile)+1]) { char *op = lpofn->lpstrFile; WCHAR *ip = tmp.lpstrFile; while (*ip) { const int bcount = WideCharToMultiByte(CP_UTF8,0,ip,-1,NULL,0,NULL,NULL); const int maxout=lpofn->nMaxFile - 2 - (int)(op - lpofn->lpstrFile); if (maxout < 2+bcount) break; op += WideCharToMultiByte(CP_UTF8,0,ip,-1,op,maxout,NULL,NULL); ip += wcslen(ip)+1; } *op=0; } else { int len = WideCharToMultiByte(CP_UTF8,0,tmp.lpstrFile,-1,lpofn->lpstrFile,lpofn->nMaxFile-1,NULL,NULL); if (len == 0 && GetLastError()==ERROR_INSUFFICIENT_BUFFER) len = lpofn->nMaxFile-2; lpofn->lpstrFile[len]=0; if (!len) { lpofn->lpstrFile[len+1]=0; ret=0; } } // convert } lpofn->nFileOffset = tmp.nFileOffset ; lpofn->nFileExtension = tmp.nFileExtension; lpofn->lCustData = tmp.lCustData; free((WCHAR *)tmp.lpstrFilter); free((WCHAR *)tmp.lpstrFile); free((WCHAR *)tmp.lpstrFileTitle); free((WCHAR *)tmp.lpstrInitialDir); free((WCHAR *)tmp.lpstrTitle); free((WCHAR *)tmp.lpstrDefExt ); lpofn->nFilterIndex = tmp.nFilterIndex ; return ret; }