0

私は c++ が初めてで、デスクトップを切り替えるアプリケーションを作成しようとしています。これまでのところ、デスクトップを正常に切り替えて、そのデスクトップでアプリケーションを起動しようとすることができました。残念ながら、新しく作成したデスクトップでアプリケーションを起動すると、アクセス違反が発生し続けます。私の質問は、このアクセス違反の原因は何ですか? 私が読んだことから、プログラムがアクセスすべきではないメモリにアクセスしようとしている問題です。エラーは次のとおりです。

「アプリケーションを正しく起動できませんでした (0xC0000005)。[OK] をクリックしてアプリケーションを閉じます」

また、このコードを改善する方法について誰か提案してもらえますか? 経験豊富なプログラマーから少し学ぶのに役立ちます。前もって感謝します!

編集: 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 に答える