青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

DLL編程講解

本文介紹一點關于DLL的基礎知識,如果你是系統(tǒng)編程的高手就不要看了。
先介紹些DLL的基礎知識。DLL(Dynamic Link Library:動態(tài)鏈接庫)其實這個東西就是把一些經(jīng)常要用的代碼塊編譯完后放在磁盤上,當有應用程序需要其中的功能時,就把DLL文件映射到自己的進程空間中然后根據(jù)DLL中的輸出符號來加載其中的功能代碼,完成一定的功能。這就有點像C標準函數(shù)庫。
這樣做的好處可用有以下幾點。
1.節(jié)省了系統(tǒng)資源。
2.一次編譯,多個進程可用多次調(diào)用。
3.就是一個應用程序你可以用C++實現(xiàn),但C++實現(xiàn)的程序卻可用調(diào)用其他語言寫的DLL文件。

下面介紹一下具體的DLL的編寫和調(diào)用。

1.DLL的編寫其實很我們正常的應用的程序的編寫基本上是差不多的。
比如有一個功能函數(shù)是
int Add(int nLeft ,int nRight)

        g_nResult 
= nLeft + nRight;

        
return  g_nResult;
}
  

我們可用把它寫入正常的應用程序,也可用把它直接的寫如DLL文件中。

2.DLL的調(diào)用,調(diào)用DLL文件有兩種方法一種是顯式的加載和隱式的加載。

下面先來看看隱示的加載DLL。
(需要兩個文件一個DLL.DLL,另一個是install.exe)

我們先來建立一個名為mydll的DLL工程,我用的是VC 6.0。
新件工程->WIN32 Dynamic Link Library。不要選擇MFC的DLL工程。
然后選擇AN EMPTY DLL PROJECT,接下來一路OK。
這樣我們就建立了一個空的DLL工程了。
接下在其中建立mydll.dll和mydll.h文件。
寫下如下代碼:
//
//mydll.h
//首先必須創(chuàng)建一個頭文件,它包含你想要從DLL輸出的函數(shù)原型、結構和符號。
//
//DLL的所有源代碼模塊均包含該頭文件,以幫助創(chuàng)建DLL。

#ifdef MYLIBAPI

#else

#define MYLIBAPI extern"C" __declspec(dllimport)
//這個地方是為了,不改變DLL在被進行C++編譯時改變各種符號

#endif

//變量和函數(shù)的聲明
MYLIBAPI int g_nResult;

MYLIBAPI
int Add(int nLeft, int nRight);
//---------------------------the end-------------------------


//
//mydll.cpp
//
#include <windows.h>
#include
"mydll.h"

#define MYLIBAPI extern "C" __declspec(dllexport)

//函數(shù)和變量的具體定義

int g_nResult;

int Add(int nLeft ,int nRight)
{
g_nResult
= nLeft + nRight;

return g_nResult;
}


//-----------------------the end---------------------------------

編譯這個工程,就可用得到DLL.DLL文件了。




然后建立一個明為“install”的控制臺工程,在其中建立install.cpp和install.h兩個文件。
寫入如下代碼:
//
//install.h
//
//其實這個文件和前面的DLL工程里面的mydll.h文件的是一樣的

#ifdef MYLIBAPI

#else

#define MYLIBAPI extern"C" __declspec(dllimport)
//這個地方是為了,不改變DLL在被進行C++編譯時改變各種符號

#endif

//變量和函數(shù)的聲明
MYLIBAPI int g_nResult;

MYLIBAPI
int Add(int nLeft, int nRight);
//---------------------------the end-------------------------

//
//install.cpp
//
//這個文件是調(diào)用DLL內(nèi)提供的函數(shù)的,應用程序。
//
//這個調(diào)用方式是一中“隱式的調(diào)用”,這種方是從系統(tǒng)默認的幾個路徑去找,DLL文件。
//缺少了程序的靈活性
//
#include <windows.h>
#include
"install.h"

#pragma comment(lib,
"mydll.lib")
//這個LIB文件是編譯DLL時產(chǎn)生的,在DLL工程的DEBUG文件夾里可用找到。
//mydll.lib里面是DLL文件對外輸出的接口符號

int main()
{
int nLeft =10,nRight = 25;

TCHAR sz[
100];
wsprintf(sz,TEXT(
"%d + %d = %d"),nLeft, nRight,Add(nLeft,nRight));
MessageBox (NULL,sz, TEXT(
"Last Result"),MB_OK);

wsprintf(sz,TEXT(
"GXTER:%d"), g_nResult);
MessageBox(NULL,sz,TEXT(
"GXTER"),MB_OK);

return 0;
}

//------------------------the end--------------------
編譯后就可用得到install.exe文件了。

