色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++基礎語法梳理之Windows 的動態鏈接庫

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者: C語言編程 ? 2021-11-02 09:21 ? 次閱讀

Windows 應用程序入口函數

GUI(Graphical User Interface)應用,鏈接器選項:/SUBSYSTEM:WINDOWS

CUI(Console User Interface)應用,鏈接器選項:/SUBSYSTEM:CONSOLE

_tWinMain 與 _tmain 函數聲明

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 的動態鏈接庫(Dynamic-Link Library)

部分知識點來自《Windows 核心編程(第五版)》

用處

(1)擴展了應用程序的特性

(2)簡化了項目管理

(3)有助于節省內存

(4)促進了資源的共享

(5)促進了本地化

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

(7)可以用于特殊目的

注意

(1)創建 DLL,事實上是在創建可供一個可執行模塊調用的函數

(2)當一個模塊提供一個內存分配函數(malloc、new)的時候,它必須同時提供另一個內存釋放函數(free、delete

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

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

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

(6)調用 DLL 的可執行模塊:cpp 文件的 __declspec(dllimport) 之前不應該定義 MYLIBAPI

加載 Windows 程序的搜索順序

1、包含可執行文件的目錄

2、Windows 的系統目錄,可以通過 GetSystemDirectory 得到

3、16 位的系統目錄,即 Windows 目錄中的 System 子目錄

4、Windows 目錄,可以通過 GetWindowsDirectory 得到

5、進程的當前目錄

6、PATH 環境變量中所列出的目錄

DLL 入口函數

DllMain 函數

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

載入卸載庫

LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread 函數聲明

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

顯示地鏈接到導出符號

GetProcAddress 函數聲明

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

DumpBin.exe 查看 DLL 信息

在 VS 的開發人員命令提示符使用 DumpBin.exe 可查看 DLL 庫的導出段(導出的變量、函數、類名的符號)、相對虛擬地址(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 庫的編寫(導出一個 DLL 模塊)

DLL 庫的編寫(導出一個 DLL 模塊) DLL 頭文件

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

DLL 源文件

// MyLibFile1.cpp
// 包含標準Windows和C運行時頭文件#include 
// DLL源碼文件導出的函數和變量#define MYLIBAPI extern "C" __declspec(dllexport)
// 包含導出的數據結構、符號、函數、變量#include "MyLib.h"
// 將此DLL源代碼文件的代碼放在此處int g_nResult;
int Add(int nLeft, int nRight){    g_nResult = nLeft + nRight;    return g_nResult;}

DLL 庫的使用(運行時動態鏈接 DLL)

DLL 庫的使用(運行時動態鏈接 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;}

運行庫(Runtime Library)

典型程序運行步驟

(1)操作系統創建進程,把控制權交給程序的入口(往往是運行庫中的某個入口函數)

(2)入口函數對運行庫和程序運行環境進行初始化(包括堆、I/O、線程、全局變量構造等等)。

(3)入口函數初始化后,調用 main 函數,正式開始執行程序主體部分。

(4)main 函數執行完畢后,返回到入口函數進行清理工作(包括全局變量析構、堆銷毀、關閉I/O等),然后進行系統調用結束進程。

一個程序的 I/O 指代程序與外界的交互,包括文件、管程、網絡、命令行、信號等。更廣義地講,I/O 指代操作系統理解為 “文件” 的事物。

glibc 入口

_start -> __libc_start_main -> exit -> _exit

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

MSVC CRT 入口

int mainCRTStartup(void)

執行如下操作:

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

(2)初始化堆。

(3)初始化 I/O。

(4)獲取命令行參數和環境變量。

(5)初始化 C 庫的一些數據。

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

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

C 語言運行庫(CRT)

大致包含如下功能:

啟動與退出:包括入口函數及入口函數所依賴的其他函數等。

標準函數:有 C 語言標準規定的C語言標準庫所擁有的函數實現。

I/O:I/O 功能的封裝和實現。

堆:堆的封裝和實現。

語言實現:語言中一些特殊功能的實現。

調試:實現調試功能的代碼。

C語言標準庫(ANSI C)

包含:

標準輸入輸出(stdio.h)

文件操作(stdio.h)

字符操作(ctype.h)

字符串操作(string.h)

數學函數(math.h)

資源管理(stdlib.h)

格式轉換(stdlib.h)

時間/日期(time.h)

斷言(assert.h)

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

變長參數(stdarg.h)

非局部跳轉(setjmp.h)

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    4

    文章

    3551

    瀏覽量

    88805
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62691
  • C++
    C++
    +關注

    關注

    22

    文章

    2110

    瀏覽量

    73687
  • 動態鏈接庫
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7066

原文標題:C++基礎語法梳理:Windows 的動態鏈接庫

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AKI跨語言調用神助攻C/C++代碼遷移至HarmonyOS NEXT

    )開發框架。它極大地簡化了JS與C/C++之間的跨語言訪問,為開發者提供了一種邊界性編程體驗友好的解決方案。通過AKI,開發者可以使用讓代碼更易讀的語法糖,實現JS與C/
    發表于 01-02 17:08

    深入探討Linux系統中的動態鏈接庫機制

    本文將深入探討Linux系統中的動態鏈接庫機制,這其中包括但不限于全局符號介入、延遲綁定以及地址無關代碼等內容。 引言 在軟件開發過程中,動態鏈接
    的頭像 發表于 12-18 10:06 ?126次閱讀
    深入探討Linux系統中的<b class='flag-5'>動態</b><b class='flag-5'>鏈接庫</b>機制

    安卓動態鏈接庫文件體積優化探索實踐

    諸多方面影響,針對dex、資源文件、so文件都有不同的優化策略,在此不做一一展開,本文主要記錄了在研發時針對動態鏈接庫的文件體積裁剪優化方案。 我開發的鏈接庫使用rust語言開發,通過安卓jni接口實現java層和native層
    的頭像 發表于 11-21 14:07 ?143次閱讀

    嵌入式學習-靜態鏈接動態鏈接

    目標文件,一般是以.so文件形式存在。GCC默認是動態鏈接不需要加參數。舉例子看一下動態鏈接庫的使用方法,創建三個C語言文件:mymath.
    發表于 08-28 09:33

    靜態鏈接動態鏈接

    目標文件,一般是以.so文件形式存在。GCC默認是動態鏈接不需要加參數。舉例子看一下動態鏈接庫的使用方法,創建三個C語言文件:mymath.
    發表于 08-27 10:20

    OpenHarmony標準系統C++公共基礎類案例:HelloWorld

    1、程序簡介該程序是基于凌蒙派OpenHarmony-v3.2.1標準系統C++公共基礎類的簡單案例:HelloWorld。主要講解C++公共基礎類案例如何搭建和編譯。2、程序解析
    的頭像 發表于 08-13 08:23 ?536次閱讀
    OpenHarmony標準系統<b class='flag-5'>C++</b>公共基礎類<b class='flag-5'>庫</b>案例:HelloWorld

    c++編譯后鏈接失敗的原因?如何解決?

    /c++項目,將剛才新建的項目轉換為c++項目。 完成后點擊編譯,此時也是正常的。 新建一個cpp文件,將原項目的main.c中內容全部拷貝到新建的cpp文件中保存,然后刪除原main.c
    發表于 07-25 08:13

    C++中實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是編程中實際需求,使開發人員能夠做出
    的頭像 發表于 07-18 10:16 ?607次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    ESP32+Eclipse如何添加C++生成的靜態

    ESP32+Eclipse如何添加C++生成的靜態
    發表于 06-21 08:20

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準的功能。使用C
    的頭像 發表于 04-14 11:43 ?2667次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    兩種linux系統下常見的HOOK方法

    Linux提供了一個名為LD_PRELOAD的環境變量。這個環境變量允許用戶指定一個或多個共享鏈接庫文件的路徑。當程序啟動時,動態加載器會在加載C語言運行庫之前,首先加載LD_PRELOAD所指定的共享
    發表于 04-08 11:26 ?4199次閱讀
    兩種linux系統下常見的HOOK方法

    EtherCAT運動控制器在ROS上的應用開發案例(下)

    本篇文章我們主要介紹正運動技術動態鏈接庫環境配置以及EtherCAT運動控制器在ROS下的單軸運動。
    的頭像 發表于 03-17 11:11 ?955次閱讀
    EtherCAT運動控制器在ROS上的應用開發案例(下)

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言的入門語言。 C++C++是在C
    的頭像 發表于 02-05 14:11 ?2429次閱讀

    vb語言和c++語言的區別

    Microsoft開發的一種面向對象的事件驅動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與相比,C++語言是一種通用的、面向對象的編程語言,其設計目標是提供高性能的系統級編程。 語法: VB語言的
    的頭像 發表于 02-01 10:20 ?2364次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?616次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 暖暖日本在线手机免费完整版| 国产91专区| 国产精品外围在线观看| 私人玩物在线观看| 国产精品人妻无码久久久奥特曼| 午夜啪啪免费视频| 久久精品AV无码亚洲色欲| 777久久人妻少妇嫩草AV蜜桃| 翘臀后进美女白嫩屁股视频| 动漫人物差差差30分钟免费看| 脱女学小内内摸出水网站免费| 精品国产人妻国语| old老男人野外树林tv| 熟妇无码乱子成人精品| 精品午夜中文字幕熟女人妻在线| 99久久国产综合色| 校花娇喘呻吟校长陈若雪视频| 浪小辉军警服务员VIDEOS| 第一次破女初国产美女| 一本久道久久综合婷婷五月| 欧美日韩精品不卡在线观看| 国产专区亚洲欧美另类在线| 99精品国产免费久久久久久下载| 無码一区中文字幕少妇熟女H| 久久久久久久尹人综合网亚洲| 乳欲性高清在线| 娇小XXXXX第一次出血| 99久久久无码国产精品免费人妻| 午夜精品久久久内射近拍高清| 男人免费网站| 精品国产高清自在线看| YY600800新视觉理论私人| 亚洲伊人色综合久久天天伊人| 日本久久精品毛片一区随边看| 久久国产精品高清一区二区三区 | 美国z0069| 国产一区二区青青精品久久| 爆操日本美女| 51无码人妻精品1国产| 亚洲spank男男实践网站| 日韩精品 中文字幕 有码 |