2012-07-23 91 views
1

我想用python ctypes庫來訪問在Visual Fox Pro(從.prg文件)中創建的COM DLL中的各種函數。使用Python ctypes訪問Visual Foxpro COM DLL

這裏是狐親

 
DEFINE CLASS Testing AS CUSTOM OLEPUBLIC 

    PROCEDURE INIT 
     ON ERROR 
     SET CONSOLE OFF 
     SET NOTIFY OFF 
     SET SAFETY OFF 
     SET TALK OFF 
     SET NOTIFY OFF 
    ENDPROC 

    FUNCTION get_input_out(input AS STRING) AS STRING 
     output = input 
     RETURN output 
    ENDFUNC 

ENDDEFINE 

在蟒我做沿東西線的例子(從實際的代碼簡化):

 
import ctypes 

link = ctypes.WinDLL("path\to\com.dll") 
print link.get_input_out("someinput") 

該DLL寄存器微細且被加載但是當我嘗試調用該函數時,我只會得到以下內容。

 
AttributeError: function 'get_input_out' not found 

我可以確定DLL工作正常,因爲我可以通過使用COM庫的php腳本訪問函數。

我真的想在python中得到這個工作,但到目前爲止,我的嘗試都是徒勞的,ctypes甚至可以與VFP一起工作嗎?任何意見,將不勝感激。

回答

0

嘗試從調用函數中刪除括號。將print link.get_input_out("someinput")更改爲print link.get_input_out "someinput"

+0

嗨,我給了它去,但不幸的是python認爲這個SyntaxError:無效的語法。我不認爲我最初的錯誤是關於函數變量,而是首先找到要調用的函數。 感謝您的提供! – hygap 2012-07-23 14:50:34

3

對於使用OLEPUBLIC子句的VFP COM對象,應該使用python Win32擴展,而不是​​模塊。 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表中,微軟提供了一個免費的ADO順應部件vfpoledb可用於通過ADODB,訪問表這轉可以通過Win32擴展中的相同Dispatch()功能訪問。