然后把mydll.dll和install.exe放在一起就可以,運行install.exe就可以看到調(diào)用DLL的函數(shù)的效果。
順便說一下隱式加載DLL的默認路徑
1) 包含可執(zhí)行映像文件的目錄。
2) 進程的當前目錄。
3) Wi n d o w s系統(tǒng)目錄。
4) Wi n d o w s目錄。
5) PAT H環(huán)境變量中列出的各個目錄。

下面先來看看顯式的加載DLL。
(需要如下兩個文件in.exe和dl.dll)

建立一個名為dl的DLL工程,然后新建dl.cpp文件代碼如下:
//
//dl.cpp
//
#include <windows.h>
#include
<stdio.h>

int my_fun();

BOOL WINAPI DllMain(HINSTANCE histdll,
//
DWORD fdw, //系統(tǒng)調(diào)用/卸載時傳遞的消息
PVOID fim) //傳進DLLMAIN內(nèi)的參數(shù)
{
switch(fdw)
{
case DLL_PROCESS_ATTACH: //當系統(tǒng)加載一個這個DLL文件時就會給出這消息
my_fun(); //然后會執(zhí)行my_fun()函數(shù)
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}


return 1; //發(fā)現(xiàn)的一個問題就,這個返回值一定要為1,不能為0。
//不然就會出現(xiàn)一個問題,DLL被加載,但LoadLibrary(dll_path);
//這個函數(shù)會返回NULL。錯誤代碼為1114(系統(tǒng)加載DLL文件失敗)。
}


int my_fun()
{
printf(
"這里填加功能函數(shù)代碼!");

return 0;
}

//------------------------the end------------------------------
編譯得到dl.dll文件

新建一個名為“in”控制臺工程,然后建立一個 in.cpp
//
//in.cpp
//
#include <windows.h>
#include
<stdio.h>

int main()
{
int error;
char exe_path[512] ="\0";
HINSTANCE hdll_lib;
char * dll_path ="dl.dll"; //dll文件的路徑

//加載一個DLL
hdll_lib = LoadLibrary(dll_path);
if(hdll_lib == NULL)
{
error
= GetLastError();
printf(
"error = %d",error);
}


//獲得正在運行的程序的路徑 + 文件名,前提是獲得了這個程序的句柄
GetModuleFileName(hdll_lib,exe_path,sizeof(exe_path));
printf(
"\n%s\n",exe_path);

//顯式的加載一個DLL的輸出符號。
//GetProcAddress(hdll_lib , "my_fun");

//判斷是否加載了某個DLL
hdll_lib = GetModuleHandle(dll_path);
if(hdll_lib == NULL)
{
printf(
"lksjdflkjsf");
hdll_lib
= LoadLibrary(dll_path);
}


//卸載一個DLL
FreeLibrary(hdll_lib);

getchar();
return 0;
}

//--------------------------the end-------------------------

編譯后得到in.exe文件

然后把得到的in.exe和dl.dll文件放在同一目錄下。運行in.exe就可用看到顯式加載DLL的效果。


本問只涉及到了DLL編程的基礎部分,一些深入的概念都沒有具體的講解. 如有錯誤還請通過E-MAIL告訴我。
以后會講些DLL編程的高級部分。


By Gxter
http://www.safechina.net
Gxter at sogou dot com

參考:
MSDN 2000版
《WINDOWS 核心編程》

