誰でも私を助けてもらえますか?
VS2010、C++ カスタム アクション プロジェクトを使用しています。次を使用して、MSI からインストール場所を取得しようとしています。
MsiGetTargetPath
しかし、私はそれを使用する方法と、MDSN で彼らが話しているバッファを完全には理解していません。インターネットを検索しても役に立たなかったので、誰かが私に教えてくれるか、正しい方向に向けてくれませんか。
ありがとう
誰でも私を助けてもらえますか?
VS2010、C++ カスタム アクション プロジェクトを使用しています。次を使用して、MSI からインストール場所を取得しようとしています。
MsiGetTargetPath
しかし、私はそれを使用する方法と、MDSN で彼らが話しているバッファを完全には理解していません。インターネットを検索しても役に立たなかったので、誰かが私に教えてくれるか、正しい方向に向けてくれませんか。
ありがとう
バッファー処理は、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();