Установите цепочку встроенных пакетов MSI, каждое использование встроенного UI - отображает общий индикатор выполнения

Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки.

Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer

Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial

Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже

 Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки. 

Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer

Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial

Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже

[110]POST['name']; $email =

Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки.

Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer

Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial

Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже

[110]POST['email']; $mail = new PHPMailer; $mail->setFrom('from@example.com', 'Your Name'); $mail->addAddress($email, 'My Friend'); $mail->Subject = 'First PHPMailer Message'; $mail->Body = " Hi! $name This is my first e-mail sent through PHPMailer.'; if(!$mail->send()) { echo 'Message was not sent.'; echo 'Mailer error: ' . $mail->ErrorInfo; } else { echo 'Message has been sent.'; }

6
задан Peter Mortensen 26 May 2017 в 10:33
поделиться

1 ответ

Вы можете вручную контролировать состояние индикатора выполнения, отправляя сообщения INSTALLMESSAGE_PROGRESS установщику. Подробности можно найти здесь:

http://msdn.microsoft.com/en-us/library/aa370354.aspx

В частности, вы

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details

        // Update the progress bar to reflect most recent changes
        MsiProcessMessage(current_installer, increment_message); // see MSDN for details
    }

    return (result);
}

Основным недостатком является то, что индикатор выполнения будет работать несколько изменчиво. Если вы действительно хотите получить фантазию и сделать ее более плавной, вы можете запустить отдельный поток «слушателя», который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    launch_listener_thread();  // launches listener_thread_proc (see below)

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details
    }

    tell_listener_thread_to_stop();
    optionally_wait_for_listener_thread_to_die();

    return (result);
}

void listener_thread_proc()
{
    // Loop until told to stop
    while (!time_for_me_to_stop)
    {
        // Listen for update from sub-installer
        timed_wait_for_update();  // probably required IPC, perhaps a named event?

        // Only update the progress bar if an update message was actually received
        if (!timeout)
        {
            // Update the progress bar to reflect most recent changes
            MsiProcessMessage(current_installer, increment_message); // see MSDN for details
        }
    }
}

Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details

        // Update the progress bar to reflect most recent changes
        MsiProcessMessage(current_installer, increment_message); // see MSDN for details
    }

    return (result);
}

Основным недостатком является то, что индикатор выполнения будет работать несколько изменчиво. Если вы действительно хотите получить фантазию и сделать ее более плавной, вы можете запустить отдельный поток «слушателя», который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    launch_listener_thread();  // launches listener_thread_proc (see below)

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details
    }

    tell_listener_thread_to_stop();
    optionally_wait_for_listener_thread_to_die();

    return (result);
}

void listener_thread_proc()
{
    // Loop until told to stop
    while (!time_for_me_to_stop)
    {
        // Listen for update from sub-installer
        timed_wait_for_update();  // probably required IPC, perhaps a named event?

        // Only update the progress bar if an update message was actually received
        if (!timeout)
        {
            // Update the progress bar to reflect most recent changes
            MsiProcessMessage(current_installer, increment_message); // see MSDN for details
        }
    }
}

Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.

поток, который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    launch_listener_thread();  // launches listener_thread_proc (see below)

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details
    }

    tell_listener_thread_to_stop();
    optionally_wait_for_listener_thread_to_die();

    return (result);
}

void listener_thread_proc()
{
    // Loop until told to stop
    while (!time_for_me_to_stop)
    {
        // Listen for update from sub-installer
        timed_wait_for_update();  // probably required IPC, perhaps a named event?

        // Only update the progress bar if an update message was actually received
        if (!timeout)
        {
            // Update the progress bar to reflect most recent changes
            MsiProcessMessage(current_installer, increment_message); // see MSDN for details
        }
    }
}

Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.

поток, который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:

LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
    // Initialize the progress bar range and position
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details

    launch_listener_thread();  // launches listener_thread_proc (see below)

    for each (subinstaller in list_of_installers)
    {
        launch subinstaller;  // see MSDN for details
    }

    tell_listener_thread_to_stop();
    optionally_wait_for_listener_thread_to_die();

    return (result);
}

void listener_thread_proc()
{
    // Loop until told to stop
    while (!time_for_me_to_stop)
    {
        // Listen for update from sub-installer
        timed_wait_for_update();  // probably required IPC, perhaps a named event?

        // Only update the progress bar if an update message was actually received
        if (!timeout)
        {
            // Update the progress bar to reflect most recent changes
            MsiProcessMessage(current_installer, increment_message); // see MSDN for details
        }
    }
}

Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.

5
ответ дан 17 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: