【问题标题】:CreateProcess cannot start Adobe Reader in Windows 7CreateProcess 无法在 Windows 7 中启动 Adob​​e Reader
【发布时间】: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。如何获得更多错误信息?谢谢!

标签: c# windows-7 createprocess adobe-reader


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-16
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多