Python 应用与注入 DLL 之间的 IPC

5 投票
2 回答
806 浏览
提问于 2025-04-15 17:55

你好,Stack Overflow:有时候我是读者,这次是第一次发帖。

背景:

我在一台运行Windows XP SP3的电脑上,马上就要升级到Windows Seven(MSDNAA真不错)

我有一个注入的DLL,它通过钩住一个每秒调用成千上万次的函数来运行。

我想通过一个Python应用程序来与这个DLL进行通信和控制。简单来说,DLL负责执行任务,而Python应用程序负责提供思路和决策。

我的计划是,在DLL里设置一个计数器和一个条件语句。每次被钩住的函数被调用时,计数器加一,然后跳回原来的函数,直到像这样:如果(计数器 == 250){ // 做一些事情(); }。我这样做的想法是让目标应用程序大部分时间能够顺利运行,同时让我能够做一些有趣的事情。

问题:

我完全不知道应该用哪种进程间通信(IPC)方法来进行交流。我们有套接字、共享内存、管道、文件映射(?)、远程过程调用(RPC),还有一些看起来很复杂的东西,比如写入剪贴板。

我从来没有实现过任何类型的IPC,除了玩具示例。

我比较确定我需要一些东西,满足以下条件:

  • 能够在Python和DLL之间进行双向通信
  • 不阻塞或等待
  • 能够检查是否有等待的数据,如果没有就继续
  • 如果涉及到锁,可以继续而不是等待
  • 读写的时间成本不高

有人能帮忙吗?谢谢你的时间,希望我提供的信息足够全面,没有违反任何公认的规范。

我还想补充一下,相关问题框非常酷,我在发帖前确实浏览过。

2 个回答

1

如果你不太在意实时性的话,可以通过文件系统来进行沟通:比如用一个日志文件来记录DLL的输出信息,还有一个配置文件,偶尔读取一下这个文件来改变DLL的行为。

2

试试使用套接字(sockets)。你的需求其实就是需要异步操作;Python有一个叫做asyncore的模块,可以用来在套接字上进行异步输入输出(IO)。不过,看起来Python的标准库(stdlib)在处理其他进程间通信(IPC)方面并不能异步操作,所以我不太建议使用那些。

撰写回答