我打電話給pInvoke調用內核的CreateProcess()並將它傳遞給我想要卸載的某個應用程序的UninstallString。此UninstallString與您嘗試卸載應用程序時執行的「添加/刪除程序」相同。這個調用給CreateProcess(),似乎所有的MSI UninstallStrings如工作:CreateProcess和installshield的卸載字符串
MSIEXEC.EXE/I {88BAE373-00F4-3E33-828F-96E89E5E0CB9}
,但不會推出針對的InstallShield UninstallStrings這樣的事情as: RunDll32 C:\ PROGRA〜2 \ COMMON〜1 \ INSTAL〜1 \ PROFES〜1 \ RunTime \ 10 \ 50 \ Intel32 \ Ctor.dll,LaunchSetup「C:\ Program Files(x86)\ InstallShield安裝信息{ 34B37A74-125E-4406-87BA-E4BD3D097AE5} \ setup.exe「-l0x9 -removeonly
我在想什麼?如果我在它運行的命令行窗口中運行相同的UninstallString並啓動卸載程序。我嘗試了ShellExecute(),但似乎也沒有工作。我知道我可以 解析Uninstall字符串到可執行文件(Rundll32)和其餘作爲參數,並將它們作爲StartInfo傳遞給託管的Process類,但是我希望避免爲InstallShield字符串提供特殊情況,特別是因爲命令行運行良好的字符串。
任何想法?
[DllImport("kernel32.dll")]
public static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment,string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
PROCESS_INFORMATION pi = new ProcessUtils.PROCESS_INFORMATION();
STARTUPINFO si = new ProcessUtils.STARTUPINFO();
CreateProcess(null, path, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref si, out pi);
int pID = pi.dwProcessId;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STARTUPINFO
{
public Int32 cb;
public string lpReserved;
public string lpDesktop;
public string lpTitle;
public Int32 dwX;
public Int32 dwY;
public Int32 dwXSize;
public Int32 dwYSize;
public Int32 dwXCountChars;
public Int32 dwYCountChars;
public Int32 dwFillAttribute;
public Int32 dwFlags;
public Int16 wShowWindow;
public Int16 cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public int dwProcessId;
public int dwThreadId;
}
爲什麼不叫'System.Diagnostics.Process.Start'? – 2011-06-08 01:04:48
添加您的電話代碼。我向你保證,使用.net類會更容易。 – rerun 2011-06-08 01:05:50
我沒有調用System.Diagnostics.Process.Start,因爲它沒有啓動它。我將不得不解析它,並將可執行文件與將通過ProcessStartinfo傳遞的參數分開。 – user577240 2011-06-08 01:14:11