通過URI Scheme實現從Web網頁上打開本地C++應用程序(以騰訊會議為例,附完整實現源碼)

目錄

1、需求描述

2、選擇URI Scheme實現

3、何為URI Scheme?

4、將自定義的URL Scheme信息寫入注冊表的C++源碼實現

5、如何實現最開始的3種需求

6、后續需要考慮的細節問題


? ? ? ?之前陸續收到一些從Web頁面上啟動我們C++客戶端軟件的需求,希望我們能提供一些技術上的支持與協助,支持從Web網頁上將我們的C++客戶端軟件啟動起來。于是我大概地研究了相關的實現方法,下面把研究的過程與結果在此做一個分享,希望能給大家提供一個借鑒或參考。

C++軟件異常排查從入門到精通系列教程(核心精品專欄,訂閱量已達10000多個,歡迎訂閱,持續更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++實戰專欄(重點專欄,專欄文章已更新500多篇,訂閱量已達8000多個,歡迎訂閱,持續更新中...)https://blog.csdn.net/chenlycly/article/details/140824370C++ 軟件開發從入門到實戰(重點專欄,專欄文章已更新300多篇,歡迎訂閱,持續更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能開發匯總(專欄文章列表,歡迎訂閱,持續更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++軟件分析工具從入門到精通案例集錦(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/article/details/131405795開源組件及數據庫技術(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/category_12458859.html網絡編程與網絡問題分享(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/category_2276111.html

1、需求描述

? ? ? ?最近多個第三方開發廠商為了快速集成我們的軟件及系統(把我們的軟件系統作為子系統,融入到他們的大型業務系統中),不想基于我們軟件SDK做費時費力的二次開發,而是直接從Web網頁上啟動我們客戶端軟件。簡單地歸納了一下,類似的需求可以分以下幾類:

1)僅僅是從Web網頁上將C++客戶端軟件啟動起來,即將軟件調起來就行了,沒有后續自動操作。用戶根據自己的需要,手動操作我們的軟件。

2)從Web網頁上將C++客戶端軟件啟動起來,并給軟件傳遞服務器地址、用戶名和密碼,讓軟件自動發起登陸,登錄成功后顯示登錄后的界面。

3)從Web網頁上將C++客戶端軟件啟動起來,并且啟動時傳遞一些信息,讓軟件執行指定的一些操作。比如給軟件傳遞服務器地址、用戶名和密碼等信息,讓軟件自動發起登錄,并加入到指定的會議中。

? ? ? ?其實上述需求可以簡單的歸結為,將C++客戶端軟件啟動起來,并給C++客戶端軟件傳遞一些命令行參數,C++客戶端軟件解析出參數,執行指定的操作。

? ? ? 以瀏覽器打開騰訊會議的會議鏈接為例,比如在IM軟件中分享的騰訊會議的會議鏈接如下所示:

點擊上面的會議鏈接,系統用系統中安裝的瀏覽器打開鏈接(或者手動將上述會議鏈接拷貝到瀏覽器中打開),如下所示:

點擊加入會議按鈕,會彈出是否要打開本地安裝的騰訊會議程序的提示框:

?點擊打開騰訊會議,將本地安裝的騰訊會議啟動起來,并自動加入到指定的會議中:

2、選擇URI Scheme實現

? ? ? ?如果是在C++程序中啟動一個C++軟件,會比較簡單,只要獲取一下目標軟件的安裝路徑(可以從注冊表中讀取,安裝程序時會將軟件的安裝路徑寫到注冊表中),就能直接通過軟件的全路徑,直接將軟件啟動起來了。

? ? ? ?現在越來越多的系統都轉向B/S架構,用戶可以隨處隨地訪問到系統中去,只要有網絡有電腦就行了,不用再安裝各種客戶端軟件了。就像我們上面提到的一些客戶一樣,因為某些業務場景的需要,可能需要從Web網頁上啟動系統中安裝的基于C/S架構的客戶端軟件。

? ? ? ?Web網頁一般都是在瀏覽器中打開的,出于安全的原因,Web瀏覽器既不能直接讀寫注冊表,即無法通過訪問注冊表獲取要啟動軟件的安裝路徑,所以無法像C++程序那樣直接啟動二進制文件,所以在Web網頁中想啟動本地的應用程序似乎遇到了問題。其實這并不是問題,我們使用URI Scheme技術與規范就能實現這樣的需求

