1

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 に変換する簡単な方法はありますか?

4

3 に答える 3

6

連結にはStringCchCatを使用します

TCHAR pszDest[260] = _T("");
StringCchCat(pszDest, 260, pszInstallDir); 
StringCchCat(pszDest, 260, _T("\\MyApp.exe"));
LaunchApp(pszDest);
于 2011-03-08T16:57:17.110 に答える
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 関数を使用するとは想定できません。2 番目のケースでは、バッファーが十分に大きいことがわかっているので、非 _s バリアントを使用しても問題ないと思いますが、最初の _sntprintf では、出力文字列の末尾の null が保証されないため (_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 の戻り値を使用して、結合された生成された文字列の末尾を見つけ、次の文字を nul にすることで、これを行うことも可能です。)

AFAICR Windows CE は Unicode のみであるため、常に LPCTSTR == LPCWSTR です。

于 2011-03-08T17:06:02.160 に答える