C ++ concat LPCTSTR

时间:2011-03-08 16:55:30

标签: c++ string windows-ce lpcstr

我正在为WindowsCE CAB文件实现自定义操作,我需要连接LPCTSTR以获取exe的正确路径。

我的自定义操作接收LPCTSTR作为参数。

所以(伪代码):

extern "C" codeINSTALL_EXIT MYCUSTOMACTION_API Install_Exit(
    HWND    hwndParent,
    LPCTSTR pszInstallDir,
    WORD    cFailedDirs,
    WORD    cFailedFiles,
    WORD    cFailedRegKeys,
    WORD    cFailedRegVals,
    WORD    cFailedShortcuts
)
{
    if (FALSE == LaunchApp(pszInstallDir + "\\MyApp.exe"))
       ::MessageBox(hwndParent, L"Could not launch app!", L"Setup", MB_ICONINFORMATION );
    return codeINSTALL_EXIT_DONE;
}

这是使用虚构的“+”运算符,我将使用我的标准语言C#。

我对C ++的经验相对较少。为我的目的附加LPCTSTR的正确方法是什么? LaunchApp方法使用此类型作为参数。

此外,如果我想在MessageBox中显示生成的路径(用于调试目的),是否可以快速转换为LPCWSTR?

3 个答案:

答案 0 :(得分:6)

连接使用StringCchCat

TCHAR pszDest[260] = _T("");
StringCchCat(pszDest, 260, pszInstallDir); 
StringCchCat(pszDest, 260, _T("\\MyApp.exe"));
LaunchApp(pszDest);

答案 1 :(得分:2)

您需要分配一个新缓冲区来组合组合字符串,然后将两个部分复制到其中。您可以选择固定的大缓冲区大小

TCHAR fullPath[MAX_PATH + 11]; // 11 = length of "\MyApp.exe" + nul in characters
_sntprintf_s(fullPath, MAX_PATH + 11, _T("%s\\MyApp.exe"), pszInstallDir);

或动态分配以适合:

size_t installDirLen = tcslen(pszInstallDir);
size_t bufferLen = installDirLen + 11; // again 11 = len of your string
LPWSTR fullPath = new TCHAR[bufferLen];
// if you're paranoid, check allocation succeeded: fullPath != null
tcsncpy_s(fullPath, bufferLen, pszInstallDir);
tcsncat_s(fullPath, bufferLen, _T"\\MyApp.exe");
// use it
delete fullPath;

如果您处于Unicode模式,则LPCTSTR == LPCWSTR(在MBCS模式下== LPCSTR)。无论哪种方式,MessageBox宏都适合你 - 它会在适当的时候在MessageBoxA或MessageBoxW之间进行选择。


正如ctacke在下面指出的那样,在Windows CE上,我不能假设你将拥有_s函数。我认为在第二种情况下可以使用非_s变体,因为我们知道缓冲区足够大,但在第一个_sntprintf不保证输出字符串上的尾随空(如_s版本那样),所以我们需要首先自己初始化缓冲区:

size_t bufferLen = MAX_PATH + 11;
TCHAR fullPath[bufferLen];
// zero the buffer out first
memset(fullPath, 0, sizeof(TCHAR) * bufferLen);
// only write up to bufferLen - 1, i.e. ensure the last character is left zero
_sntprintf(fullPath, bufferLen - 1, _T("%s\\MyApp.exe"), pszInstallDir);

(也可以通过省略memset并使用_sntprintf的返回值来查找组合生成的字符串的结尾,然后使用下一个字符来执行此操作。)

AFAICR Windows CE仅限Unicode,因此LPCTSTR == LPCWSTR始终。

答案 2 :(得分:0)

您可以使用字符串进行连接,然后使用CA2T之类的ATL帮助器将结果转换为LPCTSTR:

-23.13166 4.16633 12.00000 -23.09247 4.37617 11.98264 0.214
-23.15132 4.16999 12.00000 -23.11229 4.37980 11.98265 0.214
-23.17098 4.17364 12.00000 -23.13216 4.38341 11.98265 0.214
....