CreateProcess 无法在 Windows 7 中启动 Adobe Reader
Posted
技术标签:
【中文标题】CreateProcess 无法在 Windows 7 中启动 Adobe 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 中启动 Adobe Reader的主要内容,如果未能解决你的问题,请参考以下文章
C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)
无法识别 C++ CreateProcess 'telnet'
无法启动应用程序(CreateProcess 错误=87),不能使用缩短类路径解决方法
adb 无法连接 CreateProcess failure, error 2 * could not start server *