VB6+Python混合编程(COM组件)

0.2572018.05.10 16:01:23字数 553阅读 3725

Python的方便不用说,VB6做GUI的简单程度更不用说。二者混合编程的需求一直非常旺盛,但我苦苦搜寻了很久,始终未找到合适的解决方案。

在很长一段时间内,我都是通过创建、读取、删除临时文件来在VB程序和Python程序间传递信息,麻烦,且低级。(如下)

比如下面是一个典型的处理流程

1. VB创建需要处理的文本please.txt,并调用Python

2. Python读取、处理文本,并将处理后的文本保存为ok.txt

3. VB在执行上面语句后进入死循环,等待ok.txt生成,完成后读取,继续流程

诸位请看,是不是非常符合麻烦、低级的描述?但没有更好的解决方案,只有如此。

----激动人心的分界线-----

后来发现了一本书(python programming on win32,有兴趣的找来看),终于让我发现了解决方法。COM组件!

COM is a technology from Microsoft that allows objects to communicate without the need for either object to know any details about the other, even the language it's implemented in.

看看本书某章节的总结:

We have seen examples of the various data types that can be passed back and forth between the two languages: numbers, strings, and arrays. The ability to pass multidimensional arrays allows you to move large amounts of data between the two languages without writing a lot of conversion code.

也不用说很多,不想看书的,看看下面这个我从书中摘抄的简短例子,就能知道该方法的核心之处。

在python里:

#需要先安装pipywin32模块

importpythoncomclassPythonUtilities:

_public_methods_=['SplitString']

_reg_progid_='PythonDemos.Utilities'_reg_clsid_=pythoncom.CreateGuid()def SplitString(self, val, item=None):importstringif item !=None:

item=str(item)

val=str(val)returnval.split(item)if __name__=='__main__':print ('Registering COM server...')importwin32com.server.register

win32com.server.register.UseCommandLine(PythonUtilities)

以管理员身份执行上述代码。在注册成功后,COM组件会一直保留,不受开关机影响,因此可以在任意时候进行调用。最妙的是,你可以随时更新代码的函数部分,而无需重新注册,因此通常情况下,你只需要在注册时使用管理员权限。

在VB里:

Private SubForm_Load()Set PythonUtils = CreateObject("PythonDemos.Utilities")

response= PythonUtils.SplitString("Hello from VB")For Each Item InresponseMsgBoxItemNext

End Sub

上面说COM组件会一直保留,如果需要注销,可使用管理员权限执行命令行语句(py_name是上面python文件的名称)。

> python py_name.py --unregister

多余的不用说了,一试便知,这点代码足以解决诸多混合编程的难题。

该方法不仅适用于VB+Python,Office,Delphi,C++等等,均可使用。

上面的COM方法返回的是 python 的列表类型,怎样在 delphi 中使用呢?《Python Programming on Win32》7.3 一节中提供了使用方法:

uses ComObj;varserver, ret: Variant;

i: integer;beginserver := CreateOleObject('PythonDemos.Utilities');

ret := server.SplitString('Hello from VB');for i := VarArrayLowBound(ret, 1) to VarArrayHighBound(ret, 1) do beginShowMessage(ret[i]);end;end;

类似地,如果需要向COM中传入python的LIST数据类型,可以在delphi中使用 Variant 类型(参见《Delphi中的变体Variant数组相关函数》 https://www.cnblogs.com/c2soft/articles/11660228.html )构建数组,然后传入COM中。

python和vb的代码可以通用吗-VB6+Python混合编程(COM组件)(转)相关推荐

  1. python和vb的代码可以通用吗-python和vb哪个简单

    Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言,为结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.是一种可用于 ...

  2. 在python中、下列代码的输出是什么-python面试题

    1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val)returnlist list1= extendList(10) ...

  3. 在python中、下列代码的输出是什么-python面试题详细总结(附答案)

    本篇文章给大家带来的内容是关于python面试题总结(附答案),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. CPS少儿编程网-Scratch_Python_教程_免费儿童编程学习平 ...

  4. 在python中、下列代码的输出是什么-Python 面试中 8 个必考问题

    1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list list1 = extendList( ...

  5. python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码

    我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...

  6. python画六边形的代码_跟我学python(1)——turtle

    嗨!大家好,欢迎大家跟我一起学习python,那首先我们需要先了解什么是编程?什么是python? python1-0 我们不套用百度或者其他官方的解答,就我的理解来说,编程是一门语言,就像英语可以让 ...

  7. python提取excel数据-代码详解:使用Python从不同表格中提取数据

    常用的表格数据存储文件格式--CSV,Microsoft Excel,Google Excel . Python通常称为粘合语言.这个名称归因于人们逐渐开发出的大量接口库和特征,也得益于广泛的使用和良 ...

  8. python读取txt文件代码-从文本文件中读取Python代码

    I am trying to use the contents of a text file as Python code e.g. if I write import sys in a text f ...

  9. 在python中、下列代码的输出是什么-python期末考试试题汇总

    6.for i in range(2,n): if n%i==0:break if i==n-1: print('是素数') else: print('不是素数') 7.'abcabcabc'.cou ...

最新文章

  1. python使用fpdf生成pdf章节(chapter)文件包含:页眉、页脚、章节主体、章节内容等;
  2. 网站优化之尽量避免重定向(301/302)
  3. LUOGU P2966 [USACO09DEC]牛收费路径Cow Toll Paths
  4. 生命html文档,Web前端第一季(HTML)
  5. flink-faker用法示例(还没弄完,到时候再说)
  6. P4849 寻找宝藏(模板:四维偏序)
  7. mysql自增id用完了_MySQL表自增id用完了该怎么办?
  8. python中isinstance(3、object)_python中isinstance函数判断各种类型的小细节
  9. 三星Nexus S刷回官方4.0.4教程
  10. 关于区块链的解读和简单Python实现
  11. Smart Link与Monitor Link技术
  12. nagios原装配置文件
  13. 系统设计拓展:如何设计一个自动阅卷系统(英语/数学)
  14. X509TrustManager信任SSL证书
  15. Visual Studio Code配置Salesforce Apex开发环境
  16. 华为RH2288 V3服务器新加硬盘不识别
  17. python输入如何加单位_Python中的单位转换
  18. traceroute 工作原理
  19. 江苏华西村海洋工程服务有限公司-船讯网
  20. 【互联网寒冬】经历裁员,拿20W被迫去大厂

热门文章

  1. webstom新增vue模板
  2. zookeeper学习总结
  3. mac 安装 nodeJsnpm 配置
  4. Ubuntu下ibus在firefox浏览器中选中即删除的解决办法
  5. 【HTML】框架集(Framesets)
  6. codeforces 501 C,D,E
  7. Linuxnbsp;Oracle服务启动amp;停止脚本与开机自启动
  8. [开源] .NETCore websocket 即时通讯组件---ImCore
  9. httpclient工具使用(org.apache.httpcomponents.httpclient)
  10. RookeyFrame2.0发布,UI重构