2013-07-25 22 views
3

我的問題是要使用Python的例子,但它似乎可能是一個普遍的問題。乾淨地實現運行時動態鏈接

我一直在使用加載時動態鏈接,但由於各種原因(我們建議在下面的鏈接),我想動態加載Python庫:

HINSTANCE hModPython = LoadLibrary(_T("Python27.dll")); 

我能負載Py_Initialize和從DLL等功能,但它是一個髒過程:

int (*pPy_Initialize)(void); 
pPy_Initialize = (int (*)(void))GetProcAddress(hModPython, "Py_Initialize"); 
pPy_Initialize(); 

this conversation它表示:

宏可以使這些指針對任何調用Python的C API中的例程的C代碼透明。

我的問題是如何做這個作者建議什麼時候我要導入各種各樣的函數,並帶有各種簽名。使用已經在Python.h中的簽名(包括那個頭文件)會很好。

回答

1

我會像系統鏈接器那樣做:構造一個包含所有函數名稱的符號表。然後只是初始化該表中的指針。函數名可以是固定的字符串常量,也可以從DLL本身讀取(即Win32 API to enumerate dll export functions?)。

該表方法的重大缺陷是,不可能將其與現有代碼一起使用,該代碼按名稱調用函數(pPy_Initialize();) - 您必須使用表中的指針,可能通過枚舉( pPy[Initialize]();)。

不同的簽名可以通過使用不同的表格(每個簽名的表格)來處理。簽名也可以與某些符號形式的名稱一起存儲,然後將它包裝在一些可以解析和檢查它的訪問器或魔法中 - 但這可能很快變得太複雜,就像發明另一種編程語言一樣。

恕我直言,所有奇怪的機器超過宏的唯一重要優勢是,你可能能夠加載任意的DLL與它。除此之外,我不會走那條路。

+0

我同意你的最後一段,宏(或typedefs)似乎是要走的路,儘管你之前提出的建議可能有助於此代碼的另一次迭代。對於其他讀者:您可能會發現本文中來自MSDN的模式有用:[動態鏈接](http://msdn.microsoft.com/zh-cn/library/ms810279.aspx) – davidvandebunte