TCHAR Массив для конкатенации LPCSTR - PullRequest
0 голосов
/ 29 июня 2018

Я читаю INI-файл и после этого хочу выполнить внешнюю программу (VBS-файл). Но у меня проблемы с строковыми типами.

Это мой код.

LPCTSTR path = _T(".\\my.ini");
TCHAR fileName[500];
int b = GetPrivateProfileString(_T("Paths"), _T("filename"), _T(""), fileName, 500, path);
// fileName = myscript.vbs
// I need to execute "wscript myscript.vbs arg1"
// Execute script file. Doesnt work.
WinExec("wscript " + fileName + " arg1", MINIMZIED);
// OR. Doesnt work.
system("wscript " + fileName + " arg1");

Это не работает. WinExec хочет LPCSTR, но у меня есть fileName в TCHAR[] и я хочу объединить его с другой строкой.

Как я могу преобразовать или объединить это правильно?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вам нужно объединить строки, используя другой буфер, например:

LPCTSTR path = _T(".\\my.ini");
TCHAR fileName[500];
TCHAR command[520];

int b = GetPrivateProfileString(_T("Paths"), _T("filename"), _T(""), fileName, 500, path);
_stprintf_s(command, 520, _T("wscript %.*s arg1"), b, filename);

Тогда вы можете использовать command по мере необходимости, например:

STARTUPINFO si = {};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZED;

PROCESS_INFORMATION pi = {};

if (CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
    ...
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
}

Или:

#ifdef UNICODE
#define system_t(cmd) _wsystem(cmd)
#else
#define system_t(cmd) system(cmd)
#endif

system_t(command);
0 голосов
/ 29 июня 2018

Из документации WinExec () :

Эта функция предоставляется только для совместимости с 16-битной Windows. Приложения должны использовать функцию CreateProcess.

Что в вашем случае составляет CreateProcessW().

В качестве альтернативы вы можете использовать _wsystem().

...