Visio自动化:获取进程ID

时间:2012-05-18 07:06:57

标签: vbscript automation ole visio

我正在使用自动化运行Visio,但我无法获取Visio进程的进程ID以检查其完成时间。这是我的VB脚本:

Set visio = CreateObject("Visio.InvisibleApp")
Wscript.Echo visio.ProcessID    
Set document = visio.Documents.OpenEx("somefile.vsd", &H88)
document.ExportAsFixedFormat 1, "somefile.pdf", 1, 0
visio.Quit

并使用cscript // nologo运行它。


问题是visio.ProcessID返回的数字不是实际的Windows进程ID(例如,实际进程ID为8146时为6613)。在Visio进程退出之前,cscript主机似乎已完成,导致清理临时文件时出现问题。

以下是Visio参考说明:

所以问题是:如何获取Visio进程ID或检测它何时正确退出?

谢谢!

2 个答案:

答案 0 :(得分:0)

无法看到此ID如何帮助您。我怀疑你在visio中出错了。你试过

吗?
on error resume next

并在每行可能出错之后

if err.number <> 0 then
  wscript.echo err.description
  err.clear
end if

如果省略参数似乎存在问题,请全部使用它们。 有关值,请参阅http://msdn.microsoft.com/en-us/library/office/ms409271(v=office.12).aspx。 在退出使用document.saved = true之前,您可以先检查结果文件是否存在。

编辑:检查进程是否正在运行,可能是您必须调整服务名称(检查您的téaskmanager)

set service = GetObject ("winmgmts:")

for each Process in Service.InstancesOf ("Win32_Process")
  If lcase(Process.Name) = "visio.exe" then
    wscript.echo "visio still running"
    wscript.quit
  End If
next
wscript.echo "visio no longer running"

EDIT2:获取活动visio应用程序的processid(如果正在运行多个Visio实例,GetObject将返回活动实例。当程序作为加载项运行或双击形状时,活动instance是运行程序的实例。否则,它是最近运行或带到前面的实例。如果没有运行Visio实例,GetObject会导致错误) cfr http://webmail.vh.com.tw/Microsoft/Developing%20Microsoft%20Visio%20Solutions/27.htm

set appObj = GetObject(, "visio.application")
if appObj Is Nothing Then
  wscript.echo "There is no active Visio."
else
  wscript.echo "ProcessID: " & appObj.ProcessID
end if

答案 1 :(得分:0)

只是在Visio.Application.ProcessID的帮助中注意到了这一点:

“ ProcessID返回的值与当前Visio实例的Windows进程ID不同。”

所以我想这些只是为了您可以区分多个Visio实例。

还有Visio.Application.WindowHandle32和Visio.Application.WindowHandle,这可能会有所帮助,尽管对于不可见的应用程序实例可能不是那么有用。