91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++基礎(chǔ)語(yǔ)法梳理之Windows 的動(dòng)態(tài)鏈接庫(kù)

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者: C語(yǔ)言編程 ? 2021-11-02 09:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Windows 應(yīng)用程序入口函數(shù)

GUI(Graphical User Interface)應(yīng)用,鏈接器選項(xiàng):/SUBSYSTEM:WINDOWS

CUI(Console User Interface)應(yīng)用,鏈接器選項(xiàng):/SUBSYSTEM:CONSOLE

_tWinMain 與 _tmain 函數(shù)聲明

Int WINAPI _tWinMain(    HINSTANCE hInstanceExe,    HINSTANCE,    PTSTR pszCmdLine,    int nCmdShow);
int _tmain(    int argc,    TCHAR *argv[],    TCHAR *envp[]);

4e0e46d2-3b52-11ec-82a9-dac502259ad0.png

Windows 的動(dòng)態(tài)鏈接庫(kù)(Dynamic-Link Library)

部分知識(shí)點(diǎn)來(lái)自《Windows 核心編程(第五版)》

用處

(1)擴(kuò)展了應(yīng)用程序的特性

(2)簡(jiǎn)化了項(xiàng)目管理

(3)有助于節(jié)省內(nèi)存

(4)促進(jìn)了資源的共享

(5)促進(jìn)了本地化

(6)有助于解決平臺(tái)間的差異

(7)可以用于特殊目的

注意

(1)創(chuàng)建 DLL,事實(shí)上是在創(chuàng)建可供一個(gè)可執(zhí)行模塊調(diào)用的函數(shù)

