2009-07-11 56 views
2

我需要重新啓動下載更新之後正在運行的程序,除了正在運行某些問題。重新啓動exe時遇到的問題

如果我使用CreateProcess什麼也沒有發生,如果我使用ShellExecute,我得到一個0xC0150002錯誤,如果我使用命令「runas」ShellExecute它工作正常。我可以使用CreateProcess和ShellExecute再次啓動命令提示符,而不是再次使用相同的exe文件,並且不想使用runas,因爲這會提升exe文件。

任何想法?

Windows 7中,視覺工作室2008 C++

alt text http://lodle.net/shell_error.jpg

的CreateProcess:

char exePath[255]; 
GetModuleFileName(NULL, exePath, 255); 

size_t exePathLen = strlen(exePath); 
for (size_t x=exePathLen; x>0; x--) 
{ 
    if (exePath[x] == '\\') 
     break; 
    else 
     exePath[x] = '\0'; 
} 


char name[255]; 
GetModuleFileName(NULL, name, 255); 

PROCESS_INFORMATION ProcInfo = {0}; 
STARTUPINFO StartupInfo = {0}; 

BOOL res = CreateProcess(name, "-wait", NULL, NULL, false, 0, NULL, exePath, &StartupInfo, &ProcInfo); 

的ShellExecute:

char exePath[255]; 
GetModuleFileName(NULL, exePath, 255); 

size_t exePathLen = strlen(exePath); 
for (size_t x=exePathLen; x>0; x--) 
{ 
    if (exePath[x] == '\\') 
     break; 
    else 
     exePath[x] = '\0'; 
} 

char name[255]; 
GetModuleFileName(NULL, name, 255); 

INT_PTR r = (INT_PTR)ShellExecute(NULL, "runas", name, "-wait", exePath, SW_SHOW); 

回答

0

好吧,最後全力以赴。

我第一次運行exe文件時,它使用默認路徑,並從默認路徑加載vld(泄漏檢測器dll)。然而,在exe中,我修改了dll路徑爲bin文件夾([app] \ bin),當我使用CreateProcess重新啓動exe時,它拾取了不同的vld dll(這是我的錯誤)它只是在觀察事件查看器後才發現的。

感謝您的幫助。

1

看起來像一個清單或註冊表問題從誤差編碼判斷。如果你不能得到更多的詳細信息,實際的錯誤消息字符串,你可以嘗試:

  • 每一個可能的清單文件(Microsoft.VC80.CRT.manifest等)移動到你的exe文件的目錄,確保無障礙
  • 乾淨徹底地卸載/刪除舊版本的DLL,你可能會有安裝程序的更新版本(我建議:卸載每一個版本,清理註冊表,使用諸如諾頓之類的清掃工具,從頭重新安裝新的東西)
+0

問題是exe自行運行正常,只有在嘗試重新啓動時纔會出現此問題。 – Lodle 2009-07-11 04:55:33

+0

如果它*是一個明顯的問題,您可以使用事件查看器來追蹤它。 然後,如果這沒有幫助,請從命令行運行sxstrace,如果您需要更多信息。 (運行一次,沒有參數可以看到它的用法) 但是這對我來說不是一個明顯的問題。 – 2009-07-11 06:38:21

1

如果使用system()運行進程會發生什麼?它給你更少的控制,但是你會從你運行的同一環境中運行它。另外,嘗試使用ProcMon監視第二個進程的啓動,它可能會給你提示你需要關於失敗的來源。

2

CreateProcess()是一種奧術獸。我記得自己第一次遇到挫折。你應該看看Microsoft CreateProcess ExampleCreateProcess Page。 (這些鏈接的生命週期可能很短,谷歌Googling CreateProcess也應該如此)。

我可以在代碼中看到3個問題。

STARTUPINFO必須具有「CB」設置到結構尺寸:

STARTUPINFO StartupInfo = {0}; 
StartupInfo.cb = sizeof(StartupInfo); 

第二個參數既需要命令和參數以形成命令行。你的程序會看到「等待」爲argv [0],忽略它或不理會。

char command[512]; 
sprintf(command, "%s -wait", name); 
BOOL res = CreateProcess(name, command, // and as you had before 

如果CreateProcess()失敗(通過返回零),您不會看GetLastError()。它可能對你有所幫助,但我懷疑它只會說「無效論點」或其他。嘿,他們只有10個需要檢查,不要懶惰:-)

我犯的另一個錯誤是在完成時沒有關閉process_information中的hProcess和/或hThread句柄。我做了hProcess,但沒有hThread。