python引用C DLL檔案若干解釋及示例

2021-09-01 15:50:59 字數 1655 閱讀 7465

首先說一下,python不支援c++的dll,但是支援c的dll;c++因為和c相容可以編譯為c的dll,這是下面文章的背景與前提

首先我這兒的示例使用vs2017編譯的dll,先講過程,再解釋

第一步,新建dll專案

確定之後我們可以看到預設的檔案

這時候我們需要新建乙個與test.cpp對應的標頭檔案

這是完成之後的**結構

下面是test.h檔案的內容和test.cpp檔案的內容及相應解釋

// test.cpp : 定義 dll 應用程式的匯出函式。

//#include

"stdafx.h"

#include

"test.h"

bool

test1()

bool

test2()

首先我們需要引用test.h,也就是我們剛剛建立的與之匹配的標頭檔案

test1和test2就是我們寫的python需要呼叫的函式,因為python在呼叫dll時除了int型其他的返回型別都需要指定,所以我用bool來展示

#pragma once

extern

"c"__declspec

(dllexport)

bool

test1()

;extern

"c"__declspec

(dllexport)

bool

test2()

;

這是我們建立的標頭檔案

第一行vs自動生成,不用管它,它的作用是保證標頭檔案只被編譯一次

第二行和第三行就是我們要新增的**,這兩行就是我們定義的函式,有點像以前學c語言的時候老師說的定義在main函式後面的函式要在前面先寫一次,記住這個形式就好了。我來講講前面的代表什麼意思

這個的意思是宣告的函式可以被其他模組呼叫,並且編譯為c檔案

這是ms vc中專用的關鍵字,表示將函式、類等宣告為匯出函式,供其他程式呼叫

這兩個加起來新增到頭檔案裡,宣告的函式編譯出來就可以被python呼叫了

python呼叫方法也很簡單

from ctypes import

*dll = cdll(

"test.dll"

)dll.test1.restype = c_bool

# restype是函式的返回型別,c_bool代表返回bool型別,這裡的對應關係就自己查一下了

# 除了restype還有argtypes,代表函式的引數型別

print

(dll.test1(

))

關於ctypes的部分,主要參考了這篇博文,感謝」無盡的數字眩暈症「

python檔案引用

python的檔案儲存型別跟c c沒多大差別 介紹一下 開啟模式 執行操作 r 以唯讀方式開啟檔案 預設 w 以寫入的方式開啟檔案,會覆蓋已存在的檔案 x 如果檔案已經存在,使用此模式開啟將引發異常 a 以寫入模式開啟,如果檔案存在,則在末尾追加寫入 b 以二進位制模式開啟檔案 t 以文字模式開啟 ...

python呼叫C DLL 傳參技巧

結構體傳參 準備工作 c 檔案 cpp 注意在函式宣告上加上extern c 的修飾 include extern c int double int x float floatadd float a,float b void helloworld char str void ints int arr...

關於C 呼叫C DLL庫傳入陣列 引用的記錄。

1 複雜型別需要c 在定義時保持和c 中的源型別一模一樣,特別是成員的順序,一定要一致。2 複雜型別中的陣列在長度固定時,使用 marshalas unmanagedtype.byvalarray,sizeconst length 如 marshalas unmanagedtype.byvalarr...