CreateDesktop () с перспективой и контролем учётных записей на (C, окна)

Профессионалы интерфейсного решения:

  • , Если Вы добавляете методы, существующие наблюдатели должны реализовать те методы. Это означает, что у Вас есть меньше шанса упущения обеспечить электричеством существующих наблюдателей к новой функциональности. Можно, конечно, реализовать их как пустые методы, что означает, что у Вас есть роскошь тихого выполнения ничего в ответ на определенные "события". Но Вы так легко не забудете.
  • при использовании явной реализации Вы также получите ошибки компилятора другой путь, если Вы удалите или измените существующие интерфейсы, затем наблюдатели, реализующие их, прекратят компилировать.

Недостатки:

  • Более мысль должна войти в планирование, так как изменение в интерфейсе наблюдателя могло бы осуществить изменения на всем протяжении Вашего решения, которое могло бы потребовать другого планирования. Так как простое событие является дополнительным, минимальный другой код должен измениться, если тот другой код не должен реагировать на событие.
5
задан Community 23 May 2017 в 10:31
поделиться

1 ответ

Похоже, вы столкнулись с ошибкой в ​​IE, когда он взаимодействует с UAC. Если включен защищенный режим, вы не можете запускать IE как обычный пользователь на любом рабочем столе, кроме стандартного. Чтобы запустить IE на альтернативном рабочем столе, вы должны работать от имени администратора или отключить защищенный режим. Это верно для Vista, W2K8 и Win7.

Что касается других программ, которые вы не можете запустить, к сожалению, я ничего не могу подтвердить. Я пробовал более тридцати различных программ, включая блокнот, calc, все офисные приложения, Visual Studio 2005, 2008 и 2010, справку MSDN и ряд других, и все они работали, как ожидалось, за исключением IE. Есть ли что-то действительно необычное в вашем приложении, из-за которого оно может вести себя неожиданным образом?

Одно замечание - если вы попытаетесь запустить подобное приложение, которое требует повышения прав (например, regedit и т. Д.), Оно завершится ошибкой в ​​CreateProcess с последняя ошибка установлена ​​на ERROR_ELEVATION_REQUIRED.

Для справки, на случай, если я делаю что-то отличное от вас, я использовал следующий код:

#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600     // Change this to the appropriate value to target other versions of Windows.
#endif

#include <stdio.h>
#include <tchar.h>

#include "windows.h"

HANDLE PerformOpenApp(TCHAR* appPath);

int _tmain(int argc, _TCHAR* argv[])
{
    HDESK dNew;
    BOOL closedesk;
    HANDLE hApp;

    //Make a new desktop
    dNew = CreateDesktop(_T("kaka"), 0, 0, 0, DESKTOP_SWITCHDESKTOP|
                                              DESKTOP_WRITEOBJECTS|
                                              DESKTOP_READOBJECTS|
                                              DESKTOP_ENUMERATE|
                                              DESKTOP_CREATEWINDOW|
                                              DESKTOP_CREATEMENU, NULL);

    if(!dNew)
    {
        _tprintf(_T("Failed to create new desktop !!\n\n"));
        return 0;
    }

    TCHAR path[MAX_PATH];
    _putts(_T("Enter the path of a program to run in the new desktop:\n"));
    _getts(path);

    while(_tcslen(path) > 0)
    {
        hApp = PerformOpenApp(path);
        if(hApp == 0)
        {
            _tprintf(_T("Failed to open app, err = %d\n"), GetLastError());
        }
        else
        {
            _tprintf(_T("App pid = %d\n"), GetProcessId(hApp));
            _putts(_T("Press any key to close the app.\n"));
            _gettchar();
            TerminateProcess(hApp, 0);
            CloseHandle(hApp);
         }
         _putts(_T("Enter the path of a program to run in the new desktop:\n"));
         _getts(path);
    }

    closedesk = CloseDesktop(dNew);

    if(!closedesk)
    {
        _tprintf(_T("Failed to close new desktop !!\n\n"));
        return 0;
    }
    return 0;
}

HANDLE PerformOpenApp(TCHAR* appPath)
{
    STARTUPINFO si = {0};
    PROCESS_INFORMATION pi;

    si.cb = sizeof(si);
    si.lpDesktop = _T("kaka");

    BOOL retVal = CreateProcess(NULL, appPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL,
        NULL, &si, &pi);

    if (retVal)
    {
        CloseHandle(pi.hThread);
    }
    return pi.hProcess;
}
4
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

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