python調用dll詳解

參考連接http://www.javashuo.com/article/p-xigefrbw-he.htmlhtml

https://www.jb51.net/article/52513.htmpython

http://www.javashuo.com/article/p-kwdxpobn-ha.htmlwindows

windows安裝MinGW-w64教程http://www.javashuo.com/article/p-fgvxdval-q.htmlide


公司業務須要,讓我用python調用領導寫好的dll庫,通過一段時間的研究,終於調用成功,特此來記錄一下過程ui

開發環境win10+python3.6.8(64位)spa


1.安裝MinGW-w64

安裝這個的目的是生成dll文件用,參考地址在上面,講一下注意的點。.net

  1. 安裝的時候version選擇最新的便可。
  2. 安裝目錄隨便選,不是C盤也能夠.
  3. 在這一步下載的時候,大概是20分鐘左右,若是以爲慢的話,能夠直接去下載源碼而後解壓便可,參考文章裏的8、問題列表裏有說明
  4. 安裝好記得在命令行裏面驗證一下是否正確安裝

2.編寫文件生成dll

#include <stdio.h>
 
extern "C" {
    __declspec(dllexport) int Double(int x);
    __declspec(dllexport) float floatAdd(float a,float b); 
    __declspec(dllexport) void HelloWorld(char * str); 
    __declspec(dllexport) void Ints(int * arr,int n); 
}
 
int Double(int x){
    return x*2;
}

float floatAdd(float a,float b) {
    return a+b;
}

void HelloWorld(char * str){
    puts(str);
}

void Ints(int * arr,int n){
    for(int i=0;i<n;i++){
        printf("%d ",arr[i]);
    }
    puts("");
}
View Code

生成dll命令行

g++ dlltest.cpp -shared -o dlltest.dll

3.python調用dll

from ctypes import *


dll = windll.LoadLibrary('E:\code\lx_code\dlltest.dll')

print(dll)

a=dll.Double(123)
print(type(a))
print(a)

輸出內容code

<WinDLL 'E:\code\lx_code\dlltest.dll', handle 6c100000 at 0x27f2ab8bc88>
<class 'int'>
246

到這裏,就算調用成功了。htm

4.可能會遇到的問題

ctypes庫加載dll有好幾種方式,你能夠本身嘗試一下用哪種方式,參考網址https://www.cnblogs.com/baihuitestsoftware/articles/5345089.html

stdcall調用約定:兩種加載方式

Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")

cdecl調用約定:也有兩種加載方式

Objdll = ctypes.cdll.LoadLibrary("dllpath")  
Objdll = ctypes.CDLL("dllpath")  
# 其實windll和cdll分別是WinDLL類和CDll類的對象。
相關文章
相關標籤/搜索