typedef函數代碼段解釋以及部分Windows下的系統函數

文章目錄

  • 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)
  • 2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)
  • 3、typedef int (WINAPI* LPSDOLTerminal)();
  • 4、GetProcAddress運行時獲取一個動態鏈接庫(DLL)中導出函數的地址
  • 5、LoadLibraryExA 用于加載指定ANSI的動態鏈接庫文件
  • 6、LoadLibraryExW 用于加載指定Wide寬字符的動態鏈接庫文件
  • 7、LoadLibraryA 用于加載指定ANSI的動態鏈接庫文件
  • 8、LoadLibraryW 用于加載指定Wide寬字符的動態鏈接庫文件
  • 9、LoadLibraryExA和LoadLibraryA以及LoadLibraryExW和LoadLibraryW區別

1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)

C/C++ 中,typedef 用于創建類型別名,它可以讓你為一個已有的數據類型定義一個新的名稱,從而使代碼更加清晰、易讀,也可以簡化類型的聲明和使用。

這段代碼用typedef定義了一個函數指針類型 LPSDOLInitialize,該函數指針指向一個函數,該函數接受一個指向 SDOLAppInfo 結構體的指針作為參數,并返回一個 int 類型的值。

具體來說,typedef 是用于創建類型別名的關鍵字。在這里,它創建了一個名為 LPSDOLInitialize 的新類型,它被定義為一個函數指針類型,該函數指針指向具有特定參數和返回類型的函數。

WINAPI 是一個宏,用于指定函數的調用約定,它在 Windows 平臺上用于標識函數調用的方式和參數傳遞方式。

總結一下,該代碼段定義了一個函數指針類型 LPSDOLInitialize,該指針可以指向一個具有特定參數和返回類型的函數,這個函數接受一個指向 SDOLAppInfo 結構體的指針作為參數,并返回一個 int 類型的值。這種函數指針的定義通常用于在運行時動態加載庫中的函數并進行調用。

用這個函數指針類型 LPSDOLInitialize就可以創建對象: LLPSDOLInitialize m_pfSDOLInitialize;

例如,假設你想要聲明一個函數指針變量來保存指向這樣一個函數的指針,你可以這樣寫:

LPSDOLInitialize pFuncPointer;

這使得代碼更加簡潔,而不是每次都寫完整的函數指針類型。typedef 在這里的作用就是為了創建一個新的名稱,使代碼更具可讀性。

	//函數指針對象if (m_pfSDOLInitialize(&appinfo) != SDOL_ERRORCODE_OK){return false;}

另外,typedef 還可以用于創建其他類型別名,如結構體、枚舉等,以及用于更方便地處理復雜的數據類型。

2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)

這個 typedef 定義了另一個函數指針類型的別名 LPSDOLGetModule。這個函數指針指向一個具有以下特征的函數:

  • 返回類型為 int
  • 使用 WINAPI 調用約定。
  • 接受一個 REFIID 類型的參數 riid 和一個 void** 類型的參數 intf

3、typedef int (WINAPI* LPSDOLTerminal)();

這個 typedef 定義了第三個函數指針類型的別名 LPSDOLTerminal。這個函數指針指向一個具有以下特征的函數:

  • 返回類型為 int
  • 使用 WINAPI 調用約定。
  • 不接受任何參數。

為什么要使用 typedef 呢?使用 typedef 可以讓代碼更加清晰,提高可讀性。通過定義這些函數指針類型的別名,可以更容易地聲明和使用這些函數指針,特別是在涉及到多次使用相同函數指針類型的情況下。這有助于簡化代碼并提高可維護性。

4、GetProcAddress運行時獲取一個動態鏈接庫(DLL)中導出函數的地址

WINBASEAPI
FARPROC
WINAPI
GetProcAddress (__in HMODULE hModule,__in LPCSTR lpProcName);

這段代碼片段是 Windows 操作系統的頭文件和函數聲明。讓我為您解釋一下這些概念:

  • WINBASEAPI: 這是一個宏,通常用于聲明 Windows API 函數。它在 Windows 頭文件中定義,并根據編譯器和系統的不同進行設置。它的作用是為了確保在編譯時使用正確的調用約定(calling convention)和導入/導出修飾符。

  • FARPROC: 這是一個函數指針類型,用于指向導入庫函數。FARPROC 代表 “FAR Procedure”,在 32 位 Windows 中用于指向動態鏈接庫(DLL)中的函數。

  • WINAPI: 這是一個宏,用于聲明 Windows API 函數,同時指定函數的調用約定。WINAPI 宏的定義會根據編譯器和系統的不同進行設置。通常,它會將函數調用約定設置為 __stdcall,這是一種用于 Windows API 的常見調用約定。

  • GetProcAddress: 這是 Windows API 中的一個函數,用于在運行時獲取一個動態鏈接庫(DLL)中導出函數的地址。這個函數在加載 DLL 后用于獲取指定函數的指針,以便在程序中調用這些函數。