posted on 2006-05-08 17:51 楊粼波 閱讀(517) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线免费观看视频| 欧美激情第二页| 欧美日韩国内自拍| 一区二区精品在线观看| 久久精品午夜| 性做久久久久久久久| 欧美/亚洲一区| 亚洲综合三区| 99v久久综合狠狠综合久久| 国产一区二区黄| 欧美日韩午夜在线| 久久久水蜜桃| 亚洲欧美日韩综合aⅴ视频| 亚洲精品日韩在线| 亚洲国产成人不卡| 久久精品亚洲一区二区三区浴池 | 亚洲精选一区| 欧美成人精品1314www| 小黄鸭精品密入口导航| 亚洲永久免费观看| 中文在线资源观看网站视频免费不卡 | 国产欧美精品日韩区二区麻豆天美 | 农村妇女精品| 女主播福利一区| 欧美激情乱人伦| 麻豆91精品| 裸体一区二区三区| 美女精品一区| 欧美aa在线视频| 欧美成黄导航| 欧美韩日视频| 欧美视频一区二区三区| 亚洲经典在线看| 日韩一区二区免费看| 艳妇臀荡乳欲伦亚洲一区| 亚洲免费中文字幕| 亚洲自拍电影| 亚洲欧美变态国产另类| 亚洲一区二区欧美| 亚洲一区精品视频| 久久精品亚洲乱码伦伦中文| 久久久久久久网站| 免费欧美日韩| 亚洲国产日韩欧美在线99| 亚洲天堂免费观看| 欧美a级理论片| 欧美福利一区二区| 欧美顶级艳妇交换群宴| 一本久久精品一区二区| 亚洲综合激情| 欧美激情精品久久久久久黑人| 日韩视频中文字幕| 9色精品在线| 午夜精彩国产免费不卡不顿大片| 久久精品卡一| 欧美久久一级| 久久久久久97三级| 欧美高清视频在线播放| 欧美极品一区| 国产亚洲一区在线| 欧美性片在线观看| 黑人中文字幕一区二区三区| 亚洲国产激情| 亚洲免费一区二区| 欧美jizz19hd性欧美| 亚洲精品日韩久久| 亚洲午夜羞羞片| 性色av香蕉一区二区| 免费观看在线综合色| 日韩视频免费| 久久久免费av| 国产精品国产福利国产秒拍 | 国产精品一区免费视频| 亚洲调教视频在线观看| 久久色在线播放| 国产欧美日韩精品一区| 亚洲精品中文在线| 久久精品亚洲一区| 久久精品一区二区| 久久久国产亚洲精品| 亚洲国产一区二区视频| 久久精品国产99精品国产亚洲性色 | 国产精品每日更新| 国产精品国产三级国产aⅴ入口| 黄色精品网站| 久久激情视频久久| 日韩亚洲不卡在线| 久久国产免费看| 欧美日韩三级在线| 国产日韩欧美91| 久久一区二区精品| 欧美女主播在线| 久久九九久精品国产免费直播| 久久久久久亚洲综合影院红桃| 久久免费精品日本久久中文字幕| 亚洲欧洲在线观看| 亚洲小说欧美另类婷婷| 激情丁香综合| 中文日韩电影网站| 亚洲国产美女精品久久久久∴| 一本久久a久久精品亚洲| 国产一区免费视频| 99精品久久久| 亚洲第一天堂无码专区| 亚洲永久免费观看| 99精品国产热久久91蜜凸| 欧美一级视频| 午夜国产精品视频| 欧美日本不卡高清| 欧美国产先锋| 狠狠色狠狠色综合系列| 亚洲综合欧美| 一区二区欧美日韩| 欧美va日韩va| 免费在线观看日韩欧美| 国产日产精品一区二区三区四区的观看方式 | 国产视频一区在线观看一区免费| 亚洲国产91色在线| 国内在线观看一区二区三区 | 欧美成人精品激情在线观看 | 亚洲国产视频一区二区| 性久久久久久久久久久久| 亚洲午夜一区二区| 欧美区二区三区| 亚洲日本乱码在线观看| 91久久精品一区| 久久综合久久综合久久| 欧美不卡在线视频| 亚洲国产一区在线| 美女国内精品自产拍在线播放| 久久免费精品视频| 国产亚洲福利| 先锋影院在线亚洲| 欧美一区二区黄| 国产区在线观看成人精品| 性色av香蕉一区二区| 久久久久免费| 亚洲国产精品t66y| 日韩视频久久| 欧美精品日日鲁夜夜添| 亚洲精选在线观看| 亚洲午夜av在线| 国产精品二区二区三区| 亚洲一区国产精品| 久久精品亚洲一区二区| 国外成人在线视频网站| 久久男人av资源网站| 欧美激情网站在线观看| 一区二区三区欧美| 午夜精品久久一牛影视| 欧美一级视频精品观看| 国产无遮挡一区二区三区毛片日本| 亚洲主播在线| 蜜乳av另类精品一区二区| 亚洲精华国产欧美| 欧美视频在线观看| 午夜精品视频在线观看| 你懂的网址国产 欧美| 亚洲国产婷婷综合在线精品| 欧美a级大片| 亚洲综合精品| 美女久久一区| 亚洲特级毛片| 韩国欧美一区| 欧美国产日本| 一区二区三区欧美在线| 欧美伊人久久久久久久久影院| 精品91在线| 欧美成人伊人久久综合网| 日韩一级欧洲| 久久亚洲春色中文字幕| 亚洲美女在线看| 久久久国产亚洲精品| 夜夜精品视频一区二区| 国产亚洲精品久久久久动| 美女视频黄免费的久久| 中国亚洲黄色| 欧美激情精品久久久久久变态| 9色porny自拍视频一区二区| 国产精品主播| 欧美人与禽性xxxxx杂性| 久久福利影视| 夜夜嗨av一区二区三区| 亚洲日本电影| 极品尤物av久久免费看| 欧美午夜精品久久久久久超碰| 久久久水蜜桃| 午夜天堂精品久久久久| 一本综合精品| 亚洲日本理论电影| 欧美国产一区二区| 久久三级视频| 欧美专区在线观看一区| 中文在线资源观看视频网站免费不卡| 在线观看91精品国产麻豆| 国产伦精品一区二区三区视频孕妇| 欧美激情一二三区| 免费欧美高清视频| 老牛国产精品一区的观看方式| 欧美一区二区精品|