《深刻淺出mfc》 第1章 筆記

須要什麼函數庫(.lib)

windows支持動態連接庫,應用程序所調用 的windows api 函數是在「執行期間「才連接上的。Windows程序調用 能夠分爲 C Runtimes以及windows api 大概兩部分。早期的C Runtimes並不支持動態連接,vc++ 4.0以後已經支持。而且在32位已不在擁有small/medium/large等內存模式之分。

LIBC.lib:這是c Runtime函數庫的靜態版本
MSVCRT.lib:這是 c Runtime函數的動態庫版本(MSVCRT40.dll)的import函數庫。程序運行期間必須有MSVCRT40.dll在場。c++

另外一組函數Windows Api由操做系統自己提供(GDI32.dll、USER32.DLL,Kernel32.DLL)。雖然說動態連接庫是在執行期間發生的。可是連接器仍須要先爲調用者準備一些適當的信息。這些適當的信息放在」import函數庫」,32位的windows的三大模塊對應的 import函數庫分別爲GDI32.lib user32.lib kernel32.lib。windows

消息映射的雛形

《windows程序設計》裏面的消息循環(WndPorc) switch case 語句 以下api

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // 分析菜單選擇:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: 在此添加任意繪圖代碼...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

爲了把窗口函數設計一旬模塊化,通常化。下面是一種作法。數據結構

//首先定義一個MSGMAP_ENTRY結構和一個dim宏
struct MSGMAP_ENTRY
{
    UINT nMessage;
    LONG (*pfn)(HWND ,UINT,WPARAM,LPARAM);
};
#define dim(x) (sizeof(x)/sizeof(x[0]))

//把欲處理的消息以及消息處理全程關聯性創建起來
struct MSGMAP_ENTRY _messageEntries[] = 
{
    WM_CREATE,OnCreate,
    WM_PAINT,OnPaint,
    WM_SIZE,OnSize,
    WM_COMMAND,OnCommand,
    WM_SETFOCUS,OnSetFocus,
    WM_CLOSE,OnClose,
    WM_DESTROY,OnDestroy
};

//Command-ID 與處理全程之間對照表格
struct MSGMAP_ENTRY _commandEntries[] = 
{
    IDM_ABOUT,OnAbout,
    IDM_EXIT,OnExit
};


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i;
    for(i = 0;i < dim(_messageEntries);i++)
        if(message == _messageEntries[i].nMessage)
            return (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);
    return DefWindowProc(hWnd,message,wParam,lParam);
}

LONG OnCommand(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    for(int i =0;i<dim(_commandEntries);i++)
        if(LOWORD(wParam) == _commandEntries[i].nMessage)
            return (*_commandEntries[i].pfn)(hWnd,message,wParam,lParam);
    return DefWindowProc(hWnd,message,wParam,lParam);
}

LONG OnCreate(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
}

LONG OnAbout(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
}

...

這樣WndPorc和OnCommand永遠不變。每當處理新消息的時候給結構體裏面加元素就好了多線程

Windows 程序的生與死

windows程序生與死\模塊化

空間時間的處理OnIdle

空間時間是指」系統中沒以任何消息等待處理「的時間。空間時間經常發生,不要認爲你鼠標移動時產生一大堆WM_MOUSEMOVE消息,事實上夾雜在每個WM_MOUSEMOVE之間就可能存在許多空間時間。畢竟,計算機速度超乎想象。函數

後臺工做最適宜在空閒時間作,傳送sdk程序若是要處理空間時間,能夠如下循環取代WinMain中的消息循環。ui

while(TRUE)
{
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
        if(mes.message == WM_QUIT)
            break;
        TranslateMessage(&msg);
        DispatchMessage(&msg)
    }
    else
        OnIdle();
}

什麼是 C Runtime 函數庫的多線程版本

當 C Runtime函數庫與20世紀70年代出來時 pc 容量不多,多任務是個新奇觀念,更別提多線程了。所以當時產品基礎所演化的 c runtime函數庫在多線程的表現上出現了嚴重問題。沒法被多線程程序調用 。
利用更種同步機制 如 critcal section mutex semaphore event 能夠從新開發一套支持多線程的runtime 函數庫。問題是加上這樣的能力可能致使程序代碼大小和執行效率都遭受不良的波及----即便你只激活了一個線程。spa

VC++的折衷方案是提供兩種版本的 c runtime函數庫。一種版本給單線程使用,一種版本給多線程程序使用。多線程版本的重大改變是第1、變量加errno者如今變成每一個線程擁有一個,第2、多線程版本中的數據結構同步機制加以保護 。操作系統

Vc++一共有六個 c runtime函數庫產品供您選擇

  • Single-Threaded(static) libc.lib
  • Mutithreaded(static)   libcmt.lib
  • mutithread dll msvcrt.lib
  • debug single-threaded(static) libcd.lib
  • debug mutithreaded(static) libcmtd.lib
  • debug mutithread dll msvcrtd.lib

VC++編譯器提供如下選項,讓咱們決定使用哪個 c runtime函數庫

  • /ML Single-threaded(static)
  • /MT Mutithread (static)
  • /MD Mutithread dll (dynamic import libray)
  • /MLD debug single-thread(static)
  • /MTD debug mutithread(static)
  • /MDD debug mutithread dll(dynamic import libray)
相關文章
相關標籤/搜索