0

現在、Visual Studio 2010 C++ カスタム アクション プロジェクトを使用しています。

次のようなカスタム アクションがあります。

extern "C" UINT __stdcall RegProductName(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
char szLocalPath[MAX_PATH];


hr = WcaInitialize(hInstall, "RegProductName");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");

strcpy(szLocalPath, Orc_Get_Product_Name());
MsiSetProperty(hInstall, "ProductName",  szLocalPath);

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

エラーは発生しませんが、やりたいことを正しく行っているかどうかはわかりません。この行で:

strcpy(szLocalPath, Orc_Get_Product_Name()); 

関数から製品名を取得し、それを szLocalPath にコピーしています。ただし、この変数を他の関数や自分の wix プロジェクトで何度も使用したいと考えています。

これは正しい方法ですか?

MsiSetProperty(hInstall, "ProductName",  szLocalPath);

どうもありがとう

4

1 に答える 1

0

ここでは問題は見られませんが、潜在的なバッファ オーバーフローstrcpy. 関数Orc_Get_Product_Name()がより長いパスを返す場合MAX_PATH。ただし、Unicode/ANSI ビルドをサポートするTCHARには、plain ではなく type を使用することをお勧めします。実際には、Unicode を有効にしてビルドする必要があります。char

そして、変数に結果MsiSetPropertyを代入したいと確信しています。hr

さらに、 Product NameをLocal Pathという変数にコピーするのは奇妙に見えます。
そして、ラベルがどこで使用されているかわかりませんLExit。関数ExitOnFailureが制御を返していないようです。失敗した場合は、 (カスタム アクションが実行されているプロセスを終了するのではなく) MSI エンジンにWcaInitialize単に返すか、別のエラー コードを返す必要があります。ERROR_INSTALL_FAILURE

于 2012-08-14T07:43:01.917 に答える