所以,這段代碼片段聲明了 GetProcAddress 函數,并提供了它的參數類型和說明。在實際代碼中,您需要包含相關的 Windows 頭文件,并根據需要使用這個函數來獲取 DLL 中導出函數的指針,從而進行調用。

GetProcAddressWindows 操作系統提供的一個函數,用于在運行時獲取一個動態鏈接庫(DLL)中導出函數的地址。這個函數通常在動態鏈接庫加載后被調用,用于獲取庫中特定函數的指針,以便在程序中調用這些函數。

函數簽名如下:

FARPROC GetProcAddress(HMODULE hModule,    // 動態鏈接庫的句柄LPCSTR  lpProcName   // 函數的名稱或者是函數的序號
);
  • hModule: 指向已加載的動態鏈接庫的句柄。通常使用 LoadLibrary 函數來加載動態鏈接庫,然后將返回的句柄傳遞給 GetProcAddress

  • lpProcName: 要獲取地址的函數的名稱,或者是函數在導出表中的序號(函數的索引)。如果是名稱,應該是一個以 NULL 結尾的字符串。

  • GetProcAddress 的返回值是一個函數指針,可以用于直接調用動態鏈接庫中的函數。這對于動態加載庫并在需要時使用其中的函數非常有用,特別是在插件式架構中或者需要在運行時決定調用哪些函數的情況下。

一個常見的用法是在加載插件時使用 GetProcAddress 來獲取插件中的函數指針,然后通過這些指針來調用插件中的功能。

5、LoadLibraryExA 用于加載指定ANSI的動態鏈接庫文件

WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryExA(__in       LPCSTR lpLibFileName,__reserved HANDLE hFile,__in       DWORD dwFlags);

這段代碼是 Windows API 函數 LoadLibraryExA 的聲明。讓我為您解釋一下其中的參數和類型:

  • WINBASEAPI: 這是一個宏,用于聲明 Windows API 函數。它在 Windows 頭文件中定義,并根據編譯器和系統的不同進行設置。

  • __out_opt: 這是一個標記,表示函數的返回值可以是一個可選的輸出參數。在這個聲明中,它表示函數的返回值 HMODULE 可能會被用作輸出參數,以傳遞一個返回的模塊句柄。

  • HMODULE: 這是一個 Windows 數據類型,表示模塊(通常是 DLLEXE)的句柄。HMODULE 句柄是用于在程序中引用已加載模塊的標識符。

  • WINAPI: 這是一個宏,用于聲明 Windows API 函數,并指定函數的調用約定。通常情況下,它將函數調用約定設置為 __stdcall,這是一種用于 Windows API 的常見調用約定。

  • LoadLibraryExA: 這是一個 Windows API 函數,用于加載一個指定的動態鏈接庫(DLL)文件。

  • lpLibFileName: 一個以 null 結尾的字符串,表示要加載的 DLL 文件名。LPCSTR 表示一個指向以 ANSI 字符集編碼的字符串的指針。

  • hFile: 一個保留參數,傳入 HANDLE 類型的文件句柄,或者傳入 NULL

  • dwFlags: 一個標志,用于指定加載 DLL 的方式。可以是各種標志的組合,例如 :

    • DONT_RESOLVE_DLL_REFERENCES: 加載 DLL 但不解析其依賴項。
    • LOAD_LIBRARY_AS_DATAFILE: 將 DLL 視為數據文件而不是可執行文件。
    • LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR: 僅在 DLL 所在的目錄中搜索依賴項。

綜合起來,這個聲明表明了一個 Windows API 函數 LoadLibraryExA,它用于加載指定的動態鏈接庫文件。函數返回一個 HMODULE 類型的句柄,表示已加載的模塊。參數類型和標記都提供了函數使用和返回值的相關信息。

6、LoadLibraryExW 用于加載指定Wide寬字符的動態鏈接庫文件

WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryExW(__in       LPCWSTR lpLibFileName,__reserved HANDLE hFile,__in       DWORD dwFlags);

