问题标签 [pythoncom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2158 浏览

python - 带有 pyw 文件的 Windows 启动不会关闭 cmd

我一直在研究一个应该在我的计算机后台运行的小脚本。我已经让脚本工作了,除了一件事,数小时的谷歌搜索和狩猎还没有找到答案。

该文件具有 .pyw 扩展名,当我从命令提示符运行它时:

cmd 窗口将继续打开并给我另一个提示,而不会像使用常规 .py 文件那样启动空闲。

当我双击该文件时,cmd 窗口会毫无问题地打开和关闭,就像它应该做的那样。这对我来说都是完美的。

但是,我尝试制作一个小批处理文件:

我把它卡在Windows的启动文件夹中。但是,当我重新启动计算机以查看它是否可以工作时,它打开了 cmd 窗口,但不会关闭它。我不知道为什么。我已经尝试了所有我能想到的方法,包括将 File.pyw 直接粘贴在启动文件夹中,并尝试将退出命令直接放入批处理文件中,如下所示:

但是,正如您可能猜到的那样,这失败了。我尝试将命令直接放在我的代码中,所以在结束之前,它有一行

但在意识到这行不通后,我就把它拿出来了。(重要细节:代码的最后一行设置为循环它直到程序关闭。这就是我尝试使用 pyw 扩展名的原因,因此控制台可以在文件结束之前关闭)

接下来,我将批处理文件缩短为只有一行:

但它仍然无法正常工作。运行批处理文件时,我会打开一个输入命令的 cmd 窗口,但它像常规 .py 文件一样运行,而不是关闭 cmd 窗口。

谁能帮我弄清楚为什么从 .batch 文件运行命令时控制台不会关闭,但直接从命令提示符运行时会关闭?

更新

当我快速按两次“+”时,该脚本旨在添加一个快速键盘快捷键来关闭任务,特别是 Google Chrome。这是我的完整代码(减去一些个人信息)

当我从 pycharm 或 cmd 运行它时,这一切都可以完美运行,但是当我将它放在 C:\Users(my name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 然后尝试它时出来,什么都没有发生。我猜这是因为 Windows 会在任何事情发生之前运行该文件并退出它,但我真的不确定。我真的需要一个解决方案,让它在启动时运行并接受我的关键输入,直到我关闭。

0 投票
0 回答
621 浏览

python - 使用线程计时器时 OpenOPC 的 Python COM 问题

尝试在单独的线程中读取 OPC 标签时遇到问题。目前使用 windows 并使用 DCOM 模式连接到 Matrikon OPC Simuator。下面的代码工作正常

但是,当我尝试使用 threading.Timer 在循环中读取标签时

我收到以下错误

OPCError: AddGroup: CoInitialize 尚未被调用。

我感觉这与在不同线程之间共享 COM 对象有关(将 win32com 与多线程一起使用)但无法使其正常工作。任何帮助将不胜感激,谢谢

0 投票
1 回答
1839 浏览

python - 使用 py2exe 包装时 Python Com Server 无法创建实例 - 错误对象没有属性

我用这个碰了壁。我需要创建一个基于 python 的 com 服务器,将其打包为 windows exe 并将其部署在 windows 上。它必须有一个“完整”的接口——因为消费者需要 idispatch 和一个特定的接口才能运行。现在我已经创建了 com 服务器并让它在解释器下运行,它可以完美地与我挑剔的客户端一起运行。但是,当打包为 EXE(它是本地服务器)时,当系统尝试实例化它时(甚至从 vbs 脚本),我在日志中收到错误消息。所以这里的一切。我在 itnernet 中搜索了高低,它看起来像一个导入问题,但我不知道如何导入我自己的 python 对象供本地服务器使用。

这是安装了 pywin32 扩展的 python 2.7。

所以首先 - 我为服务器创建的 IDL:

imtg.idl

接下来是 Python 代码——现在这有点棘手,因为当我分发它时,我不想创建 .tlb——所以我不分发 .idy——只要确保你有 .tbl 来注册。如有必要,使用 as admin cmd 提示符。

imtg_server.py

接下来是py2exe的设置

我不得不添加 modulefinder 的时髦导入,因为 win32com.shell 未包含在打包的可执行文件中

setup_imtg.py

当您运行生成的 EXE 时,您可以注册

imtg_server --注册

但你不会看到关于输出

--unregister 取消注册

您可以使用此 vbs 文件对其进行测试。

t.vbs

当您运行时,将创建一个如下所示的 .log:

所以我需要解决这个错误。这个类当然是我的对象。我担心我在服务器中指定的值是:

是不正确的。main可能指的是包装好的 exe,而不是我自己的没有指定 main 的服务器。我确实尝试创建 main 以及没有更好的结果。我只是不知道 py2exe 如何代理这些类。我尝试使用我的文件名 imtg_server.CImtg,但由于找不到模块而失败。我只尝试了 CImtg,但失败了。我尝试使用 win32com 和 pythoncom 的变体 - 但它就是不这样做。我所拥有的似乎“正确”,所以也许我需要一个额外的reg标签或其他东西?任何帮助是极大的赞赏。谢谢你。

0 投票
0 回答
154 浏览

python - C++ COM 客户端调用 Python COM 服务器

我在 Python 2.7(使用 pythoncom)中创建了一个 COM 服务器,并想从 C++ 代码中调用它,但我不知道如何。

Python COM 服务器:

import pythoncom class PyCOMTest: _public_methods_ = ['getNextNum'] _reg_progid_ = "<some progid>" _reg_clsid_ = "{<some hash string>}" _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER numbb = 0 def __init__(self): self.num = 0 def getNextNum(self): print "method called" PyCOMTest.numbb = PyCOMTest.numbb + 1 return PyCOMTest.numbb if __name__ == '__main__': print "Registering COM server..." import win32com.server.register win32com.server.register.UseCommandLine(PyCOMTest)

我可以使用用 Python 编写的客户端和另一个用 VBScript 编写的客户端来调用 COM 服务器。

我知道 C++ 需要一个扩展 IUnknown 的接口来调用 CoCreateInstance 和 QueryInterface,但我希望 COM 服务器完全使用 Python。

有任何想法吗?

0 投票
1 回答
1315 浏览

python - 为什么 pythoncom.pumpmessages() 停止工作?

所以我正在编写一个记录击键的程序,它工作得很好,直到我点击远离程序框。当我像 cortana 一样点击浏览器并开始输入时,它记录了几下然后完全停止。它也没有抛出任何错误,所以我不知道如何调试它。

我不确定问题可能是什么,因为它不会引发错误。

0 投票
0 回答
3460 浏览

python - win32com.client.Dispatch 有效,win32com.client.GetActiveObject 无效

我使用python 2.7.9,Windows 7 ...

总体目标:让另一个应用程序访问我们的自定义 com 服务器(此时已在运行)并向其发送要显示的消息。显然,需要有一个服务器,多个客户端。

我试图使用一些自定义代码作为 com 服务器。该类被创建为:

并使用以下方式注册:

我可以在 regedit 中看到它,据我所知,它看起来还可以。GUID 是正确的,名称是正确的。

现在当我去使用它时,它工作得很好:

但是当我想从另一个exe(甚至另一个用于调试的python窗口)附加到正在运行的实例时,使用:

它只是给了我:

告诉我它没有注册?

我尝试使用 GUID,我尝试使用带有 ID 和 GUID 的 pythoncom.GetObject ......没有运气。

我试过 comtypes 包并得到同样的东西。

关于我做错了什么的任何想法?为什么 Dispatch 按名称找到它,而 GetActiveObject 却生气了?

似乎 Dispatch 按名称工作会表明注册有效?

我还能在注册表中验证什么?

谢谢!!!

2016 年 6 月 6 日更新

如果您还没有意识到,我对此知之甚少。但我已经读过,为了使 win32com.client.GetActiveObject() 工作,服务器需要位于“运行对象表”中......而它不是。

所以,我发现了一些我用来注册类的示例代码:

这确实允许服务器显示在运行对象表中,我可以得到这个:

没有错误地返回。

所以现在,我可以在 python、pythonWin 中很好地使用 Dispatch 或 GetActiveObject,甚至可以在 Excel/VB <-> python 中与服务器交互,它似乎共享命名空间。

但是......我仍然无法让这个基于 IE 的第三方应用程序使用现有的服务器......即使使用 GetActiveObject。总是想创建新实例并使用它自己的命名空间......不好

IE 或 Chrome 是否存在会阻止使用现有服务器的东西?同样,它在 Excel/VB 中运行良好。该应用程序应该执行“python myscript.py”(在空闲、pythonwin 和 cmdline 中工作正常),但在从 IE/Chrome 应用程序调用时不执行 com 服务器的东西(尽管文件写入等其他 python 函数工作正常) .

此外,鉴于我对此知之甚少,无论如何,建议一种更好的方法:在 python 中作为单例启动服务器,然后从另一个应用程序访问它。

谢谢!!

0 投票
1 回答
653 浏览

python - Tkinter 用 pyHook 撤回古怪

我有一个 Tkinter GUI 应用程序,我需要在按钮按下时隐藏它。我不能假设应用程序会有焦点,所以我实现了 pyHook,键盘记录器样式。但是,每当我从 pyHook 启动的函数中调用withdraw() 时,窗口就会挂起,我必须强制关闭它。

为了测试,我在 GUI 内部添加了一个按钮来调用完全相同的函数,它工作得很好。这是怎么回事?'hiding' 打印了两次,所以我知道它真的挂在withdraw() 调用本身上。

下面是一个最小的完整可验证示例来说明我的意思:

0 投票
1 回答
668 浏览

python - 带有pyHook的Tkinter文本条目挂起GUI窗口

我有一个 Tkinter GUI 应用程序,我需要在其中输入文本。我不能假设该应用程序会有焦点,所以我实现了 pyHook,键盘记录器样式。

当 GUI 窗口没有焦点时,文本输入工作正常并且 StringVar 正确更新。当 GUI 窗口确实具有焦点并且我尝试输入文本时,整个事情都会崩溃。

即,如果我在启动程序后单击控制台窗口或其他任何内容,则文本输入有效。如果我尝试立即输入文本(GUI 以焦点开始),或者我在任何时候重新聚焦窗口并输入文本,它就会崩溃。

这是怎么回事?

下面是一个最小的完整可验证示例来说明我的意思:

0 投票
0 回答
612 浏览

python - PYTHON - 无法导入 pythoncom

我是python(3.5版本)的新手,我将mudule pywin32安装到我的电脑上。当我尝试导入 pythoncom 时,出现此错误。

我已经重新安装了 pywin32 并且已经尝试通过 pip --upgrade 命令对其进行更新。我的操作系统是 Windows 10。在此先感谢。

0 投票
1 回答
292 浏览

python - 使用第三方 COM 从 DispatchWithEvents 返回事件

我的代码从 Events 中的 print 语句中打印出我需要的内容。但是,由于类的实例化方式,我不知道如何返回数据。此外,打印语句仅在包含 pythoncom.PumpWaitingMessages() 时才有效,但它不会返回打印的数据或任何内容。

我希望能够使用打印的内容作为返回值,以供其他函数访问。

(如果情况变得更糟,我可以捕获标准输出(这是最后的手段)。)

代码:

输出: