我個人在日常使用電腦時,經常需要使用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 0enabled-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...