0

我对 c++ 非常陌生,并且正在尝试创建一个可以切换桌面的应用程序。到目前为止,我已经能够成功切换桌面并尝试在该桌面上启动应用程序。不幸的是,当应用程序在我新创建的桌面上启动时,我一直遇到访问冲突。我的问题是:什么可能导致这种访问冲突?根据我的阅读,这是程序试图访问它不应该访问的内存的问题。错误是:

“应用程序无法正确启动(0xC0000005)。单击确定关闭应用程序”

另外,任何人都可以就我如何改进此代码提出建议吗?这将帮助我从有经验的程序员那里学到一些东西。先感谢您!

编辑:我正在使用 Visual Studio Express 2010 运行 Windows 7 x64

这是代码:

#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;
}
4

1 回答 1

0

所以这里是答案:

我在评论中提到,我用 bInheritHandles 作为 FALSE 调用了 CreateProcess,这就是问题所在,这是不正确的。它与 SetThreadDesktop 有关。CreateProcess 成功了,只是没有在正确的桌面上填充。

我不得不更好地看一下 SetThreadDesktop 函数。它没有失败,但我称它的方式不正确。您应该总是在切换桌面后调用它,然后获取当前桌面句柄作为参数传递。这是更正的代码部分:

int ChangeDesktop(HDESK hDesktopName)
{

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

    return 0;
}
于 2013-06-10T21:18:10.650 回答