3、何為URI Scheme?

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_13,color_FFFFFF,t_70,g_se,x_16

? ? ? ?URI,全稱是Uniform Resource Identifier,統一資源標志符。在Web開發領域,其表示的是Web上每一種可用的資源,如HTML文檔、圖片、視頻等。URI Scheme,我們稱之為URI方案,是一種技術規范,其中的URI是個更寬泛的概念,它可以是一個本地的文件,也可以是一個網絡上的視頻。

? ? ? ?從Web網頁中啟動本地應用程序的URI Scheme規范中,需要將本地應用程序的信息通過寫注冊表的方式注冊到系統中,然后在網頁中使用“SchemeName://”就可以只在啟動本地程序了。具體的做法是,在注冊表的HKEY_CLASSES_ROOT下創建一個自定義的SchemeName注冊表節點,然后再在該節點下創建多個節點,并在給相關節點設置注冊表鍵值。

? ? ? ?以QQ內嵌的QQGame為例,添加注冊表信息的步驟如下:

1)在HKEY_CLASSES_ROOT下創建QQGameProtocol節點

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

? ? ? QQGameProtocol就是對應的Scheme方案名稱,也是Web頁面上啟動對應程序的URL的前綴名稱,即QQGameProtocol://。然后給該節點添加一個URL Protocol名稱的鍵值,將其Value設置為本地應用程序的完整路徑。對于當前的QQGameProtocol,就是C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe,如上圖所示。

2)在QQGameProtocol根節點下創建DefaultIcon節點

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

? ? ? ?給DefaultIcon節點設置默認的字符串鍵值(REG_SZ類型),其Value的格式為“應用程
序全路徑,圖標索引”的形式,該鍵值是用來指定該URI方案使用的圖標。本例中的Value
為:C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe,1,如上圖所示。

3)在QQGameProtocol下創建shell節點

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

? ? ? ?先在QQGameProtocol下創建shell節點,然后在shell節點下創建open節點,然后在open節點創建command節點。shell節點和open節點不需要設置鍵值,command節點需要設置鍵值,其鍵值用來指定啟動目標應用程序時是否給目標程序傳遞命令行參數。

? ? ? ?一般只需要設置傳遞一個參數即可,比如當前Scheme下的"C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe" "%1"。如果要傳遞多個參數,可以自定義一個組合格式,命令行只用一個參數即可。比如我們要給目標程序傳遞服務器地址、用戶名和密碼,可以采用這樣的組合格式:

#serveraddr=192.168.72.135#username=admin1#password=123456

即將要傳遞的多個參數按指定的格式組合起來生成一個命令行字符串參數即可。

? ? ? ?當在Web頁面上點擊“SchemeName://”鏈接時,就會到系統注冊表的HKEY_CLASSES_ROOT節點下查找SchemeName節點項,找到后取出目標應用程序的全路徑,并查找傳遞的命令行參數個數,這樣就能把本地的目標應用程序啟動起來了。

? ? ? ?如果要給目標程序傳遞參數,則使用“SchemeName://參數”的形式。經測試發現,如果在command節點中設置了%1傳遞參數的標識,則Web網頁中設置的URL必須要帶參數,即“SchemeName://參數”。如果使用不帶參數的URL:“SchemeName://”,則無法啟動目標程序。

? ? ? ?那如何既要支持不傳參數啟動,也要支持傳參數啟動呢?難道要在注冊表中創建兩個不同的SchemeName節點?其實不用這么麻煩,使用一個帶參數的SchemeName節點就夠了,對于直接啟動目標程序不帶啟動參數的,也可以攜帶一個標識參數,在程序中約定不傳參數的標識符,比如noparam,當程序中解析出noparam,則表示是不帶參數啟動的,直接啟動程序即可,不用做后續的操作。


?? ? ? ?在這里,給大家重點推薦一下我的幾個熱門暢銷專欄,歡迎訂閱:(博客主頁還有其他專欄,可以去查看)

專欄1:【C++軟件異常與異常排查從入門到精通系列教程】該精品技術專欄的訂閱量已達到10000多個,專欄中包含大量項目實戰分析案例,有很強的實戰參考價值,廣受好評!專欄文章持續更新中,已經更新到200篇以上!歡迎訂閱!)

C++軟件調試與異常排查從入門到精通系列文章匯總https://blog.csdn.net/chenlycly/article/details/125529931

