Я очень плохо знаком с 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;
}
Итак, вот ответ:
Я упомянул в комментарии, что я назвал CreateProcess с bInheritHandles как FALSE, и это была проблема, которая была неправильной. Это было связано с SetThreadDesktop. CreateProcess был успешным, он просто не заполнялся на правильном рабочем столе.
Мне пришлось взглянуть на функцию SetThreadDesktop немного лучше. Это не было неудачей, но способ, которым я звонил, был неправильным. Вы должны всегда вызывать его после переключения рабочих столов, а затем указывать дескриптор текущего рабочего стола в качестве параметра. Вот исправленный раздел кода:
int ChangeDesktop(HDESK hDesktopName)
{
hLastDesktop = FindCurrentDesktop();
SwitchDesktop(hDesktopName);
SetThreadDesktop(FindCurrentDesktop());
return 0;
}
Других решений пока нет …