нарушение прав доступа при переключении рабочих столов

Я очень плохо знаком с c ++ и пытаюсь создать приложение, которое будет переключать рабочие столы. До сих пор я был в состоянии успешно переключать рабочие столы и пытаться запустить приложение на этом рабочем столе. К сожалению, я продолжаю сталкиваться с нарушением прав доступа при запуске приложения на недавно созданном рабочем столе. Мой вопрос: что может быть причиной нарушения прав доступа? Из того, что я прочитал, это проблема, когда программа пытается получить доступ к памяти, чего не должно быть. Ошибка:

«Не удалось правильно запустить приложение (0xC0000005). Нажмите кнопку« ОК », чтобы закрыть приложение»

Кроме того, кто-нибудь может сделать предложение, как я мог бы улучшить этот код? Это помогло бы мне немного поучиться у опытных программистов. Заранее спасибо!

РЕДАКТИРОВАТЬ: я использую Windows 7 x64 с использованием Visual Studio Express 2010

Вот код:

#include <Windows.h>

//Globals
HDESK hLastDesktop;

struct tDesktop {
HDESK Desktop1;
HDESK Desktop2;
HDESK Desktop3;
HDESK Desktop4;
};

HDESK FindCurrentDesktop()
{
return GetThreadDesktop(GetCurrentThreadId());
}

int ChangeDesktop(HDESK hDesktopName)
{
//Save the handle to this desktop
hLastDesktop = FindCurrentDesktop();
//Set the main thread to this desktop
SetThreadDesktop(hDesktopName);
//Switch
SwitchDesktop(hDesktopName);

return 0;
}

PROCESS_INFORMATION CreateProcessDesktop(LPWSTR lpProcessPath, LPWSTR lpDesktop)
{
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
startupInfo.cb = sizeof(startupInfo);
startupInfo.lpDesktop = lpDesktop;

CreateProcess(lpProcessPath,
0,
0,
0,
FALSE,
0,
0,
0,
&startupInfo,
&processInfo
);

return processInfo;
}

int _tmain(int argc, _TCHAR* argv[])
{
//Create an instance to use the struct
tDesktop myDesktop;

//Assign data for home desktop
myDesktop.Desktop1 = FindCurrentDesktop();
printf("Home desktop: %d\n", myDesktop.Desktop1);

myDesktop.Desktop2 = CreateDesktop(L"Desktop2", NULL, NULL, 0, GENERIC_ALL, NULL);
printf("Desktop 2 opened: %d\n", myDesktop.Desktop2);

printf("Changing to desktop 2: %d\n", myDesktop.Desktop2);
ChangeDesktop(myDesktop.Desktop2);

//Set up process to start in Desktop2 (for PID, etc later)
PROCESS_INFORMATION pi;
pi = CreateProcessDesktop(L"C:\\Windows\\explorer.exe", L"Desktop2");
Sleep(5000);

TerminateProcess(pi.hProcess, 0);

ChangeDesktop(hLastDesktop);

return 0;
}

0

Решение

Итак, вот ответ:

Я упомянул в комментарии, что я назвал CreateProcess с bInheritHandles как FALSE, и это была проблема, которая была неправильной. Это было связано с SetThreadDesktop. CreateProcess был успешным, он просто не заполнялся на правильном рабочем столе.

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

int ChangeDesktop(HDESK hDesktopName)
{

hLastDesktop = FindCurrentDesktop();
SwitchDesktop(hDesktopName);
SetThreadDesktop(FindCurrentDesktop());

return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector