【问题标题】:TCHAR Array to a concatenate LPCSTRTCHAR 数组到连接的 LPCSTR
【发布时间】:2018-06-29 01:15:15
【问题描述】:

我正在读取一个 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,但我在 TCHAR[] 中有 fileName 并想与其他一些字符串连接。

如何正确转换或连接它?

【问题讨论】:

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


    【解决方案1】:

    来自WinExec() documentation

    提供此功能只是为了与 16 位 Windows 兼容。应用程序应使用CreateProcess 函数。

    在你的情况下是CreateProcessW()

    或者,您可以使用_wsystem()

    【讨论】:

    • 当您使用CreateProcessW 时,请摆脱所有TCHAR 的东西。始终使用宽字符,而不是可能是宽字符也可能不是的东西。 20 年前,当世界适应基于 Windows NT 的操作系统时,它是一个有用的桥梁,但您最后一次需要编写代码来支持 Windows 98 是什么时候?
    • 我不需要支持 Windows 98。我认为最低要求是 Windows Server 2000。我是 C++ 新手,我还在学习很多东西。你能为我的情况提供一个代码sn-p吗?
    • 只需将字符串类型中的T 替换为W,将_T() 替换为L 前缀,并将W 附加到API 函数名称,例如:LPCWSTR path = L".\\my.ini"; WCHAR fileName[500]; int b = GetPrivateProfileStringW(L"Paths", L"filename", L"", fileName, 500, path); ...跨度>
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多