亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

TSMaster腳本訪問DLL:Python、C/C++與C#三條路線避坑指南

TSMaster腳本訪問DLL:Python、C/C++與C#三條路線避坑指南 在 TSMaster 里寫腳本這件事寫得越深越早晚會撞上一堵墻手上有一堆現(xiàn)成的 dll里面有算法、有加密、有設備廠商給的驅(qū)動接口可腳本這邊就是夠不著。TSMaster 自帶的腳本 API 覆蓋的是總線收發(fā)、仿真、診斷、標定這些常規(guī)動作一旦要接第三方庫腳本訪問 dll 就成了繞不開的基本功。這篇按我自己的實操順序把 Python 腳本、C/C 小程序、C# 小程序三條訪問 dll 的路子從頭捋一遍重點講那些文檔里不寫、但一定會讓你卡半天的細節(jié)位數(shù)匹配、調(diào)用約定、依賴鏈、回調(diào)對象的生命周期、字符串編碼、dll 沖突。不管你是剛裝完 TSMaster 想跑第一個腳本的新手還是已經(jīng)在做臺架自動化、想把老代碼搬進來的老手都能直接抄配置、抄代碼。1. 先想清楚腳本為什么要去訪問 dll1.1 TSMaster 里三個能寫腳本的入口這三個入口能碰 dll 的方式完全不同這也是很多人第一次踩坑的根本原因——拿著 Python 的思路去寫 C 小程序或者拿 C 小程序的寫法去套 C#結(jié)果編譯能過、運行就崩。Python 腳本是上手最快的入口在腳本編輯器、全局腳本、測試用例的腳本步驟里都能寫。它的優(yōu)勢是改一行跑一行不用編譯特別適合算法驗證、報文解析、數(shù)據(jù)后處理這類活兒。它訪問 dll 靠的是 Python 自帶的ctypes模塊本質(zhì)是動態(tài)加載 運行時查符號不需要任何頭文件和 lib 文件。C/C 小程序是編譯型的跑在軟件進程內(nèi)部適合高頻、實時性要求高、需要貼著底層接口做的場合。TSMaster 的定時器回調(diào)、報文事件回調(diào)基本都在這個小程序里落地。它訪問 dll 走的是標準 Windows 的鏈接/加載機制需要 dll、lib、頭文件三件套齊活。C# 小程序介于兩者之間.NET 生態(tài)里現(xiàn)成的東西拿來就用寫串口、寫數(shù)據(jù)庫、調(diào) HTTP 接口都很舒服。它訪問 dll 靠的是DllImport這個平臺調(diào)用特性簽名聲明寫對了就能直接調(diào)。1.2 什么情況下非碰 dll 不可我把這些年遇到的場景歸成四類基本能覆蓋九成以上的需求。第一類是公司內(nèi)部已有的算法庫比如 CRC 校驗、信號濾波、標定算法、故障診斷邏輯這些代碼往往跑了很多年只有 dll 沒有源碼重寫的風險比復用大得多。第二類是硬件廠商給的接口電源、程控電阻、示波器、數(shù)據(jù)采集卡、加密狗廠商一般只給 dll 加一份頭文件和一份 PDF你沒有別的選擇。第三類是老的測試代碼本身就是 C/C 寫的邏輯復雜且經(jīng)過長期驗證直接包成 dll 復用比翻譯成 Python 劃算。第四類是需要被 TSMaster 驅(qū)動的 .NET 程序集設備這時候 C# 小程序反而是最順的路。1.3 三條路線怎么選選路線的核心判斷依據(jù)只有三個調(diào)用頻率、實時性要求、以及你手上的資源形態(tài)有源碼還是只有 dll。下面這張表是我自己總結(jié)的對照可以直接照著挑。判斷維度Python ctypesC/C 小程序C# DllImport上手速度最快改完就跑最慢要配工程中等要編譯調(diào)用頻率上限幾千次/秒有解釋器開銷幾十萬次/秒量級幾萬次/秒量級實時性差有 GC 和解釋器抖動最好可控一般需要頭文件/lib不需要需要不需要處理結(jié)構(gòu)體/指針要手寫類型映射直接用要寫封送特性回調(diào)支持可以但有坑最自然可以委托要保引用適合的場景驗證、后處理、低頻控制實時回調(diào)、高頻算法.NET 生態(tài)集成我的習慣是先用 Python 把 dll 調(diào)通確認導出名、參數(shù)、返回值、編碼全對再決定要不要搬到 C 小程序。這個順序能省掉大量時間因為 Python 側(cè)報錯清晰、改起來快而 C 小程序一旦加載失敗往往連個像樣的錯誤信息都看不到。2. 動手前的三道硬門檻位數(shù)、調(diào)用約定、依賴鏈這三道門檻不跨過去后面寫多少代碼都是白費。它們的共同特點是報錯信息極其模糊看起來像是代碼寫錯了實際上是環(huán)境問題。2.1 位數(shù)必須嚴格對上現(xiàn)在的 TSMaster 基本是 64 位程序這意味著三件事。Python 腳本跑在 TSMaster 主進程里解釋器跟著主進程走所以是 64 位C/C 小程序編譯時必須選 x64 平臺選了 Win32 會直接加載失敗C# 小程序要看清目標平臺是 Any CPU 還是 x64Any CPU 在 64 位宿主下會以 64 位運行通常沒問題但如果引用了 32 位的托管程序集就會炸。典型癥狀是OSError: [WinError 193] %1 不是有效的 Win32 應用程序或者 C 小程序加載時提示模塊無效。這個錯誤碼看著像文件損壞實際九成是位數(shù)不匹配。怎么確認一個 dll 是幾位用 Visual Studio 開發(fā)者命令行的dumpbindumpbin /headers CalcLib.dll | findstr machine輸出8664是 x64輸出14C是 x86。沒有 VS 的話用任意一個 PE 查看工具或依賴分析工具看頭信息也行。提示不要試圖用32 位兼容的思路硬扛。32 位進程沒法把 64 位 dll 加載到自己地址空間里跨位調(diào)用只能走進程外方案——起一個 32 位中轉(zhuǎn)進程用命名管道或共享內(nèi)存通信。這套東西的成本和復雜度完全是另一個量級除非萬不得已不要碰。2.2 調(diào)用約定stdcall 和 cdecl 差的那一下棧平衡調(diào)用約定說白了就是函數(shù)返回時誰來清理棧上的參數(shù)。Windows API 用的是__stdcall參數(shù)由被調(diào)用方清理很多第三方 C 庫默認是__cdecl參數(shù)由調(diào)用方清理。如果調(diào)用方和被調(diào)用方的理解不一致棧指針就會錯位后果是返回值全是垃圾、參數(shù)看起來被吃掉了、或者直接崩潰。Python 側(cè)的區(qū)分方式很直接ctypes.CDLL(path)加載默認按cdecl調(diào)用ctypes.WinDLL(path)加載默認按stdcall調(diào)用。選錯的表現(xiàn)非常典型函數(shù)明明返回 0你拿到的是個七位數(shù)或者第一次調(diào)用沒事第二次調(diào)用直接進程消失。C 小程序側(cè)更嚴格頭文件里寫的是__stdcall你的聲明就必須寫__stdcall一個字都不能少。否則編譯鏈接都能過運行必崩。怎么確認一個 dll 的導出函數(shù)用的哪種約定看導出名的裝飾形式dumpbin /exports CalcLib.dll如果看到_Calc_Add8這種帶字節(jié)數(shù)后綴的是stdcall看到_Calc_Add這種只有前導下劃線的是cdecl如果看到一長串帶?和的亂碼名字那是 C 編譯器做了名稱修飾說明 dll 作者沒加extern C。最后這種情況最麻煩因為名字會隨編譯器版本變化只能靠GetProcAddress拿到修飾名去調(diào)或者找廠商要一個 C 接口的導出。2.3 依賴鏈真正的兇手往往是 dll 自己的 dllWinError 126找不到指定的模塊是最常見的加載失敗。絕大多數(shù)人的第一反應是路徑寫錯了于是反復檢查路徑檢查半天沒問題。實際上八成的 126 不是目標 dll 不在而是目標 dll 依賴的某個 dll 不在。常見依賴有三類VC 運行庫msvcp140.dll、vcruntime140.dll、vcruntime140_1.dll廠商的底層驅(qū)動以及某個被其他模塊搶先加載的同名不同版本 dll——這就是大家常說的 dll 沖突。排查三板斧按順序來用依賴分析工具打開目標 dll看哪幾個節(jié)點標紅裝對應版本的 VC 運行庫注意要裝x64版裝成 x86 版解決不了問題把目標 dll 和它所有依賴 dll 全部丟進同一個目錄然后用絕對路徑加載。關于 dll 沖突原理值得說清楚Windows 在同一個進程里同名 dll 只會加載一份。如果某個模塊先把老版本的xxx.dll加載進來了你后面請求加載新版本時系統(tǒng)發(fā)現(xiàn)這個名字已經(jīng)加載過了就會直接把老版本的句柄給你。你調(diào)用的一切都正常但行為就是不對。規(guī)避辦法有兩個。C 側(cè)用LoadLibraryEx加LOAD_WITH_ALTERED_SEARCH_PATH標志讓系統(tǒng)到 dll 自己所在的目錄去找它的依賴而不是從主程序目錄開始找。Python 側(cè)用os.add_dll_directory()把依賴目錄加進搜索路徑這個在 Python 3.8 之后是必須的因為那時起 Windows 上加載 dll 不再默認搜 PATH。3. Python 腳本用 ctypes 訪問 dll 全流程Python 是我最推薦的起點因為它的錯誤反饋最清晰。這一章按實際操作順序走一遍。3.1 環(huán)境確認與 dll 放置策略第一件事是確認 TSMaster 內(nèi)置 Python 的版本。在腳本里跑一句import sys print(sys.version)注意內(nèi)置的 Python 環(huán)境只保證標準庫可用numpy、pandas這類第三方包要看你的安裝包版本里帶沒帶。如果你打算在腳本里做大量數(shù)組運算先在腳本里import numpy試一下不行就得換個思路——要么自己在 C 側(cè)把運算做完要么用ctypes配合原生數(shù)組手寫循環(huán)。第二件事是 dll 放哪。我的習慣是在 TSMaster 工程目錄下建一個libs子目錄把 dll 和它的所有依賴一起丟進去然后腳本里用絕對路徑拼出來。不要依賴系統(tǒng) PATH也不要指望放到主程序目錄就行——那會污染安裝目錄換個工程就亂套。import os DLL_DIR rD:\Project\TSMaster\Demo\libs if hasattr(os, add_dll_directory): os.add_dll_directory(DLL_DIR) # Python 3.8 必須 DLL_PATH os.path.join(DLL_DIR, CalcLib.dll)如果你的腳本需要跨機器部署別把絕對路徑寫死。可以讀一個同目錄的配置文件或者用工程根目錄加子路徑拼出來。有些執(zhí)行方式下的 TSMaster 腳本拿不到__file__這種時候老老實實從工程配置里讀路徑比猜要靠譜。3.2 參數(shù)類型映射表與結(jié)構(gòu)體對齊ctypes有一套自己的類型系統(tǒng)和 C 類型不是一一對應。下面這張表是我平時貼在顯示器邊上的照著填基本不會錯。C 側(cè)聲明ctypes 寫法關鍵備注intctypes.c_int固定 32 位unsigned intctypes.c_uintshortctypes.c_short16 位unsigned charctypes.c_ubytecharctypes.c_char單字節(jié)字符const char*ctypes.c_char_p傳bytes不是strvoid*ctypes.c_void_p萬能指針float/doublectypes.c_float/c_double別混用BOOLWin32ctypes.c_int4 字節(jié)boolCctypes.c_bool1 字節(jié)和 BOOL 不是一回事unsigned char[N](ctypes.c_ubyte * N)定長數(shù)組struct自定義Structure子類_pack_必須對齊字符串編碼是另一個高頻坑。C 側(cè)的char*絕大多數(shù)情況下是 ANSI 編碼在中文 Windows 上就是 GBK而 Python 側(cè)字符串是 Unicode。傳參的時候要顯式編碼取回來的時候要顯式解碼name 左前輪速 calc.Calc_SetName.argtypes [ctypes.c_char_p] calc.Calc_SetName.restype ctypes.c_int calc.Calc_SetName(name.encode(gbk))踩過的坑記錄一下有一次我順手寫了encode(utf-8)傳過去 C 側(cè)按 GBK 解結(jié)果所有中文全變亂碼但英文和數(shù)字完全正常排查了半天才想起來是編碼問題。所以規(guī)矩就這么定死——對外傳參一律 GBK除非頭文件里明確寫了寬字符接口。結(jié)構(gòu)體的對齊更隱蔽。C 側(cè)結(jié)構(gòu)體如果有#pragma pack(1)Python 側(cè)就必須寫_pack_ 1否則字段偏移會差幾個字節(jié)你會讀到看起來完全隨機的值。class CanFrame(ctypes.Structure): _pack_ 1 _fields_ [ (id, ctypes.c_uint), (dlc, ctypes.c_ubyte), (data, ctypes.c_ubyte * 8), (timestamp, ctypes.c_ulonglong), ]3.3 一個能跑通的完整例子假設廠商給了我們一個CalcLib.dll導出三個函數(shù)int Calc_Add(int, int)、int Calc_CRC16(const unsigned char*, int, unsigned short*)、void Calc_SetLogCallback(void(*)(int, const char*))全部是stdcall。完整腳本如下。import ctypes import os DLL_DIR rD:\Project\TSMaster\Demo\libs if hasattr(os, add_dll_directory): os.add_dll_directory(DLL_DIR) DLL_PATH os.path.join(DLL_DIR, CalcLib.dll) # stdcall 用 WinDLL若是 cdecl 則換成 CDLL calc ctypes.WinDLL(DLL_PATH) # 1) 簡單函數(shù) calc.Calc_Add.argtypes [ctypes.c_int, ctypes.c_int] calc.Calc_Add.restype ctypes.c_int print(Calc_Add(3,4) , calc.Calc_Add(3, 4)) # 2) 帶輸出緩沖區(qū)的函數(shù) calc.Calc_CRC16.argtypes [ ctypes.c_void_p, ctypes.c_int, ctypes.POINTER(ctypes.c_ushort), ] calc.Calc_CRC16.restype ctypes.c_int def crc16(data: bytes) - int: buf (ctypes.c_ubyte * len(data)).from_buffer_copy(data) out ctypes.c_ushort(0) rc calc.Calc_CRC16( ctypes.cast(buf, ctypes.c_void_p), len(data), ctypes.byref(out) ) if rc ! 0: raise RuntimeError(Calc_CRC16 failed, rc%d % rc) return out.value print(CRC16 0x%04X % crc16(b\x01\x02\x03\x04\x05\x06\x07\x08))幾個細節(jié)值得單獨說。第一argtypes和restype一定要寫。不寫的話 ctypes 會按默認規(guī)則猜指針會被截斷成 32 位在 64 位進程里直接崩。第二輸出參數(shù)用ctypes.byref(out)比ctypes.pointer(out)更輕量也更快。第三from_buffer_copy會復制一份數(shù)據(jù)避免你后續(xù)改動原 bytes 影響 dllbytes 本身不可變但換成bytearray時就有這個風險了。讀寫一個結(jié)構(gòu)體數(shù)組也順手給出來做批量報文處理時用得上frames (CanFrame * 64)() calc.Calc_ReadFrames.argtypes [ctypes.POINTER(CanFrame), ctypes.c_int] calc.Calc_ReadFrames.restype ctypes.c_int n calc.Calc_ReadFrames(frames, 64) for i in range(n): print(hex(frames[i].id), frames[i].dlc, bytes(frames[i].data[:frames[i].dlc]))3.4 回調(diào)函數(shù)最容易閃退的地方回調(diào)是 Python 調(diào) dll 里最危險的一環(huán)。寫法本身很簡單CALLBACK ctypes.CFUNCTYPE(None, ctypes.c_int, ctypes.c_char_p) def _on_log(level, msg): text msg.decode(gbk, errorsignore) if msg else print([dll][%d] %s % (level, text)) _cb CALLBACK(_on_log) # 存成模塊級變量 calc.Calc_SetLogCallback.argtypes [CALLBACK] calc.Calc_SetLogCallback.restype None calc.Calc_SetLogCallback(_cb)大坑在這里如果你偷懶寫成calc.Calc_SetLogCallback(CALLBACK(_on_log))Python 側(cè)沒有任何變量持有這個回調(diào)對象垃圾回收一觸發(fā)就把它回收了。dll 下一次回調(diào)時跳到已經(jīng)釋放的地址整個進程瞬間消失。這種崩潰的惡心之處在于——它不在注冊的那一刻發(fā)生而是在幾秒或幾十秒之后看起來毫無規(guī)律特別難定位。第二個要注意的點是線程。回調(diào)是在 dll 自己的線程里進來的跟你的腳本主線程不是一回事。在回調(diào)里直接動手操作 TSMaster 的界面對象或發(fā)報文接口很容易出現(xiàn)競態(tài)。我的做法是在回調(diào)里只做一件事把數(shù)據(jù)塞進一個線程安全的隊列然后在腳本的主循環(huán)或定時器里取出來處理。第三個點是異常。回調(diào)函數(shù)里拋出的 Python 異常不會優(yōu)雅地傳回 dll跨語言邊界的行為是未定義的。所以回調(diào)體里必須自己包一層try/except出錯就記日志絕不讓異常逃出去。4. C/C 小程序直接鏈接 dll 的做法C 小程序的調(diào)用開銷最小實時性最好代價是配置麻煩、出錯難查。這一章講配置和兩種調(diào)用方式。4.1 工程配置的三件套與輸出目錄在 TSMaster 里寫 C/C 小程序需要在工程設置里配好三樣東西頭文件搜索路徑、lib 文件搜索路徑、附加依賴項。配完之后編譯鏈接能過但運行還會掛——因為小程序編譯出來的 dll 是要被主程序加載的它所在的目錄和你配的路徑?jīng)]關系。關鍵動作是把第三方 dll 復制到小程序輸出 dll 的同一個目錄里。如果你在小程序工程設置里找到了附加依賴項或DLL 搜索路徑這類配置項優(yōu)先用它沒有的話就靠同目錄擺放 絕對路徑加載兩條腿走路穩(wěn)。還有兩個編譯選項必須注意。平臺選x64和 TSMaster 保持一致。運行時庫選/MD多線程 DLL不要選 /MT。原因是 dll 之間的內(nèi)存分配和釋放必須共用同一份 CRT如果你用 /MT第三方 dll 用 /MD就會出現(xiàn)在我這邊 new、在你那邊 delete的災難癥狀是隨機崩潰或者內(nèi)存泄漏極難查。4.2 隱式調(diào)用與顯式調(diào)用的取舍隱式調(diào)用就是編譯期鏈接代碼干凈#pragma comment(lib, CalcLib.lib) extern C __declspec(dllimport) int __stdcall Calc_Add(int a, int b); void demo_implicit() { int r Calc_Add(3, 4); printf(Calc_Add %d\n, r); }優(yōu)點是寫起來清爽IDE 能補全。缺點也很致命程序啟動時就必須能找到這個 dll找不到的話整個小程序加載失敗而 TSMaster 那邊給出的提示往往只是一句小程序加載失敗你完全不知道是哪個 dll 的問題。顯式調(diào)用多寫幾行但可控性完全不一樣#include windows.h #include cstdio typedef int (__stdcall *PFN_ADD)(int, int); static PFN_ADD g_pfn_add nullptr; static HMODULE g_hmod nullptr; int ensure_calclib_loaded() { if (g_hmod g_pfn_add) return 0; g_hmod ::LoadLibraryExW( LD:\\Project\\Demo\\libs\\CalcLib.dll, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); if (!g_hmod) { DWORD err ::GetLastError(); printf([CalcLib] LoadLibrary failed, err%lu\n, err); return (int)err; } g_pfn_add (PFN_ADD)::GetProcAddress(g_hmod, Calc_Add); if (!g_pfn_add) { printf([CalcLib] GetProcAddress failed, err%lu\n, ::GetLastError()); return -1; } return 0; }LOAD_WITH_ALTERED_SEARCH_PATH這個標志的作用前面提過——讓系統(tǒng)從 dll 自己所在的目錄去找它的依賴。當你把依賴 dll 全放在libs目錄里時這個標志幾乎是必須的否則系統(tǒng)會從主程序目錄開始找找不到就報 126。我的建議很明確調(diào)試期一律用顯式調(diào)用把所有錯誤碼都打出來。等接口穩(wěn)定、部署環(huán)境固定了再決定要不要換成隱式。很多時候根本換回來——顯式調(diào)用的那點代碼量換來的可診斷性太值了。4.3 在定時器回調(diào)里調(diào) dll 的注意事項TSMaster 的定時器回調(diào)跑在實時線程上在這個上下文里調(diào)外部 dll有幾條線不能碰。首先不要在回調(diào)里做大塊內(nèi)存分配、磁盤 IO 或Sleep。這些操作會阻塞實時線程表現(xiàn)出來就是定時不準、界面卡頓、報文丟幀。實測過一個案例dll 單次調(diào)用耗時 3 毫秒定時器周期設成 1 毫秒界面上肉眼可見地卡報文時間戳也開始漂。其次一定要搞清楚 dll 是不是線程安全的。很多廠商的 dll 內(nèi)部有全局緩沖區(qū)多個線程同時調(diào)用會互相踩。判斷方法很簡單——看頭文件里有沒有提到線程安全或者不可重入含糊不清的就當它不安全處理。做法是自己加一把臨界區(qū)static CRITICAL_SECTION g_cs; static bool g_cs_inited false; int safe_calc_add(int a, int b) { if (!g_cs_inited) { ::InitializeCriticalSection(g_cs); g_cs_inited true; } ::EnterCriticalSection(g_cs); int r g_pfn_add ? g_pfn_add(a, b) : -1; ::LeaveCriticalSection(g_cs); return r; }第三絕對不要讓 C 異常穿過 dll 邊界。如果你的 dll 和主程序的 CRT 版本不一致異常穿越邊界時會直接終止進程連日志都沒有。規(guī)矩就是dll 內(nèi)部自己try/catch對外只返回錯誤碼一個異常都不許漏出來。第四如果你在回調(diào)里同時用 TSMaster 自身的接口TSApp命名空間那一套和外部 dll功能上沒問題但要注意別在兩邊都做阻塞操作。我一般把外部 dll 的耗時調(diào)用抽到一個獨立工作線程回調(diào)里只投遞任務這樣實時線程永遠輕裝。5. C# 小程序用 DllImport 引入外部接口C# 小程序的平臺調(diào)用寫起來最像聲明一下就能用但封送處理有它自己的坑。5.1 簽名聲明與封送處理using System; using System.Runtime.InteropServices; public static class CalcLib { [DllImport(CalcLib.dll, CallingConvention CallingConvention.StdCall, CharSet CharSet.Ansi)] public static extern int Calc_Add(int a, int b); [DllImport(CalcLib.dll, CallingConvention CallingConvention.Cdecl)] public static extern int Calc_CRC16(byte[] data, int len, out ushort crc); }幾個要點。CallingConvention的默認值是StdCall對應Winapi但很多 C 庫是Cdecl必須顯式寫清楚。雖然現(xiàn)在 64 位下 Windows 的調(diào)用約定已經(jīng)統(tǒng)一了寫清楚的好處是將來萬一要切 32 位不會莫名其妙地崩。out ushort會被自動封送成指針比在 C 里手寫指針舒服得多。結(jié)構(gòu)體要顯式標注布局和對齊[StructLayout(LayoutKind.Sequential, Pack 1)] public struct CanFrame { public uint Id; public byte Dlc; [MarshalAs(UnmanagedType.ByValArray, SizeConst 8)] public byte[] Data; public ulong Timestamp; }Pack要和 C 側(cè)的#pragma pack一致。結(jié)構(gòu)體里有定長字符串時用[MarshalAs(UnmanagedType.ByValTStr, SizeConst 32)]配CharSet.Ansi能自動幫你做 ANSI 和 Unicode 的轉(zhuǎn)換。dll 的加載路徑是另一個坑。C# 小程序的 dll 搜索路徑和主進程有關最穩(wěn)的辦法是顯式設置搜索目錄[DllImport(kernel32.dll, CharSet CharSet.Unicode, SetLastError true)] private static extern bool SetDllDirectory(string lpPathName); SetDllDirectory(D:\Project\Demo\libs);不要圖省事把 dll 復制到 TSMaster 主程序目錄那會讓安裝目錄越來越亂而且換臺機器就失效。5.2 內(nèi)存生命周期與托管對象釘住數(shù)組傳給非托管代碼時有個隱蔽陷阱如果 dll 把這個指針存起來了、稍后再用那么 GC 一旦壓縮堆數(shù)組就被移動了dll 手里那個指針就變成了野指針。這種場景必須把托管對象釘住var buffer new byte[4096]; var handle GCHandle.Alloc(buffer, GCHandleType.Pinned); try { IntPtr ptr handle.AddrOfPinnedObject(); // 把 ptr 傳給 dll } finally { handle.Free(); // 必須釋放否則句柄泄漏 }回調(diào)這塊和 Python 是同一類問題。委托必須有人持有引用否則 GC 回收之后非托管側(cè)的回調(diào)就跳飛了。做法是把委托存成靜態(tài)字段或者在調(diào)用完之后加一句GC.KeepAlive(callback)。還有一條規(guī)矩要記牢誰分配的內(nèi)存誰釋放。dll 里分配的內(nèi)存一定要用 dll 自己導出的釋放函數(shù)去釋放絕對不要在 C# 里調(diào)Marshal.FreeHGlobal去放掉——兩邊的堆管理器不一樣這么干必崩。6. 報錯排查速查表與實測踩坑記錄6.1 加載失敗類報錯速查報錯含義最可能的原因處理辦法WinError 126找不到模塊依賴缺失少了 VC 運行庫或依賴 dll依賴分析工具查紅色節(jié)點補齊依賴WinError 193不是有效 Win32 程序位數(shù)不匹配64 位宿主加載 32 位 dlldumpbin /headers確認位數(shù)WinError 127找不到指定程序?qū)С雒环中揎?、拼寫錯誤、大小寫dumpbin /exports核對導出名WinError 1114DLL 初始化例程失敗DllMain 出錯dll 在 DllMain 里加載別的 dll 或建線程找廠商確認或用顯式延遲加載繞開加載成功但行為不對dll 沖突同名老版本已被搶先加載絕對路徑 獨立目錄隔離WinError 1114這個特別值得說一句。它出現(xiàn)的時候通常意味著 dll 的DllMain里干了不該干的事——比如在DLL_PROCESS_ATTACH階段去調(diào)用LoadLibrary加載另一個 dll、創(chuàng)建線程、或者調(diào)用會阻塞的同步 API。Windows 的加載鎖還在持有狀態(tài)這些操作就會死鎖或者失敗。如果廠商不給你源碼唯一的辦法是繞開把 dll 的加載推遲到實際調(diào)用的時候顯式LoadLibrary而不是在進程啟動階段就讓它被隱式加載。6.2 調(diào)用即崩潰類問題調(diào)用一次就崩和調(diào)用兩次才崩是兩種完全不同的問題不要混在一起查。調(diào)用一次就崩八成是參數(shù)類型或調(diào)用約定錯了。檢查順序先確認stdcall還是cdecl再確認參數(shù)寬度int和long在 64 位下都是 4 字節(jié)但size_t是 8 字節(jié)unsigned long在 Windows 上也是 4 字節(jié)unsigned long long是 8 字節(jié)最后確認結(jié)構(gòu)體對齊。Python 側(cè)特別容易犯的錯是沒寫argtypes導致指針被當成int截斷。調(diào)用兩次才崩基本就是回調(diào)對象被 GC 回收了或者某個緩沖區(qū)被寫越界、破壞了相鄰內(nèi)存。回調(diào)的問題前面講過了解決辦法就是把回調(diào)對象存成長生命周期變量。緩沖區(qū)越界的問題可以在 Python 側(cè)把緩沖區(qū)開大一圈前后各留 32 字節(jié)的哨兵調(diào)完之后檢查哨兵有沒有被改寫能快速判斷是不是越界寫。6.3 結(jié)果不對但不崩的問題這一類最難查因為沒有任何報錯。常見的三種情況我按出現(xiàn)頻率排一下。排第一的是字符串編碼。前面說過char*在中文 Windows 上基本都是 GBK你按 UTF-8 編過去就會亂碼。排查辦法很簡單——傳一個純英文串過去如果正常基本就是編碼問題。排第二的是結(jié)構(gòu)體對齊。C 側(cè)用了#pragma pack(1)Python 側(cè)沒寫_pack_ 1字段偏移全錯你會看到 ID 和 DLC 好像對得上但時間戳完全離譜。這種部分字段正確的現(xiàn)象是對齊問題的典型特征。排第三的是返回值語義理解錯了。有些 dll 返回的是實際寫入的字節(jié)數(shù)有些返回的是錯誤碼有些返回 0 表示成功、有些返回 0 表示失敗。這種事只能翻文檔或者做實驗確認——給一組已知輸入看返回值是不是符合你的預期。6.4 一套固定的排查流程踩了足夠多次之后我固化下來一套排查順序從下往上打基本能在二十分鐘內(nèi)定位到問題用dumpbin /headers確認位數(shù)和宿主進程一致用dumpbin /exports把導出名原樣抄下來別憑記憶拼用依賴分析工具打開 dll把紅色節(jié)點全部解決掉改成絕對路徑加載加上LOAD_WITH_ALTERED_SEARCH_PATH先在 Python 里最小化復現(xiàn)把參數(shù)、返回值、編碼全部驗證正確再把驗證過的調(diào)用原樣搬到 C 小程序或 C#全程打日志——加載結(jié)果、每次調(diào)用的參數(shù)和返回值、錯誤碼一個都不省。第 5 步是我最想強調(diào)的。很多人上來就在 C 小程序里硬剛編譯半天加載失敗只會給一句模糊提示來回折騰幾個小時。同樣的邏輯用 Python 寫十行代碼報錯清清楚楚十幾分鐘就能確認 dll 本身有沒有問題。確認沒問題了再搬效率差好幾倍。7. 一些不成體系但很值錢的經(jīng)驗cts里加載 dll 的時候WinDLL和CDLL的選擇可以現(xiàn)場驗證。如果你不確定調(diào)用約定可以兩個都試一次哪個不崩就是哪個——這個方法土但有效前提是崩的是 Python 進程而不是整個 TSMaster。所以務必先在獨立的 Python 環(huán)境里做這個實驗別在 TSMaster 里試。dll 目錄隔離這件事我的做法是每個第三方庫單獨一個子目錄目錄名帶上版本號。這樣做的直接好處是同名不同版本的 dll 永遠不會互相干擾出問題的時候也知道該退回到哪個版本。代價是磁盤上多幾份文件這個代價值得付。關于調(diào)試有個小技巧特別管用在 Python 側(cè)寫一個probe.py腳本內(nèi)容就是把 dll 加載一遍、把每個導出符號打印出來、用一組固定輸入跑一遍調(diào)用。換機器、換版本、換編譯器的時候先跑這個腳本二十秒就能判斷環(huán)境是不是健康的。這個腳本我改過七八個版本現(xiàn)在是每次接手新 dll 的第一件事。最后一個經(jīng)驗是關于文檔的。廠商給的 PDF 里參數(shù)表和返回值說明通常寫得像謎語。真正靠譜的做法是拿 dll 去打邊界值——傳 0、傳負數(shù)、傳超大值看它返回什么、會不會崩。打完之后你對這個 dll 的脾氣就有底了比讀十頁文檔管用。當然這個實驗必須在隔離的 Python 環(huán)境里做崩了也不影響 TSMaster 主進程。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
69久久| 久久久久极品| 九九热精品| 免费自拍三级综合| 九九九九九九九九九国产精品| 啊啊啊com| 一区操逼| 日本中文熟女视频| 奇米四色网| 久久99久久99精品天美传媒棢·纸:. | 色爱三区| 亚洲一级特黄大片在线播放91| 色九久| 色天堂在线观看| 高清不卡一二三区视频......| 太久视频| 国产AV激情无码久久无码 | 五月丁香婷婷啪啪| 一区二区三区四区免费视频| 91在线超高颜值国产| 亚洲国产97在线精品一区| 天天弄欧美| 久久9 9 9精品| 九九热免费视频| 国产精品农村妇女| 91插B网站| 欧美日韩人妻少妇 一区二区三区| 禁片 高清 在线观看视频网站| 九色精品视频导航1| 青青草好吊色| 四虎在线视频| 9美女超碰在线免费观看| 美女干逼2| 久久久久久久久久久97| 亚洲s在线观看| 99热| 五月婷视频| 欧美性爱视频免费一区一A| 亚洲乱色熟女一区| 一级性爱啪啪视频| 国产精品无码久久久久2025| 激情小说图片亚洲首页| 在线人成亚洲视频免费观看| 天天看天天日天天操| 亚洲欧美天堂| 女人被男人桶爽视频网站| 日韩精品在线观看观看| 久久久久国产精品片区无码直播 | 久日91在线| 97干com| 97色伦欧美| 国产精品国产拍高清AV| 桃色五月天| 91啪啪视频| 久久婷婷伊人| 性生活无遮挡纯毛片在线看| 2017大香蕉国产精品久久| 精品视频123区小说区| 久久久蜜桃一区二区三区| 五月婷婷综合激情| 天天透伊人| 色呦呦、国产精品| 天天色悠悠激情| 中文字幕成人| 伊人久久亚洲中文字幕| 人妻素股| 高清孕妇孕交 交| 伊人九九九| 青草综合| 97人人模人人爽人人| 久久亚洲婷婷| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日本99一区二区| 精品无码一二三四区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 一区二区视频在看| 国产成人亚洲精品无码古代早漏男| 成人a大片在线观看| 九色精品视频导航1| 国产精品婬乱一级毛片彝族| 亚洲天堂男人在线| 超碰视97中文| 亚洲av噜噜噜噜噜噜| 五月天婷婷在线看| 午夜大香蕉| 黑人天8A∨高清网站| 操死我了啊啊啊| 麻豆视频一区二区| 欧美少妇性爱网站| 红桃视频高潮| 亚洲美女精品九九视频| 可以在线观看AV的网站| 国产视频三区四区| 亚洲情色 自拍| 欧美亚洲中文| 久久久久骚| 丝袜色综合| 日韩强奸av| 日韩午夜精品一区二区三区电影| oumeisetu综合| 大香蕉日韩欧美| 中文操逼字幕| 99欧美| 婷婷五月天无码| 超碰78| 色久桃花影院在线观看| 日本人体九九九九九九| 五月天亚洲网| 免费中文在线| 亚洲色图 综合| 精品无码秘 人妻一区二区| 国产高清成人免费视频| 强奸乱伦资源| 97色涩| 伊人操| 丁香五月色| 久操在97| 日韩女模中文造逼| 亚洲drav色图| 国产Aα| 国产人伦精品一区二区三区| 亚洲97在线| 国产精品青草综合久久| 啊啊啊快操我视频| 亚洲一区二区性爱电影| 色哟哟av网址| 激情啪啪拍91| 天天综合~91| 性做久久久久久久| 欧美日韩国产色五月综合在线| 奇米狠999| 91五月天| 欧美日韩操逼动图| 天天操天天日天天干| 亚洲最新av无码成人精品区| 蜜臀一二三| 先锋色眉乱伦资源| 97视频在线免费播放| 亚洲国产91精品一区二区久久| 久久久草成人网站久久久草成人久久久草久久久 | 欧美色亚洲| 超碰在线99| 久久老熟女| 久久欧美按摩999| 97视频在线看| 欧美第38页| 亚洲国产一级黄色视频| 99热精品国产| 九九99久久| 夜夜精品视频| 熟女色图在线| 五月婷婷久久综合| 青青在线视频免费| 九九久久久九九| 翔田千里Av在线| 香蕉免费一区二区三区不读| 天堂九九九九九九九九九| 18禁止看精品中文字幕| 色偷综合| 人人天天欧洲| 少妇人妻好深太紧了vr91| 久久精品国产精品| 91 手机在线播放 绯色| 东京热视频网| 日本黄色精品| 热天堂一区二区| 丁香六月激情| 清纯唯美第一页| 肥臀熟女福利视频一区二区| 91肉片| 2019AV天堂| 亚洲成人一区二区精品| 91网站18禁| 日本97久久久精品| 大香网站| 精品久久久av无码免费| 97热视频在线观看| 日本东京热大香蕉a片| 欧美日韩不卡a片| 亚洲美女精品九九视频| 亚洲综合影视| 婷婷激情五月| 国产亚洲精品一区二区三区| 2019午夜福利视频| 精品少妇一区二区三区免费观看| 日韩亚洲中文有码视频| 色与欲影视| 天天舔天天日天天射| 久久人妻精品| 天天躁日日躁xxxxx| 97se亚洲综合自| 欧美 亚洲 另类 综合| 夜夜嗨一区二区| 老司机老司机午夜影院| 麻豆国产精品午夜视频| 亚洲欧美清纯| 91天堂丝袜美腿| 99re99视频在线免费观看| 超踫中文字幕| 亚洲精品影视老司机| 97在线看| aV中亚| 亚洲 日本 不卡| 亚精品无码毛片一区二区三区| 九九热精品| 亚欧性爱ab| 日韩中文字幕精品一区在线| 国产婷婷综合在线观看| 日韩欧美性爱电影在线观看| 96精品久久| 蜜区区视频79 | 欧洲免费一区二| 国产精品探花视频| 人人插人人摸人人| 99久久e免费热视| 国产无马在线| 人人人摸人人| 亚洲天堂五月天国产| 精品视频一区二区| 免费AV中文网在线观看| 日韩熟女操逼| 色色网91| 新婚人妻扶着粗大强行坐下| 熟女人妇一区二区三区| 99热思思| 伊人色综合超碰| 日韩二级| 日本999精品视频| 中文字幕av久久爽Av| 亚洲第一页欧美| 嗯嗯,啊啊,国产精品| 久久久精品国产亚洲伊人| 人妻少妇色综合| 日韩成人精品视频自拍| 性爱乱伦一区| 激情小说五月天| 富二代亚洲精品99| 欧美 亚洲 综合 制服 另类| 久久精品噜噜噜成人看免欧美大片| 精品丰满熟妇人妻一区| 91精品国产91熟女| 国产操伦| 深田咏美亚洲精品福利社| 国产亚洲在线| 亚洲色图国产另类| 不卡六六在线91| 香蕉精品二区二区| 婷婷午夜成人色中色| 免费操逼视频下载| 亚洲春色激情小说| 日日黄色三级网站| 亚洲狠狠入| 欧美日韩在线小说 | 欧美天天性| 高清国产成人无码| 999岛国大片| 婷婷中文字幕| 亚洲天堂男人在线| 欧美性,色九九| 中文一区在线日| 精品免费囯产一区二区三区 | 岛国片在线播放| 最新的亚洲无吗| 国产成人网址| 97精品国产精品免费观看| 亚州色图欧美色图| 国产无马在线| 91爽啪| 99精品高潮| 亚洲国产97在线精品一区| 91处女在线观看| 中文字幕亚韩| 熟妇艹鸡八| 亚洲熟女一区二区| 国产一进一出视频网站| 伊人黄色视频免费观看| 91nbbbbbb| 亚洲无992tv| 国产成人免费观看在线视频| 97久精品| 97碰| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚春色色| 18禁免费视频| 欧美综合97www| 狠狠躁伊人中文字幕| 日韩操逼HD| 懂色综合久久久| 精久久久| 无码精品人妻一区二区三区妖精 | 97午夜剧场日韩| 国产丸一视频| 亚洲欧洲日本精品中文a∨| 久久婷婷伊人| chaopen97久久| www.91逼逼.com| 男人的天堂成人的社区| 天天综合网日韩| 国产毛片精品一区二区色欲黄A片| 国产精品熟妇一区二区三| 中文字幕丰满人妻日本| 好吊妞转入那个网| 水滴偷拍| 天美av在线观看| 黑人在线91| 在线性黄高清免费视频| 超碰导航97| 国产熟女完整版中字| 国产传媒1234区| 国产精品不卡一区二区三区av| 婷婷五月av| 欧美亚洲韩国视频十五区| 人人看欧美性爱| 欧美78| 欧美精品一区二区少妇免费A片| 亚洲中文字幕有码视频一区二区三区| 九九AV| ,国产乱人伦精品一区二区三区| 国产sv美女内射| 综合色99| 欧美性暴力| 91人妻人人妻| 亚洲熟女性高潮久久久| 97精品一区| 久久久国产三级黄色片| 亚洲一区二区中文字幕| 日夜干射色啊| 在线 制服丝袜中出 人妻| 97亚洲在线| 欧美老妇综合网| 中文字幕乱在线伦视频中文字幕乱码在线 | 久久久久久久久9| 乱人伦 国语对白:视频直接看| 999999精品| 打av高清| 国产成人自拍视频在线| 成人免费在线网站| 亚洲欧美日韩制服另类| 美女露胸露奶头| 欧美内射少妇| 天天在线91| 97久久超碰亚洲| 亚洲综合首页| 国产精品永久免费10000| 精品一区二区成人| 能看的av| 九九夜精品九九在线| 欧亚日韩综合精品国产| 久久尹人大香焦视| 一区二区三区黄色片a| 成年女人18级毛片毛片免费观看| 久久本道| 无码九九| 97超碰色色| 综合色一区三区二区| 74成人在线| 久久亚洲av成人无码国产| 情色AV电影| 色悠久久久av| 屁股久久久久久| 伊人久久大香线蕉无码| 天天爽爽爽爽| 亚洲精品不卡一二三区| 免费操逼91| 日本五十路熟女一区二区| 中文字幕啊啊啊在线观看视频| 美女主播色欲91抠b在线播放| 国产精品乱码久久久、久久| 肏逼视频日本| 久久免费精彩视频| 日韩不卡一二三四| 99999亚洲| 家庭乱伦性爱av| 综合网欧美在线| 色眯眯av| 国产日韩精品人妻久久久久色欲网站| 91女网站| 国产白丝AV| 26UUU欧美激情一区二区| 国产又粗又又黄又猛| 色偷偷综合91久久噜噜| 亚洲精品一二区| 国产精品天美传媒| 超碰97男女| 亚洲黄色a级片| 久久精品国产99国产精品亚洲| AV天堂因数| 久久AV无码网址| 麻豆国产原创AV色哟哟| 啊啊啊啊操死我| 丁香九月激情| 夜夜夜夜久久久久| 在线性黄高清免费视频| 美女丝袜激情小说| 午夜120视频在线观看| 日韩精品人妻中文字幕久久久| 中日韓欧美高清| 精品-91人妻子系列| 九一国产精品| 欧美十八禁在线看| 校园激情狠狠四射| 强奸乱伦大香蕉| 97视频www| 第四色奇米影视777| 中日韩久久人妻一区二区| 国产精品视频内谢女人| 啊啊啊啊嗯嗯嗯用力好爽 | 2020天天色综合| 在免费jIzzjIzz在线视频| 日韩电影天堂视频二区三区| 三级激情网站| 精品人妻一区二区乱码一区二区 | 亚洲欧美一区二区三区在钱蜜桃 | 日韩中文字幕熟妇人妻| 国产成年女人免费视频播放a| 蜜桃中文字日产乱幕4区| 青草综合| 屌妞视频久久久久久久久久久久 | 中文字幕第23区| 91高清无码下载| yazhousetuoumei| 激情小说图片亚洲首页 | 男人的天堂2018| 97人肏| 久久久久久99AV无码免费网站| 色91综合网| 亚洲 欧美 偷拍 唯美| 亚洲自拍欧美色综合| 精品亚洲黄色片 国产精品导航一区二区| 国产久久一区二区| 久久99网站| 91精品老女人| surenchaopeng| 淫荡熟女乱伦网| 麻豆一区在线| 色婷婷视频| 韩国一级做a久久久久| 老师充足的奶水小说| 无码精品久久久天天影视| 疯操AV| 96久久科窝| 中文人妻av高清一区| 亚洲国产中文字幕| 亚洲精品819| 欧美特大AA级黄片| 自拍第一页| 国产丝袜视频| 成人激情无码在线视频| 婷婷精品国产欧美精品亚洲人人爽| 在线综合色| 丁香婷婷色五月| 国产在线综合福利网站| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 精品9区| 激情婷婷丁香| 亚洲国产奇米影视久久| 易易A毛视频| 日韩在线视频1234| 乳欲人妻办公室奶水| 亚洲a色| 啊啊啊啊啊啊啊啊啊啊在线观看| 99色在线| 国产一级αv免费看片| 热99这里有精品综合久久| 欧洲亚洲人妻无码中字久久三区四区 | 97久久超碰国产网站| 家庭乱伦性爱av| 欧美天天综合| 天天情欲宗合网| 日韩超碰精品综合| 免费看毛片操穴| 久久成人国产| 青青青青青手机视频| 激情四射熟女丝袜| 激情欧美日韩女同久久| 久久99亚洲精品久久99果| 国产一区二区三区视频在线看| JuliaAnn丝袜熟女系列| 欧美伦乱| 超碰 国产熟女精品一区| 欧美A√综合网| 午夜男人天堂| 夜夜肏2021| 999岛国大片| 激情国产乱伦Av| 一个国产在线综合网站| 亚洲影院365| 欧美日韩资源| 国产后入清纯| 97欧美色| 黑人性欧美| 国产精品久久久久久久久久久久久久久久 | 国产极品精品美女视频| WWW操逼| 啪啪性爱免费视频| 2023天天操夜夜操| 性videos欧美熟妇hdx| 亚洲国产精品无码AV久久| 友优传媒精品在线一区二区| 午夜精品久久久久久久第一页按摩| 少妇久久久免费| 后入日本1234| 蜜臀99久久精品| 我想要啊 啊 啊| 日日日日做夜夜夜夜做无码97| 豆1无夜无码| 91精品久久久久久久久久| 亚洲男人天堂网久久| 97干在线| 亚洲春色激情小说| 9/A片| 夜夜爽爽爽| 日本欧美韩国日产片片在线看免| 狠狠 91| 欧美三级一级| 丝袜视频一区二区在线播放国产中文 | 国产久久一区二区| 久久熟女久| 一本色道久久综合狠狠操| 96精品久久久| 欧美一二三| 测评在线观看AV| 国产精品不卡一区二区电影| 亚洲色图尤物视频| 操逼网站地址| 91精品伊人久久久大香线蕉91| 天天色综合天天操| 偷窥自拍亚洲色图| 亚州中文字幕超碰97| 亚洲欧洲色情高清| 色天堂综合| 天综合网欧美| 久久αⅴ| 99这里只有精品国产| 国产精品婬乱一级毛片彝族| 亚洲五月丁香花狠狠干一区二区三区 | 亚洲欧美自拍偷拍| 中文字幕永久在线| 九九玖玖精品| 加勒比久久av| 色综合国产在线观看| 草草影院日本第一页| 国产又大又硬又长又粗| 色五月激情网| 日本91白丝| 人妻爽爽啪视频| 99精品久久久久久久婷婷蜜桃| 亚洲不卡AV在线| 97精品国产手机| 熟妇人妻丰满久久久久久久无码 | 黄色不卡视频| 久久精品无码专区| 3d成人精品一区二区| 久久99人妖视频国产| 色精品极品| 久久9精品网站| 91久久久亚洲| 麻豆这里只有精品| 动漫av中文| 亚洲综合91| 欧美日韩国产色图在线| 日本A级视频| 超碰97极品9| av强奸乱轮| 伊人久久大香大香线蕉中文 | 丁香九月激情| 男人成人黄色视频在线观看免费下载| 九九综合九九综合| 六月丁香婷| 久久华人网| 中文字幕,人妻,日韩| 国内91熟女人妻丝袜天天精品视频在线| 精品一区二区三区最新| 天天性射网| 无码操逼网| 十八禁视频网站| 亚洲综合九| 91大神精品长腿在线观看网站| 99热这里都是精品| 免费视频观看60秒| 乱欲一区二区| 91AV天美在线视频| 日韩免费在线视频观看| 伊人久久婷婷| 操久久久久| 国产日韩欧美亚洲精品95 | 伦伦成年午夜免费视频| 综合网久久| 亚洲国产精品V?在线播放| 亚洲情色电影网| 国产91专区| 极品综合| 女同性恋一区二区三区精品视频| 超清中文乱码字幕| 精品少妇后入一区二区三区四区人妻巨乳| 91色插| 91美女丝袜诱惑视频| 超碰人人干天天射| 性爱久久| 国内精品999| 亚洲国产精品久久AV| 亚洲天堂中文字幕无码男同| 久久国产乱子伦精品免费女,网站| 色色99| 日本色日夜干| 婷婷综合网站| 自拍偷拍 日韩欧美| 在线 亚洲 网爆 自拍| 欧美一级黄色免费专区| 日韩情色AV| 亚州免费啪啪视频| 国产风韵犹存熟妇三区| 99久久网站| 日韩性色| 亚洲AO在线| 国产野战露脸在线播放| 91久久伊人婷婷青青草| 韩日性爱av| 久草精品一区| 深爱五月婷婷| 欧美后入| 91强在线播放| 狠狠操狠狠插| 久久性爱视频免费看| 1204av韩国| 国语av最新自产拍在线观看| 欧日韩一二三f区| 欧美超碰9798| 韩国成人精品久久久免费看| 天天综合,91入口| 东京太热久久久| 日韩性爱1级片视频| 精品一区二区久久| 欧美1727免费观看视频| 国产精品蜜臀久久久久无码AV| 中文字幕人乱码中文字的预防方法 | 亚洲国产一区二区三区四区国产| 一区二区三| 欧美日韩亚洲天堂网| 国产亚洲国产超碰| 精品久| 亚洲国产丝袜在线观看| 920日本午夜免费| 久久久久亚洲精品| 大香蕉乱伦视频网| 中文精品一区二去| 久草看看看| 玖玖爱一区在线| 开心激情婷婷| 国产亚洲日韩在线三区黑人| 欧美爱国产综合、| 97自拍一区| 亚洲天堂电影精品一区| 成人性爱视频在线看| 大香蕉伊人75| 国产欧洲精品亚洲午夜拍精品| 亚洲天堂人妻一区二区| 久久一级无码精品毛片6| 97日韩欧美| 欧美黑人日韩少妇色情| 国产美女激情| 99热最新| 午夜久久无码1000合集| 91亚洲欧洲| 美女黑人91神马| 91女神在线视频| 国产成人综合网| 亚洲精品国产熟女久久久久久| 日本天天干天天操一区| 九色 蝌蚪 熟女自| 91熟女综合| 天天综合日韩网| 久久久久免费看少妇A片特黄| 91欧美网| aV中文麻| 蜜臀va69| 男人天堂最新手机版在线青青草| 亚洲成人精品久久久| 色综合91| 超91综合网| 色情综合网| 中文字幕狠狠玩| 精品久久久高清无码| 97超碰中文在线| 一区二区三区高清 | 九九久久一区二区伦理| 青娱乐亚洲自拍| 国产精品久久久久久高清无码免费看 | 色欲无码人妻日韩欧美精品| 黄页av| 午夜欧美精品久久久| 人妻夜爽夜夜爽| 中文字幕熟女人妻丝袜丝| 夜夜免费视频| 亚洲天堂久| 蜜桃臀一区二区三区久久| 97精品97久久| 日本精品九九九| 久久亚洲熟妇在线视频| 成人热久久精品| 亚洲妇色| 久久人妇| 婷婷中文网| 欧美一级A片在线看视频性色| 天天草天天干天天日| 亚洲性爱无码乱伦av| 青娱乐久久艹| 91久久久久久久| 操91| 亚洲精品一区二区三区新线路| 99久久无色码| 98精品国产乱码久久久久久| 嗯嗯啊啊啊好舒服| 精品妇女一区二区三区| 亚洲精品一区二区三区新线路| 日韩av三四区| 亚洲自拍一区夜夜操| 久久草视频污视频| 后入福利| 夜夜精品视频| 五月丁香六月综合缴清无码| 日韩亚洲精品一区二区| 中文字幕aⅴ在线视频| 自偷自拍的亚洲视频| 婷婷久热| 亚洲成人一二三区| 蜜屁Av| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 男人天堂久久日韩| 麻豆AV96熟妇人妻| 国产精品色约约| 天天综合色图| 国产视频一区二区三区在线免费观看| 亚洲欧洲自拍图片专区满春格| 亚洲国产美女久久久久| av无码精品久久久久| 六月婷婷综合| 伦在线97| 日韩欧美女求操每天更新| 精品人妻一区二区三区四区石在线 | 日韩三级久久久| 国产青青美女玩逼视频| 97在线公开视频| 91女日逼| 三级特黄60分钟播放| 日本黄 R色 成 人网站| 亚洲 图片 欧美 色图| 伊人午夜福利视频| 亚洲性高潮| 亚欧无码线免费观看视频| 亚洲最大AV网| 精品射1999| 超碰偷拍| 成人一道本免费视频| 国产精品成人在线| 久久久久亚洲精品| 香蕉视频精品亚洲一区二区三区在线播| 久久久久久久极品香蕉视频| 偷拍色图| 狠狠色噜噜狠狠狠狠2018| 大香蕉强奸乱伦| 人妻加勒比东京热| 日韩丨制服丨中文|在线| 欧美一级在线观看成人| 国产动漫操逼视频| 天天日天天操VV| 少妇久久久久久久久| 玖玖爱免费观看视频| 夜夜操av亚洲一区二区| 人妻第一页| 亚洲国产成人精品无码专区| 久久精品国产99国产精品亚洲| 92久久| 日韩乱插| 亚洲十八禁止| 热99这里有精品综合久久 | 伊人精品国产| 色y情视频免费看| http://qxhbdz.com| 日韩欧美天堂| 色伊人91| 一区二区视频你懂的| 日本性感人妻91| 操穴国产| 黄色无码高清黄色无码网站| 六六久久日韩不卡| 久热伊人| 国产麻豆福利av在线播放| 牛牛久久国产精品视频一二三| 国产精品第一区第一页| 色鬼在线综合| 草草草视频在线免费看| 婷婷久久大香蕉| 色五月激情AV在线| 激情国产乱伦Av| 2019午夜福利视频| 呦呦影院| 99www.bibizy香蕉资源国产一区二区三区高清 | 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 亚洲日本男人天堂网| 97爱| 中文字幕一区av| 狠狠夜色午夜久久综合在线| 精品无码秘 人妻一区二区| www.99在线| 中文字幕乱妇免费视频| 亚洲五月丁香花狠狠干一区二区三区| 欧美 色 亚洲| 蜜臀久久99精品久久久老,,| 亚洲97在线观看| 97免费在线视频在线观看| 在线97视频| 啊v视频在线观看| 狼人狠干| 色女99一级片在线观看| 久久二| 99热这里是精品| 亚洲加勒比久久日本道| 欧美色图中文字幕| 亚洲精品一二区| 欲色啪| 色5月婷婷| 久久99干一本高清| 成年女人一区| 人人操人人摸人人看人人插| 九9热伊人| 日本国产高清色www视频在线| 性色av一区二区| 国产女生在线| 色悠久| 国产精品高潮久久AV| 亚洲成人无码影院| 中文字幕视频二区| 大香蕉欧美伊| 国产精品制服丝袜清纯唯美| 激情婷婷黑人91| 中文字幕一区av| 精品国产一区探花在线观看| 人人搡人人肉久久精品| 动漫爆乳3D奶水一区在线观看| 九久精品| 60秒免费小视频| 欧美精品999| 欧美色www亚洲国产阿娇要播| 久久综合av| 午夜免费视频1000| 97碰| 国产乱码精品久久久久久| 91GD.COM| 91久久免费视频互動交流| 蜜桃丰满熟妇av无码区不卡| 骚逼高潮久久精品| 久久久久久99AV无码免费网站| 亚洲日本天堂| 亚洲综合码| www狠狠| 99久久久无码精品国产人| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 人看人人摸人人操| 内射夫妻三片| 三及片网站| 欧美亚洲国产日本在线,久久精品国产| 久久五月综合| 欧美大香蕉专区网| 久久综合精品一区二区三区| 岛国福利在线精品播放| 国产精品熟女一区二区三区| 国产成人啪一区二区| 色噜噜人妻丝袜AV资源| 激情自拍 校园春色| 色欲三区| 色噜噜国产精品视频一区二区| 欧美少妇性乱| 乱日视频| 亚洲各类熟们中文字幕| 亚洲交性| 人妻丰满熟妇av无码区蜜桃| 999 久久久| 中文字幕视频2区| 狠狠狠狠狠干| 色婷婷九月天天综合| 亚洲āv网址在线观看| 欧美日韩美女精品久草一区二区三区 | 啊啊啊不要好疼视频| 中日高清无码操逼视频| 日韩一级特黄av毛片| 正在播放国产精品一区| 男啪女色黄无遮挡免费观看| 久久久久99精品成人片蜜臀| 亚州一区二区| 亚洲第一综合| 国产一线二线三线av| 午夜a成v人电影| 九九视品黄色| 男女激烈网站最新| 亚洲日韩一区电影| 午夜美女福利视频| 夜夜 中文视频rt| 婷婷六月色| 国内毛片欧美香蕉精品| 长久操视频| 天天操女人| 强奸乱伦Av网| 女性91网站| 物业黑人 AV一区| 一区久久久二区| 国产福利av精彩对白| 91亚洲人| 天天流夜夜操| 人妻少妇被猛烈进入中| 99久久99九九99九九九| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 射丝袜大香蕉| 少妇无码太爽| 福利在线黄片| 超碰97人人cao| 一二三四区电影| 欧美激情综合色综合啪啪五月| 天天色黄色影院天天操| 另类图片天天影视| 超碰欧美97资源| 午夜成人福利影视| 美日韩成人| 上海一级黄片| 久久久久久九九九| 久久华人网| 美国久久一二三四| 婷婷五月天激情小说| 久久东京伊人一本到鬼色| 欧美色狠| 九九九九九九九九九国产精品| 91老熟女逼| 天天干天天干天天| 强奸a片网| AAAAAAAAA黄片| 国产偷人伦激情在线观看| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 91色鬼| 天天爽爽爽爽| 99综合网| 色婷久久| 被体育老师抱着c到高潮| 国产欧美日韩一区二区三区| 96精品久久久久久久久久| 干B网| 9999久久久久| 天堂涩涩| 天堂综合| 99热日| 国产诱惑| 人人摸人人干| 国产18精品亚洲精品| 2019精品国产无码成人| 欧美v亚洲v综合v国产v妖精| 99无码狠狠久久| 97视频免费在线观看| 少妇久久久久久久久| 91观看 国产白丝| 欧美性夜| 大色网久久| 加勒比久久av| 91久热| 精品人妻一区二区三区视频在线| 一卡二卡在线播放| 久久久啊啊啊| 精品人妻一区二区三区夜夜| 成人一区二区三区四区| 久久欧美1卡2卡3| 一区二区三区国产精产| 精品久久視頻在线| 91美女视屏| 久久男人的天堂国产| 久久九七| 天综合网欧美| 欧美伦乱| 亚洲熟女人妻中文字幕一区二区 | 欧美日韩啪啪电影| 亚洲āv网址在线观看| 青娱乐淫乱1314| 亚川综合视频| 亚洲国产成人精品无码专区| 久久精品国产亚洲AV成人直播| 国产成人自拍视频在线| 狠狠久久亚洲欧美专区| 日韩人妻少妇中文字幕| 射丝袜高跟鞋99| 很黄很污的免费网站| 精品久久久九九九孕妇| 国产少妇肉丝在线观看| 性色avv| 嗯嗯嗯啊啊啊干死我吧| 日日夜夜草草草| 无码人妻毛片丰满熟妇精品区| 日韩无码人妻中字久久三区四区| 天天综合91| 操逼视频亚洲| 丰满人妻av一区二区三区| 91狠| 亚洲精品国产av天美传媒| 亚洲A色| 少妇人妻在线| 国产精品一区二区a| 国语国产操逼伊人AV网| 中文字幕日韩综合| 国产第二页| 一级免费精品| 男人女人18禁片免费看网站| 秋霞曰韩R级| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 男人综合网| 欧美性爱第一页久久| 1769精品一区二区三区| 成年男人的天堂| 精品成人女人久久| 欧美色狠| 中文字幕一区二区三区视频播放| 熟女一区二区| 欧美A√综合网| 青青草一区二区高清无码视频| 97超碰碰| 涩五月婷婷| 天天操天天看| 乱伦一二三| 亚洲色图殴美色图激情乱伦| 久久久久国产亚洲一区欧美色图日韩| 自拍盗摄一区| 美女网站91| 午夜国产成人福利视频| 操逼精品视频| 最新亚洲黄色免费电影| 婷婷久草| 亚洲。天堂。日本在线观看| 国产精品分类在线观看| 欧美很很操视频| 伦理弟一页| 国产日韩无码一区二区三区久久区| 婷婷九月| 97碰碰日本乱偷人妻中文的| 91第一页| 一区二区三区机械有限公司| 日本顶级天天操狠狠操夜夜操中文字幕| 亚洲一级黄色毛片| 一道本久久棕合爱| 午夜亚洲| 99国产精品视频尤物| 欧美色图亚洲特色| 色在线视频导航| 欧美|91色综合| 欧美在线啊啊| 亚洲第一综合| 久久久久久免费电影| 一级婬片120分钟试看| 爱射综合| 精品日日人妻| 97精品综合| 国产热av| 国产99 中文字幕日韩小视频| 亚洲精品黑丝| 久久男女激情视频网站| 试看福利| a片自拍直播视频| 超碰97网址| 蜜乳成人AV| 97欧美色资源| 伊人网免费视频| 亚洲,欧美,春色,另类| 亚洲成人贴图| 99爱久久视频频| 国产精品久久久久久久AV大片| 性站 | 国产路线专区| 夜夜夜久久| 影音先锋每日最新资源在线观看 | 亚洲欧美成人网站AAA| 操香逼| 久草免费福利在线播放| 十八禁一区二区无码观看| 五月综合婷婷久久网站| 老女人碰碰在线碰碰视频| 五月天色图| 91内射| 97亚洲欧美日韩| 国产亚洲色婷婷久久99精品91葵花宝典| 亚洲脚交| 天无日色综合| 国产精品久久久久久亚洲色欲| 免费网色网站| 天天夜躁日日躁狠狠2002| 欧洲精品久久| 狠狠综合| 亚洲欧美色图小说| 欧美婷婷久久| 亚瑟国产精品久久无码| 国产精品动态一区二区三区四四| 色婷婷狠狠18禁| 国产精品免费久久久久久久久久| 激情五月天婷婷| 免费αV在线视频| 久久激情视频| 色五月大香蕉| www.亚洲黄色| 天天操天天日天天干| 久久久久免费少妇| 翔田千里AⅤHD无码| 欧美日韩亚洲少妇寂寞影院正在播放| av天堂5| 日本αv| 91痴汉| 精品乱子一区二区三区99| 中国一级操逼视频| 久草线上视频免费看| 粉嫩av在线一区二区| 久久超碰97| 蜜臀无码一区二区| 久久久啊啊| 午夜男人一级A片7777| 天天伊人| 本道在线| 69人妻精品丰满熟女区| 国产成人在线观看综合| 欧美性爱第一页久久| 日韩精品亚洲一二三| 四季av一区二区凹凸精品小说| 综合天天网| 台湾大香蕉99热| 欧美成人精品一区二区三区| 91干熟女| 天天干天天狼在线视频| 操B在线观看| 神马久久久久久伦理片| 亚洲综合999| 婷婷激情四射| 国产精品一区二区三区免费视频| 激情另类激情| 亚洲中文字幕一区二区| 久久久99999久网站| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 欧美色图另类图片| 啊啊啊轻点在线观看| 日本中文字幕一区| 99re69综合| 牛牛久久国产精品视频一二三| 蜜桃精品视频一区| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 天天影视综合网欧美精品| 人妻久久久久久久久久久久久久久| 久久99综合| 亚殴在线| 啊啊啊啊啊好大好舒服想要| 高清肉丝中文无码| 天天躁狠狠躁av| 麻豆 亚洲 97| 亚洲综合草草| …亚洲黄色厕厕女女在线播…| 97碰| 日本三级A片网站com| 久久久久久电影| 强奸乱伦大香蕉网| 五月综合色| 久久嫩草国产成人一区|