使用Python呼叫動態庫

2022-07-05 13:42:10 字數 2453 閱讀 4592

我個人在日常使用電腦時,經常需要使用google,於是就要切換**,基本上是一會兒切換為**,一會兒切換成直連,老是開啟internet 選項去設定,很不方便,於是我萌生了乙個想法:

做乙個開關,我想用**的時候,就點一下開啟。不想用時,就再點一下關閉。

簡單的說,就是自動更改ie的**設定。

實際上這個功能可以使用純python實現,其核心的原理就是使用 windows api internetsetoption。但是python去呼叫這個api相當複雜,不過人家已經實現過了,參見stackoverflow的問題

不過話說回來,想呼叫windows api這件事,為什麼不適用c/c++來實現呢,這對他們來說很簡單就實現了,繞python一圈感覺不是很合理。

所以,這一段用c++來寫,然後其他地方要呼叫直接呼叫就好了,使用c++來更改**伺服器,**大概長這個樣子:

ieproxy_api bool setproxy(tchar* server, bool enabled)

// set flags.

list.poptions[0].dwoption = internet_per_conn_flags;

list.poptions[0].value.dwvalue = enabled ? proxy_type_proxy : proxy_type_direct;

// set proxy name.

list.poptions[1].dwoption = internet_per_conn_proxy_server;

list.poptions[1].value.pszvalue = server;

// set proxy override.

list.poptions[2].dwoption = internet_per_conn_proxy_bypass;

list.poptions[2].value.pszvalue = text("localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*");

// set the options on the connection.

auto breturn = internetsetoption(nullptr,

internet_option_per_connection_option, &list, dwbufsize);

if (breturn)

// free the allocated memory.

delete list.poptions;

return breturn;

}

看起來**有點長,其實有用的就那麼兩三行而已。

總之,c++部分的**做好,編譯,最後生成乙個dll,用dependency walker開啟,裡面能看到有三個c函式。

下一步才是今天的主題,如果用python再呼叫。

嘗試一下用ctypes來實現,ctypes提供跟c相容的資料型別,也允許你呼叫dll,你可以用ctypes來封裝純python的api。

它使用起來也特別簡單,基本上就只有三句話:

from ctypes import *

lib = cdll.loadlibrary(dll_path)

lib.setproxy(args.proxy, true)

首先引入ctypes,這不必說了。然後使用cdll.loadlibrary再裝載dll,最後呼叫dll內部的函式,setproxy就是我之前寫的c的函式,上面的圖上有。整個過程很自然,很簡單。

我最先嘗試的是用pyqt來做乙個圖形的介面,每次都在這個圖形介面上開啟和關閉**,但後來覺得這也太複雜了,圖形化的反而不如命令列簡單直接,那不如直接寫成命令列的算了,雙擊指令碼a就開啟,雙擊b就關閉,然後把a和b都放在桌面上就好了嘛。

於是乎,就有了下面的兩個bat檔案:

disable-proxy.bat

python.exe .\setproxy.py --proxy 127.0.0.1:8118 --switch 0

enabled-proxy.bat

python.exe .\setproxy.py --proxy 127.0.0.1:8118 --switch 1

我把這兩個bat檔案的快捷方式放在桌面上,用的時候雙擊其中乙個就行。

當然了,你都用c寫成了乙個dll了,那乾脆你也寫成乙個獨立的exe算了,exe內部解析命令列。

是的,這樣更好了,都不需要python的環境了,不過,下次再寫吧。

本文涉及到的源**在 github-syler-fun

python呼叫dll動態庫

python呼叫動態庫有兩種型別,主要看dll的匯出函式的呼叫約定 stdll和 cdecl 對應的動態庫的呼叫方式為 ctypes.cdll.loadlibrary test.dll 對應 cdecl呼叫方式 ctypes.windll.loadlibrary test.dll 對應 stdll呼...

Python 呼叫 C 動態庫

呼叫c庫而不是c 庫 要注意平台位數對應 解釋型語言自上而下執行 函式類似標籤,縮排表示 塊 一行一條語句時可以不用分號 如何分配一段記憶體等 test python sample 輸入輸出 print hello end print python string input 請輸入 print 你輸...

如何使用Python呼叫dll動態鏈結庫?

dll是使用c或者c 編譯的動態鏈結庫,一般留有函式入口可以進行呼叫。首先我們通過閱讀原專案的原始碼,找到入口的函式名稱 傳參規則和型別 返回值型別。然後使用python ctype庫載入dll庫,並且呼叫函式,得到返回值。我們發現原專案中可以這樣呼叫 recognize content bytes...