ShellExecute與雙擊結果不同

        在進程A中用ShellExecute方法啓動另一個進程B時,發現啓動B的運行結果與雙擊B的運行結果不同。仔細查了一下,發現是因爲把工作目錄參數lpDirectory給設置成NULL了。這個參數設置成NULL之後,新啓動的進程B的工作目錄就會使用A的工作目錄,所以會出現和雙擊運行結果不同的問題。把這個參數設置爲進程B的工作目錄後,結果就和雙擊一樣了。

        後面測試了一下CreateProcess,也是需要這樣設置的。

	//1、使用方法ShellExecute啓動進程
	//exePath爲可執行程序路徑。folderPath爲可執行程序所在的工作目錄。
	HINSTANCE ret = ShellExecute(NULL, "open", exePath, NULL, folderPath, SW_SHOWNORMAL);
	if (32>=(int)ret)
		return 0;

	//2、使用方法CreateProcess啓動進程
	//進程創建信息,由系統創建完進程後寫入(必備參數)
	PROCESS_INFORMATION procInfo;

	//進程初始化信息(必備參數)
	STARTUPINFO startInfo;
	ZeroMemory( &startInfo, sizeof(startInfo) );
	startInfo.cb = sizeof(startInfo);
	startInfo.dwFlags = STARTF_USESHOWWINDOW;
	startInfo.wShowWindow = SW_SHOW;

	//可選參數,進程安全屬性
	SECURITY_ATTRIBUTES processAtt, threadAtt;
	processAtt.nLength = sizeof(processAtt);
	processAtt.lpSecurityDescriptor = NULL;
	processAtt.bInheritHandle = true;

	threadAtt.nLength = sizeof(threadAtt);
	threadAtt.lpSecurityDescriptor = NULL;
	threadAtt.bInheritHandle = true;

	//創建進程
	//exePath爲可執行程序路徑。folderPath爲可執行程序所在的工作目錄。
	return ::CreateProcess( NULL , (LPSTR)exePath, &processAtt, &threadAtt, FALSE,
		CREATE_NEW_CONSOLE, NULL, folderPath, &startInfo ,&procInfo );



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章