本專欄根據多年C++軟件異常排查的項目實踐,系統地總結了引發C++軟件異常的常見原因以及排查C++軟件異常的常用思路與方法詳細講述了C++軟件的調試方法與手段詳細介紹分析C++軟件問題的常用分析工具,以圖文并茂的方式給出具體的項目問題實戰分析實例(詳細講述分析排查過程,很有實戰參考價值),帶領大家逐步掌握C++軟件調試與異常排查的相關技術,適合基礎進階和想做技術提升的相關C++開發人員!

考察一個開發人員的水平,一是看其編碼及設計能力,二是要看其軟件調試能力!所以軟件調試能力(排查軟件異常的能力)很重要,必須重視起來!能解決一般人解決不了的問題,既能提升個人能力及價值,也能體現對團隊及公司的貢獻!

專欄中的文章都是通過項目實戰總結出來的,包含大量項目問題實戰分析案例,有很強的實戰參考價值!專欄文章還在持續更新中,預計文章篇數能更新到200篇以上!

專欄2:【C/C++實戰進階】(該專欄涵蓋了C++多方面的內容,是當前重點打造的專欄,訂閱量已達8000多個,專欄文章已經更新到500多篇,持續更新中...)

C/C++實戰進階(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/category_11931267.html

以多年的開發實戰為基礎,總結并講解一些的C/C++基礎與項目實戰進階內容,以圖文并茂的方式對相關知識點進行詳細地展開與闡述!專欄涉及了C/C++領域多個方面的內容,包括C++基礎及編程要點(模版泛型編程、STL容器及算法函數的使用等)、數據結構與算法C++11及以上新特性(開源代碼中可能會用到很多新特性(比如WebRTC開源庫),日常編碼中也會用到部分新特性,面試時也會頻繁地涉及到,學習新特性很有必要)、常用C++開源庫的介紹與使用(比如SQLite、libcurl、libwebsockets、libevent、jsoncpp/RapidJson、Redis、RabbitMQ、MongoDB、MQTT、ZooKeeper、OpenCV、FFmpeg、SDL、GStreamer、Live555、ReactOS等)、代碼分享(調用系統API、使用開源庫)、常用編程技術(動態庫、多線程、多進程、數據庫及網絡編程等)、軟件UI編程(Win32/duilib/QT/MFC)、C++軟件調試技術(引發C++軟件異常的常見原因分析與總結、排查C++軟件異常的手段與方法、分析C++軟件異常的基礎知識、使用常用軟件分析工具分析C++軟件問題、多個項目實戰問題分析案例分享等)、設計模式(單例模式、工廠模式、觀察者模式、狀態模式等)、網絡基礎知識與網絡問題分析進階內容(實戰問題分析實例分享)等。本專欄的內容都是建立在項目實踐的基礎上,來源于項目實戰,服務于項目實戰,很有實戰參考價值!

專欄3:【分析C++軟件問題的實用軟件與高效工具實戰案例集錦】

C++常用軟件分析工具從入門到精通案例集錦匯總(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++軟件輔助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro以及內存泄漏檢測工具等,本專欄詳細介紹如何使用這些工具去巧妙地分析和解決日常工作中遇到的問題,很有實戰參考價值!

專欄4:【VC++常用功能代碼封裝】

VC++常用功能開發匯總(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/article/details/124272585

將10多年C++開發實踐中常用的功能,以高質量的代碼展現出來。這些常用的高質量規范代碼,可以直接拿到項目中使用,能有效地解決軟件開發過程中遇到的問題。

專欄5:【C/C++軟件開發從入門到實戰】(本專欄涵蓋了C++多方面的內容,是當前重點打造的專欄,專欄文章已經更新到300多篇,持續更新中!歡迎訂閱!)?

C++ 軟件開發從入門到精通(專欄文章,持續更新中...)https://blog.csdn.net/chenlycly/category_12695902.html

根據多年C++軟件開發實踐,詳細地總結了C/C++軟件開發相關技術實現細節,分享了大量的實戰案例,很有實戰參考價值。


4、將自定義的URL Scheme信息寫入注冊表的C++源碼實現

? ? ? ?下面給出將自定義的URL Scheme信息寫入注冊表的C++源碼實現:

BOOL WriteURISchemaReg()
{// exe程序的完整路徑CString strExePath = m_strInstallPath + _T("xyzlink.exe");// URI Scheme名稱CString strProtocolName = _T("XyzlinkProtocol");HKEY hRootKey = NULL;DWORD dwKeyValue = 0;DWORD dwDisposition = 0;UCHAR szBuf[MAX_PATH] = { 0 };// 1、在HKEY_CLASSES_ROOT下創建URI Schema相關注冊表的根節點RootNodelong lRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, ProtocalNodeName, 0, NULL, 0,KEY_ALL_ACCESS, NULL, &hRootKey, &dwDisposition);if (lRet != ERROR_SUCCESS){return FALSE;}// 給根節點RootNode設置值1lRet = ::RegSetValueEx(hRootKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strProtocolName,strProtocolName.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 給根節點RootNode設置值2CString strKey = _T("URL Protocol");lRet = RegSetValueEx(hRootKey, strKey.GetBuffer(0), 0, REG_SZ, (LPBYTE)(LPCTSTR)strExePath,strExePath.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 2、在根節點RootNode下創建DefaultIcon節點strKey = _T("DefaultIcon");HKEY hDefaultIconKey = NULL;lRet = RegCreateKeyEx(hRootKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hDefaultIconKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 給RootNode\DefaultIcon節點設置值CString strExePathPlus = strExePath + _T(",1");lRet = RegSetValueEx(hDefaultIconKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strExePathPlus,strExePathPlus.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 3、在RootNode\DefaultIcon節點下創建子節點shellstrKey = _T("shell");HKEY hShellKey = NULL;lRet = RegCreateKeyEx(hDefaultIconKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hShellKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 4、在RootNode\DefaultIcon\shell節點下創建子節點openstrKey = _T("open");HKEY hOpenKey = NULL;lRet = RegCreateKeyEx(hShellKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hOpenKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 5、在RootNode\DefaultIcon\shell\open節點下創建子節點commandstrKey = _T("command");HKEY hCommandKey = NULL;lRet = RegCreateKeyEx(hOpenKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hCommandKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 給command節點設置值(命令行參數)CString strCmdParam;strCmdParam.Format(_T("\"%s\" \"%%1\""), strExePath);lRet = RegSetValueEx(hCommandKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strCmdParam,strCmdParam.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hCommandKey);RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}RegCloseKey(hCommandKey);RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return TRUE;
}

5、如何實現最開始的3種需求

? ? ? ?搞清楚了使用URI Scheme規范實現從Web頁面中啟動本地應用程序的方法,下面我們再回到最開始提出的3個需求,看看如何去實現。

? ? ? ?第一種需求不需要傳遞參數,后面兩種需求則需要傳遞參數,我們使用一個帶參數傳遞的Scheme節點即可。我們可以定義一個啟動type類型標識launchtype,對于直接啟動的,type為noparam。對于啟動后發起自動登錄的,type為autologin;對于啟動后需要執行具體操作的,可以根據具體的業務,定義具體的type類型,這樣更靈活。

? ? ? ?對于目標應用程序,則可以根據不同的type類型,解析對應的參數數據,并對參數的合法性進行校驗。

? ? ? ?下面把Web網頁的測試代碼給出來,保存成.html文件,用瀏覽器打開即可:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Start exe demo</title>
</head>
<body>
<a href="SchemeName://">打開目標程序</a> 
</body >
</html >

6、后續需要考慮的細節問題

? ? ? ?上面大概說了一下問題的解決辦法和思路,其實還有很多細節需要去考慮。比如下面的幾種場景:

1)程序可能沒有安裝

? ? ? ?如果目標應用程序沒有安裝,肯定是啟動不起來的,是不是要檢測啟動失敗的原因,然后自動跳轉到安裝程序的下載頁面。

2)僅將目標程序啟動起來,但目標程序已經運行

? ? ? ?一般情況下,很多程序都是單實例運行的,即只允許運行一個實例。假定目標程序是單實例運行的,點擊Web頁面中的啟動程序的鏈接時,已經有個進程在運行了,目標程序中要彈出程序已經運行的提示,并將已經啟動的程序拉到前端顯示。

3)啟動程序后需要有后續操作,但目標程序已經運行

