From 7e6d3bd3da555e151ba518081a964a0cdb39ac33 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 10 Jul 2010 19:22:44 +0200 Subject: Support wide file names in gvimext. (Szabolcs Horvat) --- src/GvimExt/gvimext.cpp | 64 +++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 26 deletions(-) (limited to 'src/GvimExt') diff --git a/src/GvimExt/gvimext.cpp b/src/GvimExt/gvimext.cpp index 71d180ef91..55d5a76338 100644 --- a/src/GvimExt/gvimext.cpp +++ b/src/GvimExt/gvimext.cpp @@ -85,6 +85,17 @@ getGvimName(char *name, int runtime) } } + static void +getGvimNameW(wchar_t *nameW) +{ + char *name; + + name = (char *)malloc(BUFSIZE); + getGvimName(name, 0); + mbstowcs(nameW, name, BUFSIZE); + free(name); +} + // // Get the Vim runtime directory into buf[BUFSIZE]. // The result is empty when it failed. @@ -848,34 +859,34 @@ STDMETHODIMP CShellExt::InvokeGvim(HWND hParent, LPCSTR /* pszParam */, int /* iShowCmd */) { - char m_szFileUserClickedOn[BUFSIZE]; - char cmdStr[BUFSIZE]; + wchar_t m_szFileUserClickedOn[BUFSIZE]; + wchar_t cmdStrW[BUFSIZE]; UINT i; for (i = 0; i < cbFiles; i++) { - DragQueryFile((HDROP)medium.hGlobal, + DragQueryFileW((HDROP)medium.hGlobal, i, m_szFileUserClickedOn, sizeof(m_szFileUserClickedOn)); - getGvimName(cmdStr, 0); - strcat(cmdStr, " \""); + getGvimNameW(cmdStrW); + wcscat(cmdStrW, L" \""); - if ((strlen(cmdStr) + strlen(m_szFileUserClickedOn) + 2) < BUFSIZE) + if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) < BUFSIZE) { - strcat(cmdStr, m_szFileUserClickedOn); - strcat(cmdStr, "\""); + wcscat(cmdStrW, m_szFileUserClickedOn); + wcscat(cmdStrW, L"\""); - STARTUPINFO si; + STARTUPINFOW si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); // Start the child process. - if (!CreateProcess(NULL, // No module name (use command line). - cmdStr, // Command line. + if (!CreateProcessW(NULL, // No module name (use command line). + cmdStrW, // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. @@ -919,44 +930,45 @@ STDMETHODIMP CShellExt::InvokeSingleGvim(HWND hParent, int /* iShowCmd */, int useDiff) { - char m_szFileUserClickedOn[BUFSIZE]; - char *cmdStr; + wchar_t m_szFileUserClickedOn[BUFSIZE]; + wchar_t *cmdStrW; size_t cmdlen; size_t len; UINT i; cmdlen = BUFSIZE; - cmdStr = (char *)malloc(cmdlen); - getGvimName(cmdStr, 0); + cmdStrW = (wchar_t *) malloc(cmdlen * sizeof(wchar_t)); + getGvimNameW(cmdStrW); + if (useDiff) - strcat(cmdStr, " -d"); + wcscat(cmdStrW, L" -d"); for (i = 0; i < cbFiles; i++) { - DragQueryFile((HDROP)medium.hGlobal, + DragQueryFileW((HDROP)medium.hGlobal, i, m_szFileUserClickedOn, sizeof(m_szFileUserClickedOn)); - len = strlen(cmdStr) + strlen(m_szFileUserClickedOn) + 4; + len = wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 4; if (len > cmdlen) { cmdlen = len + BUFSIZE; - cmdStr = (char *)realloc(cmdStr, cmdlen); + cmdStrW = (wchar_t *)realloc(cmdStrW, cmdlen * sizeof(wchar_t)); } - strcat(cmdStr, " \""); - strcat(cmdStr, m_szFileUserClickedOn); - strcat(cmdStr, "\""); + wcscat(cmdStrW, L" \""); + wcscat(cmdStrW, m_szFileUserClickedOn); + wcscat(cmdStrW, L"\""); } - STARTUPINFO si; + STARTUPINFOW si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); // Start the child process. - if (!CreateProcess(NULL, // No module name (use command line). - cmdStr, // Command line. + if (!CreateProcessW(NULL, // No module name (use command line). + cmdStrW, // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. @@ -979,7 +991,7 @@ STDMETHODIMP CShellExt::InvokeSingleGvim(HWND hParent, CloseHandle(pi.hThread); } - free(cmdStr); + free(cmdStrW); return NOERROR; } -- cgit v1.2.3