我们正在尝试创建一组服务,其中一些使用 powerpoint。由于我们使用 python 编写软件,服务使用 COM API 连接到 powerpoint。基本代码如下:
mutex = win32event.CreateMutex(None, False, 'mutexuniqueid')
if mutex is None:
raise Exception('Mutex could not be created: %d' % (win32api.GetLastError()))
win32event.WaitForSingleObject(mutex, win32event.INFINITE)
try:
pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
try:
powerpoint = win32com.client.DispatchEx('Powerpoint.Application')
presentation = powerpoint.Presentations.Open(r'Path\To\Cached\Presentation.ppt', False, True, False)
# Do whatever necesary with the presentation
presentation.Close()
del presentation
finally:
win32api.CloseHandle(mutex)
如果我们运行程序,它基本上是一个 rpc 服务器,从命令提示符下一切正常,但如果我们将程序安装为服务,它会在powerpoint.Presentations.Open
调用过程中失败并出现错误:
(-2147352567, 'Exception occurred.', (0, u'Microsoft PowerPoint 2010', u'PowerPoint could not open the file.', u'', 0, -2147467259), None)
我们已经跟踪问题并且所有的 COM 查询都正确执行,我们在Open
那里有函数,所以它在 powerpoint 中执行期间确实失败了。
有一个问题,我们已经在至少 10 台计算机上进行了尝试,它在每台计算机上都显示出相同的问题,除了一台(恰好是我的)。我们检查了这些机器和我自己的机器有什么区别,但到目前为止什么都没有。
更新 检查了不同的计算机后,我们假设问题与会话 0 隔离(服务在会话 0 中运行)有关。中断的进程似乎也没有登录会话,而工作的机器确实显示了一些登录会话,即使它们也在会话 0 中运行。