Python的方便不用說,VB6做GUI的簡單程度更不用說胸竞。二者混合編程的需求一直非常旺盛,但我苦苦搜尋了很久参萄,始終未找到合適的解決方案卫枝。
在很長一段時間內,我都是通過創(chuàng)建讹挎、讀取校赤、刪除臨時文件來在VB程序和Python程序間傳遞信息,麻煩筒溃,且低級马篮。(如下)
比如下面是一個典型的處理流程
諸位請看掷匠,是不是非常符合麻煩、低級的描述岖圈?但沒有更好的解決方案讹语,只有如此。
----激動人心的分界線-----
后來發(fā)現(xiàn)了一本書(python programming on win32幅狮,有興趣的找來看)募强,終于讓我發(fā)現(xiàn)了解決方法。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.
看看本書某章節(jié)的總結:
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模塊
import pythoncom
class PythonUtilities:
_public_methods_=['SplitString']
_reg_progid_='PythonDemos.Utilities'
_reg_clsid_=pythoncom.CreateGuid()
def SplitString(self, val, item=None):
import string
if item !=None:
item=str(item)
val=str(val)
return val.split(item)
if __name__=='__main__':
print ('Registering COM server...')
import win32com.server.register
win32com.server.register.UseCommandLine(PythonUtilities)
以管理員身份執(zhí)行上述代碼。在注冊成功后厕氨,COM組件會一直保留进每,不受開關機影響,因此可以在任意時候進行調用命斧。最妙的是田晚,你可以隨時更新代碼的函數部分,而無需重新注冊国葬,因此通常情況下贤徒,你只需要在注冊時使用管理員權限。
在VB里:
Private Sub Form_Load()
Set PythonUtils = CreateObject("PythonDemos.Utilities")
response = PythonUtils.SplitString("Hello from VB")
For Each Item In response
MsgBox Item
Next
End Sub
上面說COM組件會一直保留汇四,如果需要注銷接奈,可使用管理員權限執(zhí)行命令行語句(py_name是上面python文件的名稱)。
> python py_name.py --unregister
多余的不用說了通孽,一試便知序宦,這點代碼足以解決諸多混合編程的難題。
該方法不僅適用于VB+Python背苦,Office互捌,Delphi,C++等等行剂,均可使用疫剃。
注:針對評論說的python版本,上述案例使用的是64位python+vb6硼讽,沒有問題。實測VBA同樣可以牲阁。再注:有同學反映說所給的案例無法執(zhí)行固阁,我將該案例上傳壤躲,供各位參考。下載后執(zhí)行bat文件注冊COM备燃,就可以打開VB工程使用了碉克。
鏈接: https://pan.baidu.com/s/1MUx_NkGMfMKYuGc-8W1tKQ 提取碼: hvrh