2011-06-20 31 views
2

我有一个程序,试图在Windows 7中重新启动资源管理器;它首先结束该过程,然后再次启动它。为什么不CreateProcess()工作?

简单吗?

所以它看起来 - 它确实似乎工作。不过,我注意到一些有趣的事情:当我尝试启动一个程序(比如说XP的Power Calculator powertoy)兼容模式时,它不再有效!没有任何反应 - 该过程已创建并立即退出。

如果我通过任务管理器的运行对话框运行资源管理器,程序运行良好。

发生了什么事?

#include <windows.h> 
int main() 
{ 
    PROCESS_INFORMATION pi; 
    STARTUPINFO si = {sizeof(si)}; 
    TCHAR path[] = TEXT("explorer"); 
    DWORD f = 0; //I tried a variety of these flags; didn't work 
    return CreateProcess(NULL, path, NULL, NULL, FALSE, f, NULL, NULL, &si, &pi); 
} 

编辑1:

  • ,这是32位与WOW64重定向禁用并没有区别的事实。我做了64位,问题是一样的。
  • 我试过ShellExecute但它也没有工作。

编辑2:

完全相同的代码只是为我工作了几次,然后再停止工作......吧?

+0

你为什么要这样做? explorer.exe的设计不是以这种方式使用。 – 2011-06-29 03:41:44

回答

0

这不是真的是“为什么”的答案,但我设法找出如何自己修复它:

而不是从当前进程复制环境变量,如果我复制它们与CreateEnvironmentBlock,然后它的工作。

我还没有想出是什么原因导致它,虽然...

-1

与开发 - C++编译(和excuted)在Windows XP SP2

试一下:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

int main(int argc, char *argv[]) 
{ 
    PROCESS_INFORMATION pi; 
    STARTUPINFO si = {sizeof(si)}; 

    if (CreateProcess(0, "C:\\Windows\\explorer.exe", 0, 0, 0, DETACHED_PROCESS, 0, 0, &si, &pi)) 
     printf("Process Running...\nPID=%d\n\n", pi.dwProcessId); 
    getchar(); 
    return 0; 
} 

可以使用的ShellExecute太像这样:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

int main(int argc, char *argv[]) 
{ 
    if ((int)ShellExecute(NULL, "open", "C:\\Windows\\explorer.exe", NULL, NULL, SW_SHOWNORMAL) > 32) 
     printf("OK !\n"); 
    getchar(); 
    return 0; 
} 
+0

那么这是行不通的,因为'CreateProcess'的第二个参数是'LPTSTR'而不是'LPCTSTR'。但是,当我解决这个问题时,他们仍然不起作用。 – Mehrdad

+0

我在Windows XP上用Dev-C++编译并执行了2个代码(但没有尝试VS),并且在我的PC上正常工作!也许试着施放! – AnyProblemHaveSolution

+0

是64位XP吗?我想我应该提到这也是在Windows 7上,对不起。 – Mehrdad