回覆列表
  • 1 # 小小猿愛嘻嘻

    這裡簡單介紹一下實現過程,不難,主要用到ctypes這個模組,實驗環境win10+python3.6+pycharm5.0,主要內容如下:

    1.為了更好地說明問題,這裡我用vs2017編譯了一個dll檔案,原始碼如下,基於C的,一個簡單的相加函式:

    編譯成功後,會在當前的Debug檔案下生成一個DllTest.dll檔案,我們的測試就是圍繞這個dll檔案展開:

    2.新建一個資料夾,將這個dll複製進去,新建一個py檔案,測試程式碼如下,很簡單,這裡主要使用的是CDLL類,指明dll檔案路徑就行:

    程式執行截圖如下,已經成功列印返回值:

    3.這裡也可以使用WinDLL呼叫dll檔案,以Windows系統下的C:\Windows\System32\user32.dll檔案為例,測試程式碼如下,與上面的類似,只不過使用的是WinDLL:

    程式執行截圖如下,已經成功呼叫:

    至此,我們就完成了利用python呼叫windows下的dll。總的來說,整個過程不難,程式碼量也不是很多,CDLL和WinDLL這2種方式都可以完成dll檔案的呼叫,只要你有一定的python基礎,熟悉一下相關程式碼和示例,很快就能掌握的,網上也有相關教程和資料,感興趣的可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言。

  • 2 # 編碼那些事

    在Windows平臺下,python中可以使用ctypes模組呼叫dll檔案中的庫函式。

    DLL中函式約定的呼叫方式不同,則Python中的引入DLL庫檔案的形式也不同。

    例如一個dll檔案“MyDll.dll”,其函式約定的呼叫方式為C呼叫(cdecl)方式,則Python中載入該dll檔案的程式碼如下:

    from ctypes import *

    dll = CDLL("MyDll.dll")

    若DLL函式的呼叫約定是標準呼叫約定(stdcall)方式,則DLL檔案的載入程式碼則改為:

    dll = WinDLL("MyDll.dll")

    在呼叫DLL中的函式時,其函式中的傳遞引數型別必須設定正確,對於傳數值型別的比較簡單,這兒不提了,下面給出一個傳遞結構體引數型別的例子。

    這個例子的功能是列印一個學生的資訊,並返回一個指向字串的指標。其中,學生資訊定義為一個結構體型別,包括學生的姓名、年齡及分數資訊,該函式的宣告及結構體定義如下圖所示:

    函式printStudentInfo的具體C語言實現程式碼如下:

    那麼,在Python中的呼叫方式如下:

    其執行結果如下圖所示:

    總結:對於結構體引數的傳遞,在Python中需要使用Structure作為基類定義一個與之對應的結構體類Student,在類的_fields中定義結構體中每個成員變數的名稱和資料型別。然後定義結構體類的一個例項物件student,對每個成員變數逐個賦值,以byref傳址的方式進行呼叫就可以了。

  • 中秋節和大豐收的關聯?
  • 從什麼時候開始發現自己是個無趣的人?