? ? ? ?啟動程序后需要有后續操作,比如自動發起登錄,但此時目標應用程序已經運行。如果已啟動的進程還沒登錄,是要自動發起登錄?還是擱置不管?如果已啟動的進程已經登錄,則提示已經啟動,并將已啟動的主窗口拉到最前顯示。如果目標程序已經啟動且已經登錄成功,則需要將命令行參數發給已啟動的進程,讓該進程執行要執行的操作,比如加入會議。

PS. 微軟官方說明連接:

Registering an Application to a URI Scheme

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98504.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習02——模型評估與選擇(過擬合與欠擬合、K折交叉驗證、均方誤差、混淆矩陣)

上一章&#xff1a;機器學習01——機器學習概述 下一章&#xff1a;機器學習03——線性模型 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、經驗誤差與過擬合&#xff08;一&a…

基于 Django 與 Bootstrap 構建的現代化設備管理平臺

整體步驟概覽 創建項目和應用設計模型&#xff08;Model&#xff09; - 定義設備的數據結構配置用戶認證&#xff08;Auth&#xff09; - 使用 Django 自帶的強大用戶系統創建視圖&#xff08;View&#xff09; - 處理業務邏輯&#xff1a;登錄、列表、增刪改查編寫模板&#x…

微軟依舊穩定發揮,Windows 最新更新性能「開倒車」

