我正在调用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;
}
答案 0 :(得分:0)
这可能不是您的问题,但创建过程需要将启动信息结构清零,即ZeroMemory。此外,cb参数需要设置为结构的大小。
答案 1 :(得分:0)
我的问题是我通过c#命令行args传递了卸载字符串。但是当卸载字符串包含引号(如setup.exe“c \ program files ...”)时,编译器会删除这些引号。所以为了解决我的问题,我在用三元组传递之前替换它们。 str.Replace(“\”“,”\“\”\“”)并且它可以解决问题。
谢谢, KJ