2014-12-05 58 views
0

對不起,我的英文很糟糕。 所以。 我在Dev C++中編寫簡單的動態鏈接庫。 它的工作很好。今天我導入這是我的python項目中的庫。 動態鏈接庫文件路徑:lib/my_dll.dll #Dialog箱 config.pyPython CDLL無法加載庫2次

DLL_PATH = "lib/my_dll.dll" 

main.py(config.py)進口

def my_func(): 
    dll = CDLL(DLL_PATH) 
    return dll.func1() 

於是我打開Python解釋器和寫這篇文章。

from main import * 
a = my_func() #Its work nice so a == "c:\\Windows\\a.txt" 

但我重複使用這個功能蟒蛇產生一個錯誤

OSErrror:[WinError 126] The specified module could not be found 

感謝您的閱讀!

+0

提供DLL的完整路徑。而且,返回一個以null結尾的字符串的函數最多也是可疑的。我也看不到如何代碼可以返回一個字符串。你沒有在任何地方指定restype。您應該只加載一次DLL。爲什麼你想一遍又一遍地加載它? – 2014-12-05 14:36:33

+0

謝謝你的回答。這是DLL調用Windows Api文件選擇對話框。在函數中沒有問題。工作很好。我的基本工程目錄c:\ Project。 C:\ Project目錄有main.py,config.py和lib目錄... lib目錄有my_dll.dll。所以我調用my_dll.dll它返回我c_char_p(選定的路徑)。 a = my_func()返回給我path.But再次調用此函數示例a = my_func()生成錯誤 – 2014-12-05 14:46:23

+0

您需要設置'dll.func1.restype = c_char_p'。不要嘗試將整型結果轉換爲'c_char_p(result)'。這會截斷64位指針。 – eryksun 2014-12-05 20:37:26

回答

1

在註釋中,您聲明您的DLL函數調用顯示文件選擇對話框的API函數。文件選擇對話框,除非你告訴他們不要,可以改變工作目錄。由於未能指定DLL的完整路徑,因此每次都會執行DLL搜索。第一次成功是因爲你的工作目錄恰好是找到DLL所需要的。隨後的時間DLL搜索失敗,因爲您的工作目錄已更改。

幾點建議:

  1. 加載DLL時,始終使用要麼只是一個文件名,或者一個完整的絕對路徑。在你的情況下,我懷疑你需要使用後者。
  2. 每次調用函數時都會加載DLL。僅加載一次就足夠了。不要一次又一次地加載浪費時間。
  3. 從Python直接顯示文件對話框可能更容易,並避免爲此目的創建DLL。
  4. 您的ctypes函數導入沒有指定restype,所以我不知道如何從該函數獲取文本。更重要的是,我沒有看到每次調用函數時如何避免內存泄漏。除非文本生活在一個靜態數組中。
+0

謝謝Hefferman先生。這個工程!我複製我的dll文件在我的當前目錄中有main.py和config.py。並改變CDLL方法cdll.my_dll.my_func它的作品。 – 2014-12-05 14:56:49