微軟在前不久為Release Preview測試用戶推送了最新Windows11 25H2版本。按照慣例&#xff0c;正式版將于9月或者10月與咱們見面。雖然看起來是個跨版本的大更新&#xff0c;但是更新方式將服務堆棧更新&#xff08;SSU&#xff09;與最新累積更新&#xff08;LCU&#xff09;。…

一手實測,文心x1.1的升級很驚喜啊

一手實測&#xff0c;文心x1.1的升級很驚喜啊 前言 月9日&#xff0c;在 WAVE SUMMIT深度學習開發者大會上 百度發布了一個新的思考模型文心x1.1&#xff1a; X1 Turbo 升級為 X1.1 了。 文心4.5 Turbo 和 X1 Turbo 是2025年4月25日發布的&#xff0c;距今已經半年過去了&…

Flask 核心基礎:從 路由裝飾器 到 __name__ 變量 的底層邏輯解析

Flask 核心基礎&#xff1a;從路由裝飾器到 name 變量的底層邏輯解析 在使用 Flask 開發 Web 應用時&#xff0c;我們總會從 app Flask(__name__) 和 app.route("/") 這兩行代碼開始。看似簡單的語法背后&#xff0c;藏著 Python 裝飾器機制與 Flask 框架設計的核心…

中國AI云市場報告:阿里云份額達35.8%,高于2至4名總和

9月9日&#xff0c;國際權威市場調研機構英富曼&#xff08;Omdia&#xff09;發布《中國AI云市場&#xff0c;1H25》報告&#xff0c;報告顯示&#xff0c;2025年上半年&#xff0c;中國AI云市場規模達223億元&#xff0c;阿里云占比35.8%位列第一&#xff0c;市場份額高于2到…

鴻蒙Next開發指南:UIContext接口解析與全屏拉起元服務實戰

前言在鴻蒙應用開發過程中&#xff0c;我們經常會遇到需要獲取UI上下文實例或者在非UI上下文中調用UI相關方法的場景。隨著HarmonyOS NEXT的不斷發展&#xff0c;UIContext API為我們提供了更加優雅的解決方案。本文將詳細介紹如何使用UIContext中對應的接口獲取與實例綁定的對…

leaflet讀取mvt格式

如圖所示&#xff0c;是全國的數據&#xff0c;截圖是部分數據先安裝&#xff1a;npm install leaflet npm install leaflet.vectorgrid如果是其余的框架直接用就行&#xff1a;import * as L from leaflet; import leaflet.vectorgrid;我用的是angular,所以是ts中聲明&#xf…

OSG中交互(鼠標、鍵盤)處理

OpenSceneGraph (OSG) 中的交互處理,包括鼠標和鍵盤事件。 一、OSG 事件處理體系 OSG 使用一個基于訪問者模式的事件處理體系,核心類包括: osgGA::GUIEventHandler: 所有事件處理器的基類 osgViewer::Viewer: 查看器,管理事件隊列和分發 osgGA::EventQueue: 事件隊列…

微碩雙N-MOS管WST3392在汽車智能氛圍燈系統中的應用

