CreateProcess 无法在 Windows 7 中启动 Adob​​e Reader

Posted

技术标签:

【中文标题】CreateProcess 无法在 Windows 7 中启动 Adob​​e Reader【英文标题】:CreateProcess cannot start Adobe Reader in Windows 7 【发布时间】:2014-01-08 09:11:09 【问题描述】:

我有一个 c# 程序,它可以打开 adobe 阅读器并为用户打印 pdf。在winxp下可以正常使用,win7下不行。

经过排查,发现问题出在CreateProcess函数上。 win7下CreateProcess无法启动adobe reader。

如果有人知道如何解决,请帮忙。

public bool startup(string acrobatLoc)

    bool result = false;
    if (!isAcrobatExsists(acrobatLoc))
    
        sInfo = new STARTUPINFO();
        pInfo = new PROCESS_INFORMATION();
        sInfo.dwX = -1;
        sInfo.dwY = -1;
        sInfo.wShowWindow = 0;
        sInfo.dwXSize = -1;
        sInfo.dwYSize = -1;

        result = CreateProcess(null, new StringBuilder(acrobatLoc), null, null, false, 0, null, null, ref sInfo, ref pInfo);
        acrobatPHandle = pInfo.dwProcessId;
        IntPtr parentHandle = IntPtr.Zero;
        if (result)
        
            while ((parentHandle = getWindowHandlerByClass("AcrobatSDIWindow")) == IntPtr.Zero)
            
                System.Threading.Thread.Sleep(1 * 500);
            
            acrobatMainWHandle = parentHandle;
            System.Threading.Thread.Sleep(3 * 1000);
        
    

    return result;

【问题讨论】:

你说的不工作是什么意思?有任何异常或错误消息吗? acrobatLoc 的值是多少?您的 Windows 7 机器是否运行 64 位架构?调试器告诉你isAcrobatExsists(acrobatLoc)返回什么值? 我检查路径是否正确。我正在使用 adobe reader 8。路径是 c:\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe。我之前用的是reader 11,我尝试卸载reader,重新安装reader 8,和客户端机器一样。 我用的是win7 64位版本 CreateProcess 在 win7 中总是返回 false。如何获得更多错误信息?谢谢! 【参考方案1】:

您不需要执行 P/Invoke 来执行 Acrobat,因为 .Net 有它自己的包装器 Process

所以你可以这样做:

Process viewer = new Process();
viewer.StartInfo.FileName = "path to acrobat"; // Don't forget to substitute path to acrobat
viewer.StartInfo.Arguments = "command line arguments"; // Don't forget to substitute command line arguments
viewer.StartInfo.UseShellExecute = false;
viewer.Start();

更好的是,您可以使用 shell 执行打开 PDF 阅读器,例如:

Process viewer = new Process();
viewer.StartInfo.FileName = "path to PDF document"; // Don't forget to substitute path to PDF document
viewer.StartInfo.UseShellExecute = true;
viewer.Start();

【讨论】:

感谢您的帮助,我现在可以开始这个过程了。但是,我怎样才能获得进程ID。在我使用 pInfo.dwProcessId 之前;【参考方案2】:

你需要将sInfo.cb设置为结构体的大小:

sInfo.cb = Marshal.SizeOf(typeof(STARTUPINFO));

当然,这取决于是否正确定义了结构(我们看不到)。

我会推荐 Rowland Shaw's answer 使用内置的 .NET 包装器 Process class。

【讨论】:

【参考方案3】:

确保 acrobat 路径正确。它可以包含 x86 作为示例, C:\Program Files (x86)\Adobe\Reader 9.0

【讨论】:

以上是关于CreateProcess 无法在 Windows 7 中启动 Adob​​e Reader的主要内容,如果未能解决你的问题,请参考以下文章

C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

(C) Windows 句柄和 Createprocess

无法识别 C++ CreateProcess 'telnet'

无法启动应用程序(CreateProcess 错误=87),不能使用缩短类路径解决方法

adb 无法连接 CreateProcess failure, error 2 * could not start server *

CreateProcess 执行 Windows 命令