首先說一下,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...