這段代碼是 Windows API 函數 LoadLibraryExW 的聲明。讓我為您解釋一下其中的參數和類型:

  • WINBASEAPI: 這是一個宏,用于聲明 Windows API 函數。它在 Windows 頭文件中定義,并根據編譯器和系統的不同進行設置。

  • __out_opt: 這是一個標記,表示函數的返回值可以是一個可選的輸出參數。在這個聲明中,它表示函數的返回值 HMODULE 可能會被用作輸出參數,以傳遞一個返回的模塊句柄。

  • HMODULE: 這是一個 Windows 數據類型,表示模塊(通常是 DLLEXE)的句柄。HMODULE 句柄是用于在程序中引用已加載模塊的標識符。

  • WINAPI: 這是一個宏,用于聲明 Windows API 函數,并指定函數的調用約定。通常情況下,它將函數調用約定設置為 __stdcall,這是一種用于 Windows API 的常見調用約定。

  • LoadLibraryExW: 這是一個 Windows API 函數,用于加載一個指定的動態鏈接庫(DLL)文件。

  • lpLibFileName: 這是一個指向以 null 結尾的字符串的指針,表示要加載的動態鏈接庫(DLL)的文件名。LPCWSTR 表示一個指向以寬字符(Unicode)編碼的字符串的指針。您需要將要加載的 DLL 的文件名以寬字符格式傳遞給這個參數。

  • hFile: 一個保留參數,傳入 HANDLE 類型的文件句柄,或者傳入 NULL

  • dwFlags: 一個標志,用于指定加載 DLL 的方式。可以是各種標志的組合,例如 :

    • DONT_RESOLVE_DLL_REFERENCES: 加載 DLL 但不解析其依賴項。
    • LOAD_LIBRARY_AS_DATAFILE: 將 DLL 視為數據文件而不是可執行文件。
    • LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR: 僅在 DLL 所在的目錄中搜索依賴項。

綜合起來,LoadLibraryExW 函數用于加載指定的 DLL 文件,并且通過參數來控制加載方式和行為。根據傳遞的文件名、文件句柄和標志,該函數將加載 DLL 并返回一個模塊句柄(HMODULE),以便后續操作使用。不同之處在于該函數接受寬字符格式的文件名,適用于 Unicode 編碼。

7、LoadLibraryA 用于加載指定ANSI的動態鏈接庫文件

WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryExA(__in       LPCSTR lpLibFileName,);

這段代碼是 Windows API 函數 LoadLibraryA 的聲明。讓我為您解釋一下其中的參數和類型:

  • WINBASEAPI: 這是一個宏,用于聲明 Windows API 函數。它在 Windows 頭文件中定義,并根據編譯器和系統的不同進行設置。

  • __out_opt: 這是一個標記,表示函數的返回值可以是一個可選的輸出參數。在這個聲明中,它表示函數的返回值 HMODULE 可能會被用作輸出參數,以傳遞一個返回的模塊句柄。

  • HMODULE: 這是一個 Windows 數據類型,表示模塊(通常是 DLLEXE)的句柄。HMODULE 句柄是用于在程序中引用已加載模塊的標識符。

  • WINAPI: 這是一個宏,用于聲明 Windows API 函數,并指定函數的調用約定。通常情況下,它將函數調用約定設置為 __stdcall,這是一種用于 Windows API 的常見調用約定。

  • LoadLibraryA: 這是一個 Windows API 函數,用于加載一個指定的動態鏈接庫(DLL)文件。

  • lpLibFileName: 一個以 null 結尾的字符串,表示要加載的 DLL 文件名。LPCSTR 表示一個指向以 ANSI 字符集編碼的字符串的指針。

綜合起來,這個聲明表明了一個 Windows API 函數 LoadLibraryA,它用于加載指定的動態鏈接庫文件。函數返回一個 HMODULE 類型的句柄,表示已加載的模塊。參數類型和標記都提供了函數使用和返回值的相關信息。總之,這個函數原型定義了 LoadLibraryA 函數的簽名,它接受一個以多字節字符編碼的 DLL 文件名作為參數,然后返回一個表示已加載模塊的句柄。使用這個句柄,您可以執行與該模塊相關的操作。

8、LoadLibraryW 用于加載指定Wide寬字符的動態鏈接庫文件

WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryExW(__in       LPCWSTR lpLibFileName,);

