使用 Python ctypes 访问 Visual Foxpro COM DLL

Posted

技术标签:

【中文标题】使用 Python ctypes 访问 Visual Foxpro COM DLL【英文标题】:Using Python ctypes to access a Visual Foxpro COM DLL 【发布时间】:2012-07-23 12:35:22 【问题描述】:

我正在尝试使用 python ctypes 库来访问在 Visual Fox Pro 中创建的 COM DLL 中的各种函数(来自 .prg 文件)。

这里是fox pro中的一个例子(根据实际代码简化)

将 CLASS 测试定义为 CUSTOM OLEPUBLIC 程序初始化 开启错误 关闭控制台 设置通知关闭 设置安全关闭 关闭通话 设置通知关闭 ENDPROC FUNCTION get_input_out(输入为字符串)为字符串 输出 = 输入 返回输出 结束函数 结束定义

在 python 中,我正在做一些事情:

导入 ctypes 链接 = ctypes.WinDLL("path\to\com.dll") 打印链接.get_input_out("someinput")

dll 注册良好并已加载,但当我尝试调用该函数时,我只得到以下信息。

AttributeError:找不到函数“get_input_out”

我可以验证 dll 是否可以正常工作,因为我可以使用 COM 库通过 php 脚本访问这些函数。

我真的很想在 python 中使用它,但到目前为止我的尝试都是徒劳的,ctypes 甚至可以与 VFP 一起使用吗?任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

对于使用 OLEPUBLIC 子句的 VFP COM 对象,您应该使用 python Win32 扩展,而不是 ctypes 模块。 Python Win32 扩展提供了一套功能齐全的组件,允许 Python 成为 COM 客户端,这正是本例中您想要的。

您的代码应如下所示:

from win32com.client import Dispatch
oFox = Dispatch("com.testing")
# where the file name compiled by VFP is com.dll and the olepublic class is testing.
# in Windows this stuff is not case sensitive.
print oFox.get_input_out("something")
# to close things down..
oFox = None

如果您只想访问 VFP 表,Microsoft 提供了一个免费的 ADO 兼容组件 vfpoledb,可用于通过 ADODB 访问表,而后者又可以通过 Win32 中的 Dispatch() 功能进行访问扩展。

【讨论】:

【参考方案2】:

尝试从对函数的调用中删除括号。将print link.get_input_out("someinput") 更改为print link.get_input_out "someinput"

【讨论】:

嗨,我试了一下,但不幸的是 python 认为这个 SyntaxError: invalid syntax。我不认为我最初的错误与函数变量有关,而是首先找到要调用的函数。感谢您提供!

以上是关于使用 Python ctypes 访问 Visual Foxpro COM DLL的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:python:未定义符号:使用 ctypes 从 Python 访问 C++ 函数时

python 和 ctypes 访问具有嵌套结构的 c++ 类

WindowsError 异常访问冲突 - 在简单的 python c++ ctypes 接口中

蟒蛇 |使用 ctypes 访问 dll

『Python CoolBook』使用ctypes访问C代码_下

Python Ctypes OSError:异常:访问冲突读取0x00000000