char *
GetWin32Error(void)
{
- static char *oldmsg = NULL;
- char *msg = NULL;
+ static char *oldmsg = NULL;
+ char *acp_msg = NULL;
+ DWORD acp_len;
+ char_u *enc_msg = NULL;
+ int enc_len = 0;
+
+ // get formatted message from OS
+ acp_len = FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, GetLastError(), 0, (LPSTR)&acp_msg, 0, NULL);
+ if (acp_len == 0 || acp_msg == NULL)
+ return NULL;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, GetLastError(), 0, (LPSTR)&msg, 0, NULL);
+ // clean oldmsg if remained.
if (oldmsg != NULL)
- LocalFree(oldmsg);
- if (msg == NULL)
+ {
+ vim_free(oldmsg);
+ oldmsg = NULL;
+ }
+
+ acp_to_enc(acp_msg, (int)acp_len, &enc_msg, &enc_len);
+ LocalFree(acp_msg);
+ if (enc_msg == NULL)
return NULL;
// remove trailing \r\n
- char *pcrlf = strstr(msg, "\r\n");
+ char *pcrlf = strstr(enc_msg, "\r\n");
if (pcrlf != NULL)
*pcrlf = NUL;
- oldmsg = msg;
- return msg;
+
+ oldmsg = enc_msg;
+ return enc_msg;
}
#if defined(FEAT_RELTIME)
HANDLE o_theirs = NULL;
HANDLE i_ours = NULL;
HANDLE o_ours = NULL;
+ char *errmsg = NULL;
ga_init2(&ga_cmd, sizeof(char*), 20);
ga_init2(&ga_env, sizeof(char*), 20);
| CREATE_SUSPENDED | CREATE_DEFAULT_ERROR_MODE,
env_wchar, cwd_wchar,
&term->tl_siex.StartupInfo, &proc_info))
+ {
+ errmsg = GetWin32Error();
goto failed;
+ }
CloseHandle(i_theirs);
CloseHandle(o_theirs);
if (term->tl_conpty != NULL)
pClosePseudoConsole(term->tl_conpty);
term->tl_conpty = NULL;
+ // Propagate errors that occur in CreateProcess
+ if (errmsg)
+ semsg("CreateProcess failed: %s", errmsg);
return FAIL;
}
" the %PATH%, "term dir" succeeds unintentionally. Use dir.com instead.
try
term dir.com /b runtest.vim
- call WaitForAssert({-> assert_match('job failed', term_getline(bufnr(), 1))})
- catch /CreateProcess/
- " ignore
+ throw 'dir.com without a shell must fail, so you will never get here'
+ catch /CreateProcess failed/
+ " ignore:
+ " winpty simply fails with "CreateProcess failed".
+ " compty fails with "CreateProcess failed: {localized failure reason}".
endtry
bwipe!