1

誰でも私を助けてもらえますか?

VS2010、C++ カスタム アクション プロジェクトを使用しています。次を使用して、MSI からインストール場所を取得しようとしています。

MsiGetTargetPath

しかし、私はそれを使用する方法と、MDSN で彼らが話しているバッファを完全には理解していません。インターネットを検索しても役に立たなかったので、誰かが私に教えてくれるか、正しい方向に向けてくれませんか。

ありがとう

4

1 に答える 1

1

バッファー処理は、C および C++ プログラミングのかなり重要なトピックです。私はそれを読むことから始めます。ここに私がすぐに見つけることができる最高のものがあります:

それを理解したら、呼び出している関数の観点から考えてみてください。MsiGetTargetPathが呼び出されると、他のパラメーターが適切であると仮定して、パスと末尾の null 文字が文字に収まるかどうかを確認するパスを計算します*pcchPathBuf。収まる場合は、 が指す TCHAR 配列へのパスをコピーし、実際のサイズを反映するようszPathBufに更新して、成功を返します。*pcchPathBuf収まらない場合は、*pcchPathBuf必要なサイズ (末尾の null 文字を除く) を反映するように更新し、 を返しますERROR_MORE_DATA

したがって、コードは適切なサイズのバッファを含め、正しいパラメータを渡す必要があります。私は最初から始めてMAX_PATH、いくつかの非常に珍しいケースでのみ増やす必要があります. 次のコードは、既知のすべての実装で std::wstring の実際のレイアウトを利用していますが、C++11 までは仕様で保証されていないことに注意してください。

// assumes hInstall and strDirectory are defined and correct

std::wstring strPath; // assuming UNICODE here; use std::string if _MBCS instead
DWORD cchPath = MAX_PATH;
strPath.resize(cchPath);
DWORD nResult = ::MsiGetTargetPath(hInstall, strDirectory.c_str(), &strPath[0], &cchPath);
if (nResult == ERROR_MORE_DATA)
{
    strPath.resize(++cchPath); // allocate extra spot for trailing null character
    nResult = ::MsiGetTargetPath(hInstall, strDirectory.c_str(), &strPath[0], &cchPath);
}

if (nResult == ERROR_SUCCESS)
    strPath.resize(cchPath);
else
    strPath.clear();
于 2012-08-11T13:37:31.397 に答える