這段代碼是 Windows API 函數 LoadLibraryW 的聲明。讓我為您解釋一下其中的參數和類型:

  • WINBASEAPI: 這是一個宏,用于聲明 Windows API 函數。它在 Windows 頭文件中定義,并根據編譯器和系統的不同進行設置。

  • __out_opt: 這是一個標記,表示函數的返回值可以是一個可選的輸出參數。在這個聲明中,它表示函數的返回值 HMODULE 可能會被用作輸出參數,以傳遞一個返回的模塊句柄。

  • HMODULE: 這是一個 Windows 數據類型,表示模塊(通常是 DLLEXE)的句柄。HMODULE 句柄是用于在程序中引用已加載模塊的標識符。

  • WINAPI: 這是一個宏,用于聲明 Windows API 函數,并指定函數的調用約定。通常情況下,它將函數調用約定設置為 __stdcall,這是一種用于 Windows API 的常見調用約定。

  • LoadLibraryW: 這是一個 Windows API 函數,用于加載一個指定的動態鏈接庫(DLL)文件。

  • lpLibFileName: 這是一個指向以 null 結尾的字符串的指針,表示要加載的動態鏈接庫(DLL)的文件名。LPCWSTR 表示一個指向以寬字符(Unicode)編碼的字符串的指針。您需要將要加載的 DLL 的文件名以寬字符格式傳遞給這個參數。

綜合起來,LoadLibraryW 函數用于加載指定的 DLL 文件。根據傳遞的文件名、文件句柄和標志,該函數將加載 DLL 并返回一個模塊句柄(HMODULE),以便后續操作使用。不同之處在于該函數接受寬字符格式的文件名,適用于 Unicode 編碼。總之,這個函數原型定義了 LoadLibraryA 函數的簽名,它接受一個以Unicode編碼的 DLL 文件名作為參數,然后返回一個表示已加載模塊的句柄。使用這個句柄,您可以執行與該模塊相關的操作。

9、LoadLibraryExA和LoadLibraryA以及LoadLibraryExW和LoadLibraryW區別

這些函數是 Windows API 中用于加載動態鏈接庫 (DLL) 的函數,主要區別在于它們支持的字符串類型和加載選項:

  • LoadLibraryExALoadLibraryA
    • LoadLibraryExA:用于以 ANSI 編碼加載 DLL。它接受 ANSI 字符串作為參數。
    • LoadLibraryA:也用于以 ANSI 編碼加載 DLL。與 LoadLibraryExA 類似,但沒有額外的加載選項。

這兩個函數的主要區別在于 LoadLibraryExA 支持額外的加載選項,如指定加載行為和加載上下文等。而 LoadLibraryA 是基本的加載函數,不提供這些選項。

  • LoadLibraryExWLoadLibraryW
    • LoadLibraryExW:用于以 Unicode 編碼加載 DLL。它接受 Unicode 字符串作為參數。
    • LoadLibraryW:也用于以 Unicode 編碼加載 DLL。與 LoadLibraryExW 類似,但沒有額外的加載選項。

這兩個函數的區別與前面所述的 ANSI 版本類似,LoadLibraryExW 支持額外的加載選項,而 LoadLibraryW 是基本的加載函數。

在選擇使用哪個函數時,您需要根據字符串的編碼和加載選項來決定。如果您使用的是 ANSI 字符串,可以選擇 LoadLibraryExA 或 LoadLibraryA。如果您使用的是 Unicode 字符串,可以選擇 LoadLibraryExWLoadLibraryW。如果您需要額外的加載選項,可以使用以 “Ex” 結尾的版本。

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

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

相關文章

mysql與redis區別

mysql和redis的數據庫類型 mysql是關系型數據庫,主要用于存放持久化數據,將數據存儲在硬盤中,讀取速度較慢。 redis是NOSQL,即非關系型數據庫,也是緩存數據庫,即將數據存儲在緩存中,緩存的讀取速…

網絡

mcq Java 傳輸層:拆分和組裝,完成端到端的消息傳遞,流量控制,差錯控制等 網絡層: 尋址、路由,復用,擁塞控制,完成源到宿的傳遞。 顯然A選項是錯誤的,有流量控制的是傳輸層…

JavaScript TypeScript

文章目錄 JavaScript語法事件處理與HTML和CSS集成前端框架和庫 TypeScript靜態類型檢查語法更好的可維護性 包管理工具npmpnpmyarnBower JavaScript JavaScript(簡稱JS)是一種廣泛應用于網頁開發的腳本語言。它被用來為網頁增加交互性和動態功能。以下是…

netty學習分享(一)

TCP與UDP TCP 是面向連接的、可靠的流協議,通過三次握手建立連接,通訊完成時要拆除連接。 UDP是面向無連接的通訊協議,UDP通訊時不需要接收方確認,屬于不可靠的傳輸,可能會出現丟包現象 端口號: 端口號用…

