CreateProcess和installshield的卸载字符串

时间:2011-06-08 01:01:54

标签: c#

我正在调用pInvoke调用内核的CreateProcess()并将其传递给我想要卸载的某些应用程序的UninstallString。当您尝试卸载应用程序时,此UninstallString与添加/删除程序执行的操作相同。对CreateProcess()的这种调用似乎适用于所有MSI UninstallStrings,例如:

MsiExec.exe / I {88BAE373-00F4-3E33-828F-96E89E5E0CB9}

但不会为InstallShield UninstallStrings启动任何内容,例如: 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;
    }

2 个答案:

答案 0 :(得分:0)

这可能不是您的问题,但创建过程需要将启动信息结构清零,即ZeroMemory。此外,cb参数需要设置为结构的大小。

答案 1 :(得分:0)

我的问题是我通过c#命令行args传递了卸载字符串。但是当卸载字符串包含引号(如setup.exe“c \ program files ...”)时,编译器会删除这些引号。所以为了解决我的问题,我在用三元组传递之前替换​​它们。 str.Replace(“\”“,”\“\”\“”)并且它可以解决问题。

谢谢, KJ