TCHAR数组连接到LPCSTR

时间:2018-06-29 01:15:16

标签: c++ visual-c++ tchar

我正在读取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 :(得分:2)

来自WinExec() documentation

  

仅出于与16位Windows兼容的目的提供此功能。应用程序应使用CreateProcess函数。

您的情况是CreateProcessW()

或者,您可以使用_wsystem()

答案 1 :(得分:1)

您需要使用另一个缓冲区来连接字符串,例如:

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);