2011-06-20 30 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