(2)當(dāng)一個(gè)模塊提供一個(gè)內(nèi)存分配函數(shù)(malloc、new)的時(shí)候,它必須同時(shí)提供另一個(gè)內(nèi)存釋放函數(shù)(free、delete

(3)在使用 C 和 C++ 混編的時(shí)候,要使用 extern "C" 修飾符

(4)一個(gè) DLL 可以導(dǎo)出函數(shù)、變量(避免導(dǎo)出)、C++ 類(導(dǎo)出導(dǎo)入需要同編譯器,否則避免導(dǎo)出)

(5)DLL 模塊:cpp 文件中的 __declspec(dllexport) 寫(xiě)在 include 頭文件之前

(6)調(diào)用 DLL 的可執(zhí)行模塊:cpp 文件的 __declspec(dllimport) 之前不應(yīng)該定義 MYLIBAPI

加載 Windows 程序的搜索順序

1、包含可執(zhí)行文件的目錄

2、Windows 的系統(tǒng)目錄,可以通過(guò) GetSystemDirectory 得到

3、16 位的系統(tǒng)目錄,即 Windows 目錄中的 System 子目錄

4、Windows 目錄,可以通過(guò) GetWindowsDirectory 得到

5、進(jìn)程的當(dāng)前目錄

6、PATH 環(huán)境變量中所列出的目錄

DLL 入口函數(shù)

DllMain 函數(shù)

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){    switch(fdwReason)    {    case DLL_PROCESS_ATTACH:        // 第一次將一個(gè)DLL映射到進(jìn)程地址空間時(shí)調(diào)用        // The DLL is being mapped into the process' address space.        break;    case DLL_THREAD_ATTACH:        // 當(dāng)進(jìn)程創(chuàng)建一個(gè)線程的時(shí)候,用于告訴DLL執(zhí)行與線程相關(guān)的初始化(非主線程執(zhí)行)        // A thread is bing created.        break;    case DLL_THREAD_DETACH:        // 系統(tǒng)調(diào)用 ExitThread 線程退出前,即將終止的線程通過(guò)告訴DLL執(zhí)行與線程相關(guān)的清理        // A thread is exiting cleanly.        break;    case DLL_PROCESS_DETACH:        // 將一個(gè)DLL從進(jìn)程的地址空間時(shí)調(diào)用        // The DLL is being unmapped from the process' address space.        break;    }    return (TRUE); // Used only for DLL_PROCESS_ATTACH}

載入卸載庫(kù)

LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread 函數(shù)聲明

// 載入庫(kù)HMODULE WINAPI LoadLibrary(  _In_ LPCTSTR lpFileName);HMODULE LoadLibraryExA(  LPCSTR lpLibFileName,  HANDLE hFile,  DWORD  dwFlags);// 若要在通用 Windows 平臺(tái)(UWP)應(yīng)用中加載 Win32 DLL,需要調(diào)用 LoadPackagedLibrary,而不是 LoadLibrary 或 LoadLibraryExHMODULE LoadPackagedLibrary(  LPCWSTR lpwLibFileName,  DWORD   Reserved);
// 卸載庫(kù)BOOL WINAPI FreeLibrary(  _In_ HMODULE hModule);// 卸載庫(kù)和退出線程VOID WINAPI FreeLibraryAndExitThread(  _In_ HMODULE hModule,  _In_ DWORD   dwExitCode);

顯示地鏈接到導(dǎo)出符號(hào)

GetProcAddress 函數(shù)聲明

FARPROC GetProcAddress(  HMODULE hInstDll,  PCSTR pszSymbolName  // 只能接受 ANSI 字符串,不能是 Unicode);

DumpBin.exe 查看 DLL 信息

在 VS 的開(kāi)發(fā)人員命令提示符使用 DumpBin.exe 可查看 DLL 庫(kù)的導(dǎo)出段(導(dǎo)出的變量、函數(shù)、類名的符號(hào))、相對(duì)虛擬地址(RVA,relative virtual address)。如:

DUMPBIN -exports D:mydll.dll

LoadLibrary 與 FreeLibrary 流程圖

LoadLibrary 與 FreeLibrary 流程圖

LoadLibrary

4e6d4092-3b52-11ec-82a9-dac502259ad0.png

FreeLibrary

4f09b3e6-3b52-11ec-82a9-dac502259ad0.png

DLL 庫(kù)的編寫(xiě)(導(dǎo)出一個(gè) DLL 模塊)

DLL 庫(kù)的編寫(xiě)(導(dǎo)出一個(gè) DLL 模塊) DLL 頭文件

// MyLib.h
#ifdef MYLIBAPI
// MYLIBAPI 應(yīng)該在全部 DLL 源文件的 include "Mylib.h" 之前被定義// 全部函數(shù)/變量正在被導(dǎo)出
#else
// 這個(gè)頭文件被一個(gè)exe源代碼模塊包含,意味著全部函數(shù)/變量被導(dǎo)入#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
// 這里定義任何的數(shù)據(jù)結(jié)構(gòu)和符號(hào)
// 定義導(dǎo)出的變量(避免導(dǎo)出變量)MYLIBAPI int g_nResult;
// 定義導(dǎo)出函數(shù)原型MYLIBAPI int Add(int nLeft, int nRight);

DLL 源文件

// MyLibFile1.cpp
// 包含標(biāo)準(zhǔn)Windows和C運(yùn)行時(shí)頭文件#include 
// DLL源碼文件導(dǎo)出的函數(shù)和變量#define MYLIBAPI extern "C" __declspec(dllexport)
// 包含導(dǎo)出的數(shù)據(jù)結(jié)構(gòu)、符號(hào)、函數(shù)、變量#include "MyLib.h"
// 將此DLL源代碼文件的代碼放在此處int g_nResult;
int Add(int nLeft, int nRight){    g_nResult = nLeft + nRight;    return g_nResult;}

DLL 庫(kù)的使用(運(yùn)行時(shí)動(dòng)態(tài)鏈接 DLL)

DLL 庫(kù)的使用(運(yùn)行時(shí)動(dòng)態(tài)鏈接 DLL)

// A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll.  #include  #include   typedef int (__cdecl *MYPROC)(LPWSTR);  int main( void ) {     HINSTANCE hinstLib;     MYPROC ProcAdd;     BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;      // Get a handle to the DLL module.     hinstLib = LoadLibrary(TEXT("MyPuts.dll"));      // If the handle is valid, try to get the function address.     if (hinstLib != NULL)     {         ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");          // If the function address is valid, call the function.         if (NULL != ProcAdd)         {            fRunTimeLinkSuccess = TRUE;            (ProcAdd) (L"Message sent to the DLL function
");         }        // Free the DLL module.         fFreeResult = FreeLibrary(hinstLib);     } 
    // If unable to call the DLL function, use an alternative.    if (! fRunTimeLinkSuccess)         printf("Message printed from executable
"); 
    return 0;}

運(yùn)行庫(kù)(Runtime Library)

典型程序運(yùn)行步驟

(1)操作系統(tǒng)創(chuàng)建進(jìn)程,把控制權(quán)交給程序的入口(往往是運(yùn)行庫(kù)中的某個(gè)入口函數(shù))

(2)入口函數(shù)對(duì)運(yùn)行庫(kù)和程序運(yùn)行環(huán)境進(jìn)行初始化(包括堆、I/O、線程、全局變量構(gòu)造等等)。

(3)入口函數(shù)初始化后,調(diào)用 main 函數(shù),正式開(kāi)始執(zhí)行程序主體部分。

(4)main 函數(shù)執(zhí)行完畢后,返回到入口函數(shù)進(jìn)行清理工作(包括全局變量析構(gòu)、堆銷毀、關(guān)閉I/O等),然后進(jìn)行系統(tǒng)調(diào)用結(jié)束進(jìn)程。

一個(gè)程序的 I/O 指代程序與外界的交互,包括文件、管程、網(wǎng)絡(luò)、命令行、信號(hào)等。更廣義地講,I/O 指代操作系統(tǒng)理解為 “文件” 的事物。

glibc 入口

_start -> __libc_start_main -> exit -> _exit

其中 main(argc, argv, __environ)函數(shù)在__libc_start_main 里執(zhí)行。

MSVC CRT 入口

int mainCRTStartup(void)

執(zhí)行如下操作:

(1)初始化和 OS 版本有關(guān)的全局變量。

(2)初始化堆。

(3)初始化 I/O。

(4)獲取命令行參數(shù)和環(huán)境變量。

(5)初始化 C 庫(kù)的一些數(shù)據(jù)。

(6)調(diào)用 main 并記錄返回值。

(7)檢查錯(cuò)誤并將 main 的返回值返回。

C 語(yǔ)言運(yùn)行庫(kù)(CRT)

大致包含如下功能:

啟動(dòng)與退出:包括入口函數(shù)及入口函數(shù)所依賴的其他函數(shù)等。

標(biāo)準(zhǔn)函數(shù):有 C 語(yǔ)言標(biāo)準(zhǔn)規(guī)定的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)所擁有的函數(shù)實(shí)現(xiàn)。

I/O:I/O 功能的封裝和實(shí)現(xiàn)。

堆:堆的封裝和實(shí)現(xiàn)。

語(yǔ)言實(shí)現(xiàn):語(yǔ)言中一些特殊功能的實(shí)現(xiàn)。

調(diào)試:實(shí)現(xiàn)調(diào)試功能的代碼。

C語(yǔ)言標(biāo)準(zhǔn)庫(kù)(ANSI C)

包含:

標(biāo)準(zhǔn)輸入輸出(stdio.h)

文件操作(stdio.h)

字符操作(ctype.h)

字符串操作(string.h)

數(shù)學(xué)函數(shù)(math.h)

資源管理(stdlib.h)

格式轉(zhuǎn)換(stdlib.h)

時(shí)間/日期(time.h)

斷言(assert.h)

各種類型上的常數(shù)(limits.h & float.h)

變長(zhǎng)參數(shù)(stdarg.h)

非局部跳轉(zhuǎn)(setjmp.h)

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3702

    瀏覽量

    94057
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67521
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77124
  • 動(dòng)態(tài)鏈接庫(kù)

    關(guān)注

    0

    文章

    11

    瀏覽量

    7225

原文標(biāo)題:C++基礎(chǔ)語(yǔ)法梳理:Windows 的動(dòng)態(tài)鏈接庫(kù)

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到一個(gè)開(kāi)源的模擬IIC的庫(kù),封裝的比較好,但是是使用c++寫(xiě)的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng)中 C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)C
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語(yǔ)法兼容性: C++完全兼容C語(yǔ)言的語(yǔ)法,這意味著任何有效的C語(yǔ)言程序都可以直接在C++
    發(fā)表于 12-11 06:51

    C語(yǔ)言和C++之間的區(qū)別是什么

    C++的標(biāo)準(zhǔn)庫(kù)那樣集成度高和功能齊全。 6、編譯器與語(yǔ)言特性: C++編譯器通常比C語(yǔ)言編譯器更加復(fù)雜,因?yàn)樗枰幚砀嗟恼Z(yǔ)言特性,比如模板元編程、命名空間、引用等。
    發(fā)表于 12-11 06:23

    C++程序異常的處理機(jī)制

    語(yǔ)法 C++異常處理涉及到3個(gè)關(guān)鍵字: throw---拋出一個(gè)異常,帶參數(shù) try---用于標(biāo)識(shí)可能會(huì)出現(xiàn)異常的代碼段 catch--是用于標(biāo)識(shí)異常處理的代碼段 下面以一個(gè)例子來(lái)說(shuō)明它們
    發(fā)表于 12-02 07:12

    飛凌嵌入式ElfBoard-Vim編輯器靜態(tài)鏈接動(dòng)態(tài)鏈接

    文件,一般是以.so文件形式存在。GCC默認(rèn)是動(dòng)態(tài)鏈接不需要加參數(shù)。舉例子看一下動(dòng)態(tài)鏈接庫(kù)的使用方法,創(chuàng)建三個(gè)C語(yǔ)言文件:mymath.
    發(fā)表于 10-17 09:07

    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(六):us級(jí)高速交互C++,為智能裝備提速

    Windows下運(yùn)動(dòng)控制實(shí)時(shí)內(nèi)核MotionRT750的高速交互C++
    的頭像 發(fā)表于 09-04 14:50 ?742次閱讀
    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(六):us級(jí)高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,為智能裝備提速

    【M-K1HSE開(kāi)發(fā)板免費(fèi)體驗(yàn)】相關(guān)源碼閱讀和分析1-使用XComponent + Vsync 實(shí)現(xiàn)自定義動(dòng)畫(huà)

    libentry.so 文件。 SHARED: 表示生成的是一個(gè)共享動(dòng)態(tài)庫(kù)。 ...: 列出了所有需要被編譯進(jìn)這個(gè)庫(kù)C++ 源文件。 find_library(...): 查
    發(fā)表于 09-03 16:05

    技能+1!如何在樹(shù)莓派上使用C++控制GPIO?

    和PiGPIO等庫(kù),C++可用于編程控制樹(shù)莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對(duì)速度和精度要求較高的硬件項(xiàng)目。在樹(shù)莓派社區(qū)中,關(guān)于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4158次閱讀
    技能+1!如何在樹(shù)莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Python是樹(shù)莓派上的首選編程語(yǔ)言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹(shù)莓派項(xiàng)目中選擇哪種語(yǔ)言更合適呢?Python因其簡(jiǎn)潔性、豐富的庫(kù)和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?952次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    請(qǐng)問(wèn)是否可以在通用Windows平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序?

    無(wú)法在通用 Windows 平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序
    發(fā)表于 06-24 07:35

    提高篇——C語(yǔ)言核心技術(shù)(中文版)

    該資料是“C編程語(yǔ)言”和“C語(yǔ)言鏈接庫(kù)”的完整參考手冊(cè)。這本書(shū)的目的是提供一本方便、可靠的手冊(cè),輔助日常的編程工作。本書(shū)描述C語(yǔ)言的所有元素,并介紹它們的用法。 資料分成三部分。第
    發(fā)表于 06-13 16:39

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++

    在單片機(jī)的地界兒里,C語(yǔ)言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說(shuō)內(nèi)存這道坎兒。您當(dāng)stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1052次閱讀
    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    請(qǐng)問(wèn)如何鏈接動(dòng)態(tài)庫(kù)?

    是否有可參考的工程? 鏈接成功后動(dòng)態(tài)庫(kù)應(yīng)該放在哪里???SDK是RTOS_ONLY
    發(fā)表于 04-25 08:15

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開(kāi)發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語(yǔ)言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、內(nèi)存
    發(fā)表于 03-13 10:19