1

誰でもこれを行う方法を推奨できますか:

メイン アプリケーションがあり、いくつかの条件に応じて、メイン アプリケーションに関連する 7 つのドライバーのファイルをインストールするオプションがあります。問題は、進行状況のテキストを次のように更新したいということです。

機能 1 を選択した場合は、「機能 1 のインストール」というテキストを追加します。

カスタムアクションの進行状況テキストのみを設定できることがわかっている限り、これをどのように達成するかについてのアイデア..:(

4

1 に答える 1

1

まず、ADDLOCALプロパティをCustomActionData次のように設定します。

 <CustomAction Id="SetAddLocalProperty" Return="check" Property="InstallDrivers" Value="[ADDLOCAL]"></CustomAction> 

次に、カスタムアクションを呼び出す前に、このカスタムアクションを実行するようにスケジュールしましたInstallDriver

extern "C" UINT __stdcall InstallDrivers(MSIHANDLE hInstall)
{
    HRESULT hr = S_OK;
    UINT er = ERROR_SUCCESS;
    LPWSTR szValueBuf = NULL;
    char CustomActionData[MAX_PATH];
    const UINT iTickIncrement = 1000;
    const UINT iNumberItems = 3;
    const UINT iTotalTicks = iTickIncrement * iNumberItems;
    PMSIHANDLE hActionRec = MsiCreateRecord(10);
    PMSIHANDLE hProgressRec = MsiCreateRecord(3);

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

    WcaLog(LOGMSG_STANDARD, "Initialized.");

    hr = WcaGetProperty(L"CustomActionData",&szValueBuf);
    ExitOnFailure(hr, "failed to get CustomActionData");

    wcstombs(CustomActionData, szValueBuf, 260);

    char *token = strtok(CustomActionData, ",");

    while (token != NULL) 
    {
        MsiRecordSetString(hActionRec, 1, TEXT("MyCustomAction"));

        if (strcmp(token, "Driver1") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver1"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver2") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver2"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver3") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver3"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver4") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver4"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver5") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver5"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver6") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver6"));
            token = strtok (NULL, ",");
        }
        else if (strcmp(token, "Driver7") ==0)
        {
            MsiRecordSetString(hActionRec, 2, TEXT("Installing Driver7"));
            token = strtok (NULL, ",");
        }   
        else
        {
            MsiRecordSetString(hActionRec, 2, TEXT(""));
            token = strtok (NULL, ",");
        }

        MsiRecordSetString(hActionRec, 3, TEXT("Incrementing tick [1] of [2]"));

        UINT iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_ACTIONSTART, hActionRec);
        if ((iResult == IDCANCEL))
            return ERROR_INSTALL_USEREXIT;


        MsiRecordSetInteger(hProgressRec, 1, 1);
        MsiRecordSetInteger(hProgressRec, 2, 1);
        MsiRecordSetInteger(hProgressRec, 3, 0);
        iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_PROGRESS, hProgressRec);
        if ((iResult == IDCANCEL))
            return ERROR_INSTALL_USEREXIT;

        MsiRecordSetInteger(hProgressRec, 1, 2);
        MsiRecordSetInteger(hProgressRec, 2, iTickIncrement);
        MsiRecordSetInteger(hProgressRec, 3, 0);

        MsiRecordSetInteger(hActionRec, 2, iTotalTicks);

        for( int i = 0; i < iTotalTicks; i+=iTickIncrement)
        {
            MsiRecordSetInteger(hActionRec, 1, i);

            iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_ACTIONDATA, hActionRec);
            if ((iResult == IDCANCEL))
                return ERROR_INSTALL_USEREXIT;

            iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_PROGRESS, hProgressRec);
            if ((iResult == IDCANCEL))
                return ERROR_INSTALL_USEREXIT;

            Sleep(1000);            
        }
    }

    LExit:
    er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
    return WcaFinalize(er);
}
于 2013-01-14T10:37:16.190 に答える