汽車智能氛圍燈系統是現代車輛提升駕乘體驗的重要配置&#xff0c;其多通道LED的精密調光與控制需選用高性能、小體積的功率開關器件。微碩WINSOK的WST3392是一款雙N溝道MOS管&#xff0c;具有30V耐壓、3.7A連續電流和46mΩ的低導通電阻&#xff0c;特別適用于氛圍燈系統中的多…

深入 Kubernetes:從零到生產的工程實踐與原理洞察

&#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1f680; 每一個算法都是我點燃的推進器&#xff0c;每一行代碼都是我航行的星圖。 &#x…

為何三折疊手機只有華為可以?看華為Mate XTs非凡大師就知道

9月4日&#xff0c;華為在深圳舉行華為Mate XTs非凡大師及全場景新品發布會&#xff0c;不同于過往手機發布會對芯片配置只字不提&#xff0c;此次發布會公開展示了華為Mate XTs非凡大師內部芯片配置——麒麟9020芯片&#xff0c;時隔四年&#xff0c;終于在發布會上看到芯片公…

TensorFlow 2.x 核心 API 與模型構建

TensorFlow 2.x 核心 API 與模型構建TensorFlow 是一個強大的開源機器學習庫&#xff0c;尤其在深度學習領域應用廣泛。TensorFlow 2.x 在易用性和效率方面做了大量改進&#xff0c;引入了Keras作為其高級API&#xff0c;使得模型構建和訓練更加直觀和便捷。本文將介紹 TensorF…

TENGJUN防水TYPE-C連接器:工業級防護,認證級可靠,賦能嚴苛場景連接

在工業控制、戶外電子、水下設備等對連接穩定性與防護性要求極致的場景中&#xff0c;TENGJUN防水TYPE-C連接器以“硬核性能全面認證”的雙重優勢&#xff0c;成為關鍵連接環節的信賴之選。從結構設計到認證標準&#xff0c;每一處細節都為應對復雜環境而生&#xff0c;重新定義…

【小呆的隨機振動力學筆記】概率論基礎

文章目錄0. 概率論基礎0.1 概率的初步認知0.2 隨機變量的分布0.3 隨機變量的數字特征0.3.1 隨機變量的期望算子0.3.2 隨機變量的矩0.4 隨機變量的特征函數0.5 高數基礎附錄A 典型分布0. 概率論基礎 \quad\quad在生活中或自然中&#xff0c;處處都存在隨機現象&#xff0c;比如每…

使用海康機器人相機SDK實現基本參數配置(C語言示例)

在機器視覺項目開發中&#xff0c;相機的初始化、參數讀取與設置是最基礎也是最關鍵的環節。本文基于海康機器人&#xff08;Hikrobot&#xff09;提供的MVS SDK&#xff0c;使用C語言實現了一個簡潔的控制程序&#xff0c;完成設備枚舉、連接以及常用參數的獲取與設置。 &…

【IoTDB】時序數據庫選型指南:為何IoTDB成為工業大數據場景的首選?

【作者主頁】Francek Chen 【專欄介紹】???大數據與數據庫應用??? 大數據是規模龐大、類型多樣且增長迅速的數據集合&#xff0c;需特殊技術處理分析以挖掘價值。數據庫作為數據管理的關鍵工具&#xff0c;具備高效存儲、精準查詢與安全維護能力。二者緊密結合&#xff0…

用計算思維“破解”復雜Excel考勤表的自動化之旅

在我們日常工作中&#xff0c;經常會遇到一些看似簡單卻極其繁瑣的任務。手動處理一份結構復雜的Excel考勤表&#xff0c;就是典型的例子。它充滿了合并單元格、不規則的布局和隱藏的格式陷阱。面對這樣的挑戰&#xff0c;我們是選擇“卷起袖子&#xff0c;日復一日地手動復制粘…

PAT 1006 Sign In and Sign Out

1006 Sign In and Sign Out分數 25作者 CHEN, Yue單位 浙江大學At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing ins and outs, yo…

【git】首次clone的使用采用-b指定了分支,還使用了--depth=1 后續在這個基礎上拉取所有的分支代碼方法

要解決當前問題&#xff08;從淺克隆轉換為完整克隆并獲取所有分支&#xff09;&#xff0c;請按照以下步驟操作&#xff1a; 步驟 1&#xff1a;檢查當前遠程地址 首先確認遠程倉庫地址是否正確&#xff1a; git remote -v步驟 2&#xff1a;修改遠程配置以獲取所有分支 默認淺…