dll 入口函式

minggoddess發表於2014-04-21
http://support.microsoft.com/kb/815065/zh-cn

// SampleDLL.cpp // #include "stdafx.h" #define EXPORTING_DLL #include "sampleDLL.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } void HelloWorld() { MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK); }
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H

#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif

#endif

下面的程式碼是一個“Win32 應用程式”專案的示例,該示例呼叫 SampleDLL DLL 中的匯出 DLL 函式。

// SampleApp.cpp 
//

#include "stdafx.h"
#include "sampleDLL.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{ 	
	HelloWorld();
	return 0;
}

注意:在載入時動態連結中,您必須連結在生成 SampleDLL 專案時建立的 SampleDLL.lib 匯入庫。

在執行時動態連結中,您應使用與以下程式碼類似的程式碼來呼叫 SampleDLL.dll 匯出 DLL 函式。

...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;

hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
    HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
    if (HelloWorld != NULL)
        (HelloWorld);

    fFreeDLL = FreeLibrary(hinstDLL);
}
...

當您編譯和連結 SampleDLL 應用程式時,Windows 作業系統將按照以下順序在下列位置中搜尋 SampleDLL DLL:

    1. 應用程式資料夾
    2. 當前資料夾
    3. Windows 系統資料夾

      注意GetSystemDirectory 函式返回 Windows 系統資料夾的路徑。
    4. Windows 資料夾

      注意GetWindowsDirectory 函式返回 Windows 資料夾的路徑。

dll檔案裡面,有一個入口函式dllmain

另一個函式helloworld,供主調函式使用,並不出現在入口函式中

相關文章