【微信小程序】記一次自定義微信小程序組件的思路

最近來個需求,要求給小程序的 modal 增加個關閉按鈕,上網一查發現原來 2018 年就有人給出解決方案了,于是總結下微信小程序自定義組件的思路:一句話,用 wxml css實現和原生組件類似的樣式和效果,之后用 JS…

【uniapp】uniapp設置安全區域:

文章目錄 一、效果圖:二、實現代碼: 一、效果圖: 二、實現代碼: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息隊列學習筆記

消息隊列基礎 適合消息隊列解決的問題 異步處理:處理完關鍵步驟后直接返回結果,后續放入隊列慢慢處理流量控制: 使用消息隊列隔離網關和后端服務,以達到流量控制和保護后端服務的目的。能根據下游的處理能力自動調節流量&#x…

leetcode做題筆記79單詞搜索

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相…

Matlab工具NIFTI包的基本功能函數

Matlab工具NIFTI包的基本功能函數 Nifti 格式最初是為神經影像學發明的。神經影像信息學技術計劃(NIFTI)將 NIfTI 格式預設為 ANALYZE7.5 格式的替代品。它最初的應用領域是神經影像,但是也被用在其他領域。這種格式的主要特點就是它包含兩個…

Docker基礎入門:常規軟件安裝與鏡像加載原理

Docker基礎入門:常規軟件安裝與鏡像加載原理 一、Docker常規軟件安裝1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->連接elasticsearch1.5、部署可視化工具 二、 鏡像加載原理2.1、鏡像是什么2.2、Docker鏡像加速原理2.3、分層理解…

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter,他的原理大概就是啟動一個kafka客戶端,獲取kafka服務器的信息,然后提供一些metric接口供Prometheus使用,隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例實戰、Flink CDC 實時數據采集、Presto、FineBI 報表可視化等

7.第七章 Hudi案例實戰 7.1 案例架構 7.2 業務數據 7.2.1 客戶信息表 7.2.2 客戶意向表 7.2.3 客戶線索表 7.2.4 線索申訴表 7.2.5 客戶訪問咨詢記錄表 7.3 Flink CDC 實時數據采集 7.3.1 開啟MySQL binlog 7.3.2 環境準備 7.3.3 實時采集數據 7.3.3.1 客戶信息表 7.3.3.2 客戶…

ubuntu安裝jdk、emqx、nginx

一、安裝jdk 要在Ubuntu上安裝JDK 1.8,您可以按照以下步驟進行操作: 打開終端(CtrlAltT)。確保您的系統已更新: sudo apt update sudo apt upgrade安裝OpenJDK 8: sudo apt install openjdk-8-jdk安裝完成…

.net core發布到IIS上出現 HTTP 錯誤 500.19

1.檢查.net core 環境運行環境是否安裝完成,類似如下環境 2.IIS是否安裝全 本次原因就是IIS未安裝全導致的 按照網上說的手動重啟iis(iisreset)也不行

基于C#的消息處理的應用程序 - 開源研究系列文章

今天講講基于C#里的基于消息處理的應用程序的一個例子。 我們知道,Windows操作系統的程序是基于消息處理的。也就是說,程序接收到消息代碼定義,然后根據消息代碼定義去處理對應的操作。前面有一個博文例子( C#程序的啟動顯示方案(無窗口進程發…

【數據結構】 ArrayList簡介與實戰

文章目錄 什么是ArrayListArrayList相關說明 ArrayList使用ArrayList的構造無參構造指定順序表初始容量利用其他 Collection 構建 ArrayListArrayList常見操作獲取list有效元素個數獲取和設置index位置上的元素在list的index位置插入指定元素刪除指定元素刪除list中index位置上…

機器學習基礎(二)

線性回歸 誤差是獨立并且具有相同的分布通常認為服從均值為0方差為的高斯分布。 損失函數(loss Function)/代價函數(Cost Function) 其實兩種叫法都可以,損失函數(loss function)或代價函數(cost function)是將隨機事件或其有關隨機變量的取值映射為非負實數以表示該隨…

Android開發之性能優化:過渡繪制解決方案

1. 過渡繪制 屏幕上某一像素點在一幀中被重復繪制多次,就是過渡繪制。 下圖中多個卡片跌在一起,但是只有第一個卡片是完全可見的。背后的卡片只有部分可見。但是Android系統在繪制時會將下層的卡片進行繪制,接著再將上層的卡片進行繪制。但其…