切换桌面时访问冲突
access violation when switching desktops
我是一个c++新手,正在尝试创建一个可以切换桌面的应用程序。到目前为止,我已经能够成功地切换桌面,并尝试在该桌面上启动应用程序。不幸的是,当应用程序在我新创建的桌面上启动时,我一直遇到访问冲突。我的问题是:是什么导致了访问违规?从我所读到的,这是一个问题,其中程序试图访问内存,它不应该。错误是:
"应用程序无法正确启动(0xC0000005)。点击OK关闭应用程序
还有,谁能给我一个建议,我怎么可能改进这个代码?这将帮助我从有经验的程序员那里学到一些东西。提前感谢!
编辑:我正在运行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: %dn", myDesktop.Desktop1);
myDesktop.Desktop2 = CreateDesktop(L"Desktop2", NULL, NULL, 0, GENERIC_ALL, NULL);
printf("Desktop 2 opened: %dn", myDesktop.Desktop2);
printf("Changing to desktop 2: %dn", 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;
}
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 切换桌面时访问冲突