<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MDA之路

    MDA,UML,XML,Eclipse及Java相關(guān)的Blog
    posts - 53, comments - 494, trackbacks - 0, articles - 2
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    DLL編寫(xiě)教程

    Posted on 2007-09-11 22:13 wxb_nudt 閱讀(64597) 評(píng)論(113)  編輯  收藏 所屬分類(lèi): 實(shí)用編程技術(shù)

     

    DLL編寫(xiě)教程

    半年不能上網(wǎng),最近網(wǎng)絡(luò)終于通了,終于可以更新博客了,寫(xiě)點(diǎn)什么呢?決定最近寫(xiě)一個(gè)編程技術(shù)系列,其內(nèi)容是一些通用的編程技術(shù)。例如DLL,COM,Socket,多線(xiàn)程等等。這些技術(shù)的特點(diǎn)就是使用廣泛,但是誤解很多;網(wǎng)上教程很多,但是幾乎沒(méi)有什么優(yōu)質(zhì)良品。我以近幾個(gè)月來(lái)的編程經(jīng)驗(yàn)發(fā)現(xiàn),很有必要好好的總結(jié)一下這些編程技術(shù)了。一來(lái)對(duì)自己是總結(jié)提高,二來(lái)可以方便光顧我博客的朋友。

    好了,廢話(huà)少說(shuō),言歸正傳。第一篇就是《DLL編寫(xiě)教程》,為什么起這么土的名字呢?為什么不叫《輕輕松松寫(xiě)DLL》或者《DLL一日通》呢?或者更nb的《深入簡(jiǎn)出DLL》呢?呵呵,常常上網(wǎng)搜索資料的弟兄自然知道。

    本文對(duì)通用的DLL技術(shù)做了一個(gè)總結(jié),并提供了源代碼打包下載,下載地址為:

    http://www.tkk7.com/Files/wxb_nudt/DLL_SRC.rar

    DLL的優(yōu)點(diǎn)

    簡(jiǎn)單的說(shuō),dll有以下幾個(gè)優(yōu)點(diǎn):

    1)      節(jié)省內(nèi)存。同一個(gè)軟件模塊,若是以源代碼的形式重用,則會(huì)被編譯到不同的可執(zhí)行程序中,同時(shí)運(yùn)行這些exe時(shí)這些模塊的二進(jìn)制碼會(huì)被重復(fù)加載到內(nèi)存中。如果使用dll,則只在內(nèi)存中加載一次,所有使用該dll的進(jìn)程會(huì)共享此塊內(nèi)存(當(dāng)然,像dll中的全局變量這種東西是會(huì)被每個(gè)進(jìn)程復(fù)制一份的)。

    2)      不需編譯的軟件系統(tǒng)升級(jí),若一個(gè)軟件系統(tǒng)使用了dll,則該dll被改變(函數(shù)名不變)時(shí),系統(tǒng)升級(jí)只需要更換此dll即可,不需要重新編譯整個(gè)系統(tǒng)。事實(shí)上,很多軟件都是以這種方式升級(jí)的。例如我們經(jīng)常玩的星際、魔獸等游戲也是這樣進(jìn)行版本升級(jí)的。

    3)      Dll庫(kù)可以供多種編程語(yǔ)言使用,例如用c編寫(xiě)的dll可以在vb中調(diào)用。這一點(diǎn)上DLL還做得很不夠,因此在dll的基礎(chǔ)上發(fā)明了COM技術(shù),更好的解決了一系列問(wèn)題。

    最簡(jiǎn)單的dll

    開(kāi)始寫(xiě)dll之前,你需要一個(gè)c/c++編譯器和鏈接器,并關(guān)閉你的IDE。是的,把你的VCC++ BUILDER之類(lèi)的東東都關(guān)掉,并打開(kāi)你以往只用來(lái)記電話(huà)的記事本程序。不這樣做的話(huà),你可能一輩子也不明白dll的真諦。我使用了VC自帶的cl編譯器和link鏈接器,它們一般都在vcbin目錄下。(若你沒(méi)有在安裝vc的時(shí)候選擇注冊(cè)環(huán)境變量,那么就立刻將它們的路徑加入path吧)如果你還是因?yàn)殡x開(kāi)了IDE而害怕到哭泣的話(huà),你可以關(guān)閉這個(gè)頁(yè)面并繼續(xù)去看《VC++技術(shù)內(nèi)幕》之類(lèi)無(wú)聊的書(shū)了。

    最簡(jiǎn)單的dll并不比chelloworld難,只要一個(gè)DllMain函數(shù)即可,包含objbase.h頭文件(支持COM技術(shù)的一個(gè)頭文件)。若你覺(jué)得這個(gè)頭文件名字難記,那么用windows.H也可以。源代碼如下:dll_nolib.cpp

    #include <objbase.h>

    #include <iostream.h>

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

    {

        HANDLE g_hModule;

        switch(dwReason)

        {

        case DLL_PROCESS_ATTACH:

           cout<<"Dll is attached!"<<endl;

           g_hModule = (HINSTANCE)hModule;

           break;

        case DLL_PROCESS_DETACH:

           cout<<"Dll is detached!"<<endl;

           g_hModule=NULL;

           break;

        }

        return true;

    }

    其中DllMain是每個(gè)dll的入口函數(shù),如同cmain函數(shù)一樣。DllMain帶有三個(gè)參數(shù),hModule表示本dll的實(shí)例句柄(聽(tīng)不懂就不理它,寫(xiě)過(guò)windows程序的自然懂),dwReason表示dll當(dāng)前所處的狀態(tài),例如DLL_PROCESS_ATTACH表示dll剛剛被加載到一個(gè)進(jìn)程中,DLL_PROCESS_DETACH表示dll剛剛從一個(gè)進(jìn)程中卸載。當(dāng)然還有表示加載到線(xiàn)程中和從線(xiàn)程中卸載的狀態(tài),這里省略。最后一個(gè)參數(shù)是一個(gè)保留參數(shù)(目前和dll的一些狀態(tài)相關(guān),但是很少使用)。

    從上面的程序可以看出,當(dāng)dll被加載到一個(gè)進(jìn)程中時(shí),dll打印"Dll is attached!"語(yǔ)句;當(dāng)dll從進(jìn)程中卸載時(shí),打印"Dll is detached!"語(yǔ)句。

    編譯dll需要以下兩條命令:

    cl /c dll_nolib.cpp

    這條命令會(huì)將cpp編譯為obj文件,若不使用/c參數(shù)則cl還會(huì)試圖繼續(xù)將obj鏈接為exe,但是這里是一個(gè)dll,沒(méi)有main函數(shù),因此會(huì)報(bào)錯(cuò)。不要緊,繼續(xù)使用鏈接命令。

    Link /dll dll_nolib.obj

    這條命令會(huì)生成dll_nolib.dll。

    注意,因?yàn)榫幾g命令比較簡(jiǎn)單,所以本文不討論nmake,有興趣的可以使用nmake,或者寫(xiě)個(gè)bat批處理來(lái)編譯鏈接dll。

    加載DLL(顯式調(diào)用)

    使用dll大體上有兩種方式,顯式調(diào)用和隱式調(diào)用。這里首先介紹顯式調(diào)用。編寫(xiě)一個(gè)客戶(hù)端程序:dll_nolib_client.cpp

    #include <windows.h>

    #include <iostream.h>

    int main(void)

    {

        //加載我們的dll

        HINSTANCE hinst=::LoadLibrary("dll_nolib.dll"); 

        if (NULL != hinst)

        {

           cout<<"dll loaded!"<<endl;

        }

        return 0;

    }

    注意,調(diào)用dll使用LoadLibrary函數(shù),它的參數(shù)就是dll的路徑和名稱(chēng),返回值是dll的句柄。 使用如下命令編譯鏈接客戶(hù)端:

    Cl dll_nolib_client.cpp

    并執(zhí)行dll_nolib_client.exe,得到如下結(jié)果:

    Dll is attached!

    dll loaded!

    Dll is detached!

    以上結(jié)果表明dll已經(jīng)被客戶(hù)端加載過(guò)。但是這樣僅僅能夠?qū)?/span>dll加載到內(nèi)存,不能找到dll中的函數(shù)。

    使用dumpbin命令查看DLL中的函數(shù)

    Dumpbin命令可以查看一個(gè)dll中的輸出函數(shù)符號(hào)名,鍵入如下命令:

    Dumpbin –exports dll_nolib.dll

    通過(guò)查看,發(fā)現(xiàn)dll_nolib.dll并沒(méi)有輸出任何函數(shù)。

    如何在dll中定義輸出函數(shù)

    總體來(lái)說(shuō)有兩種方法,一種是添加一個(gè)def定義文件,在此文件中定義dll中要輸出的函數(shù);第二種是在源代碼中待輸出的函數(shù)前加上__declspec(dllexport)關(guān)鍵字。

    Def文件

    首先寫(xiě)一個(gè)帶有輸出函數(shù)的dll,源代碼如下:dll_def.cpp

    #include <objbase.h>

    #include <iostream.h>

    void FuncInDll (void)

    {

        cout<<"FuncInDll is called!"<<endl;

    }

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

    {

        HANDLE g_hModule;

        switch(dwReason)

        {

        case DLL_PROCESS_ATTACH:

           g_hModule = (HINSTANCE)hModule;

           break;

        case DLL_PROCESS_DETACH:

            g_hModule=NULL;

            break;

        }

        return TRUE;

    }

    這個(gè)dlldef文件如下:dll_def.def

    ;

    ; dll_def module-definition file

    ;

    LIBRARY         dll_def.dll

    DESCRIPTION     '(c)2007-2009 Wang Xuebin'

    EXPORTS

                    FuncInDll @1 PRIVATE

    你會(huì)發(fā)現(xiàn)def的語(yǔ)法很簡(jiǎn)單,首先是LIBRARY關(guān)鍵字,指定dll的名字;然后一個(gè)可選的關(guān)鍵字DESCRIPTION,后面寫(xiě)上版權(quán)等信息(不寫(xiě)也可以);最后是EXPORTS關(guān)鍵字,后面寫(xiě)上dll中所有要輸出的函數(shù)名或變量名,然后接上@以及依次編號(hào)的數(shù)字(從1N),最后接上修飾符。

    用如下命令編譯鏈接帶有def文件的dll

    Cl /c dll_def.cpp

    Link /dll dll_def.obj /def:dll_def.def

    再調(diào)用dumpbin查看生成的dll_def.dll

    Dumpbin –exports dll_def.dll

    得到如下結(jié)果:

    Dump of file dll_def.dll

    File Type: DLL

     Section contains the following exports for dll_def.dll

               0 characteristics

        46E4EE98 time date stamp Mon Sep 10 15:13:28 2007

            0.00 version

               1 ordinal base

               1 number of functions

               1 number of names

        ordinal hint RVA      name

              1    0 00001000 FuncInDll

     Summary

            2000 .data

            1000 .rdata

            1000 .reloc

            6000 .text

    觀(guān)察這一行

              1    0 00001000 FuncInDll

    會(huì)發(fā)現(xiàn)該dll輸出了函數(shù)FuncInDll。

    顯式調(diào)用DLL中的函數(shù)

    寫(xiě)一個(gè)dll_def.dll的客戶(hù)端程序:dll_def_client.cpp

    #include <windows.h>

    #include <iostream.h>

    int main(void)

    {

        //定義一個(gè)函數(shù)指針

        typedef void (* DLLWITHLIB )(void); 

        //定義一個(gè)函數(shù)指針變量

        DLLWITHLIB pfFuncInDll = NULL; 

        //加載我們的dll

        HINSTANCE hinst=::LoadLibrary("dll_def.dll"); 

        if (NULL != hinst)

        {

           cout<<"dll loaded!"<<endl;

        }

        //找到dllFuncInDll函數(shù)

        pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll"); 

        //調(diào)用dll里的函數(shù)

        if (NULL != pfFuncInDll)

        {

           (*pfFuncInDll)();  

        }

        return 0;

    }

    有兩個(gè)地方值得注意,第一是函數(shù)指針的定義和使用,不懂的隨便找本c++書(shū)看看;第二是GetProcAddress的使用,這個(gè)API是用來(lái)查找dll中的函數(shù)地址的,第一個(gè)參數(shù)是DLL的句柄,即LoadLibrary返回的句柄,第二個(gè)參數(shù)是dll中的函數(shù)名稱(chēng),即dumpbin中輸出的函數(shù)名(注意,這里的函數(shù)名稱(chēng)指的是編譯后的函數(shù)名,不一定等于dll源代碼中的函數(shù)名)。

    編譯鏈接這個(gè)客戶(hù)端程序,并執(zhí)行會(huì)得到:

    dll loaded!

    FuncInDll is called!

    這表明客戶(hù)端成功調(diào)用了dll中的函數(shù)FuncInDll

    __declspec(dllexport)

    為每個(gè)dll寫(xiě)def顯得很繁雜,目前def使用已經(jīng)比較少了,更多的是使用__declspec(dllexport)在源代碼中定義dll的輸出函數(shù)。

    Dll寫(xiě)法同上,去掉def文件,并在每個(gè)要輸出的函數(shù)前面加上聲明__declspec(dllexport),例如:

    __declspec(dllexport) void FuncInDll (void)

    這里提供一個(gè)dll源程序dll_withlib.cpp,然后編譯鏈接。鏈接時(shí)不需要指定/DEF:參數(shù),直接加/DLL參數(shù)即可,

    Cl /c dll_withlib.cpp

    Link /dll dll_withlib.obj

    然后使用dumpbin命令查看,得到:

    1    0 00001000 ?FuncInDll@@YAXXZ

    可知編譯后的函數(shù)名為?FuncInDll@@YAXXZ,而并不是FuncInDll,這是因?yàn)?/span>c++編譯器基于函數(shù)重載的考慮,會(huì)更改函數(shù)名,這樣使用顯式調(diào)用的時(shí)候,也必須使用這個(gè)更改后的函數(shù)名,這顯然給客戶(hù)帶來(lái)麻煩。為了避免這種現(xiàn)象,可以使用extern “C”指令來(lái)命令c++編譯器以c編譯器的方式來(lái)命名該函數(shù)。修改后的函數(shù)聲明為:

    extern "C" __declspec(dllexport) void FuncInDll (void)

    dumpbin命令結(jié)果:

    1    0 00001000 FuncInDll

    這樣,顯式調(diào)用時(shí)只需查找函數(shù)名為FuncInDll的函數(shù)即可成功。

    extern “C”

    使用extern “C”關(guān)鍵字實(shí)際上相當(dāng)于一個(gè)編譯器的開(kāi)關(guān),它可以將c++語(yǔ)言的函數(shù)編譯為c語(yǔ)言的函數(shù)名稱(chēng)。即保持編譯后的函數(shù)符號(hào)名等于源代碼中的函數(shù)名稱(chēng)。

    隱式調(diào)用DLL

    顯式調(diào)用顯得非常復(fù)雜,每次都要LoadLibrary,并且每個(gè)函數(shù)都必須使用GetProcAddress來(lái)得到函數(shù)指針,這對(duì)于大量使用dll函數(shù)的客戶(hù)是一種困擾。而隱式調(diào)用能夠像使用c函數(shù)庫(kù)一樣使用dll中的函數(shù),非常方便快捷。

    下面是一個(gè)隱式調(diào)用的例子:dll包含兩個(gè)文件dll_withlibAndH.cppdll_withlibAndH.h。

    代碼如下:dll_withlibAndH.h

    extern "C" __declspec(dllexport) void FuncInDll (void);

    dll_withlibAndH.cpp

    #include <objbase.h>

    #include <iostream.h>

    #include "dll_withLibAndH.h"http://看到?jīng)]有,這就是我們?cè)黾拥念^文件

    extern "C" __declspec(dllexport) void FuncInDll (void)

    {

        cout<<"FuncInDll is called!"<<endl;

    }

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

    {

        HANDLE g_hModule;

        switch(dwReason)

        {

        case DLL_PROCESS_ATTACH:

           g_hModule = (HINSTANCE)hModule;

           break;

        case DLL_PROCESS_DETACH:

            g_hModule=NULL;

            break;

        }

        return TRUE;

    }

    編譯鏈接命令:

    Cl /c dll_withlibAndH.cpp

    Link /dll dll_withlibAndH.obj

    在進(jìn)行隱式調(diào)用的時(shí)候需要在客戶(hù)端引入頭文件,并在鏈接時(shí)指明dll對(duì)應(yīng)的lib文件(dll只要有函數(shù)輸出,則鏈接的時(shí)候會(huì)產(chǎn)生一個(gè)與dll同名的lib文件)位置和名稱(chēng)。然后如同調(diào)用api函數(shù)庫(kù)中的函數(shù)一樣調(diào)用dll中的函數(shù),不需要顯式的LoadLibraryGetProcAddress。使用最為方便。客戶(hù)端代碼如下:dll_withlibAndH_client.cpp

    #include "dll_withLibAndH.h"

    //注意路徑,加載 dll的另一種方法是 Project | setting | link 設(shè)置里

    #pragma comment(lib,"dll_withLibAndH.lib")

    int main(void)

    {

        FuncInDll();//只要這樣我們就可以調(diào)用dll里的函數(shù)了

        return 0;

    }

    __declspec(dllexport)__declspec(dllimport)配對(duì)使用

    上面一種隱式調(diào)用的方法很不錯(cuò),但是在調(diào)用DLL中的對(duì)象和重載函數(shù)時(shí)會(huì)出現(xiàn)問(wèn)題。因?yàn)槭褂?/span>extern “C”修飾了輸出函數(shù),因此重載函數(shù)肯定是會(huì)出問(wèn)題的,因?yàn)樗鼈兌紝⒈痪幾g為同一個(gè)輸出符號(hào)串(c語(yǔ)言是不支持重載的)。

    事實(shí)上不使用extern “C”是可行的,這時(shí)函數(shù)會(huì)被編譯為c++符號(hào)串,例如(?FuncInDll@@YAXH@Z ?FuncInDll@@YAXXZ),當(dāng)客戶(hù)端也是c++時(shí),也能正確的隱式調(diào)用。

    這時(shí)要考慮一個(gè)情況:若DLL1.CPP是源,DLL2.CPP使用了DLL1中的函數(shù),但同時(shí)DLL2也是一個(gè)DLL,也要輸出一些函數(shù)供Client.CPP使用。那么在DLL2中如何聲明所有的函數(shù),其中包含了從DLL1中引入的函數(shù),還包括自己要輸出的函數(shù)。這個(gè)時(shí)候就需要同時(shí)使用__declspec(dllexport)__declspec(dllimport)了。前者用來(lái)修飾本dll中的輸出函數(shù),后者用來(lái)修飾從其它dll中引入的函數(shù)。

    所有的源代碼包括DLL1.H,DLL1.CPP,DLL2.H,DLL2.CPP,Client.cpp。源代碼可以在下載的包中找到。你可以編譯鏈接并運(yùn)行試試。

    值得關(guān)注的是DLL1DLL2中都使用的一個(gè)編碼方法,見(jiàn)DLL2.H

    #ifdef DLL_DLL2_EXPORTS

    #define DLL_DLL2_API __declspec(dllexport)

    #else

    #define DLL_DLL2_API __declspec(dllimport)

    #endif

    DLL_DLL2_API void FuncInDll2(void);

    DLL_DLL2_API void FuncInDll2(int);

    在頭文件中以這種方式定義宏DLL_DLL2_EXPORTSDLL_DLL2_API,可以確保DLL端的函數(shù)用__declspec(dllexport)修飾,而客戶(hù)端的函數(shù)用__declspec(dllimport)修飾。當(dāng)然,記得在編譯dll時(shí)加上參數(shù)/D “DLL_DLL2_EXPORTS”,或者干脆就在dllcpp文件第一行加上#define DLL_DLL2_EXPORTS。

    VC生成的代碼也是這樣的!事實(shí)證明,我是抄襲它的,hoho

    DLL中的全局變量和對(duì)象

    解決了重載函數(shù)的問(wèn)題,那么dll中的全局變量和對(duì)象都不是問(wèn)題了,只是有一點(diǎn)語(yǔ)法需要注意。如源代碼所示:dll_object.h

    #ifdef DLL_OBJECT_EXPORTS

    #define DLL_OBJECT_API __declspec(dllexport)

    #else

    #define DLL_OBJECT_API __declspec(dllimport)

    #endif

    DLL_OBJECT_API void FuncInDll(void);

    extern DLL_OBJECT_API int g_nDll;

    class DLL_OBJECT_API CDll_Object {

    public:

        CDll_Object(void);

        show(void);

        // TODO: add your methods here.

    };

    Cpp文件dll_object.cpp如下:

    #define DLL_OBJECT_EXPORTS

    #include <objbase.h>

    #include <iostream.h>

    #include "dll_object.h"

    DLL_OBJECT_API void FuncInDll(void)

    {

        cout<<"FuncInDll is called!"<<endl;

    }

    DLL_OBJECT_API int g_nDll = 9;

    CDll_Object::CDll_Object()

    {

        cout<<"ctor of CDll_Object"<<endl;

    }

    CDll_Object::show()

    {

        cout<<"function show in class CDll_Object"<<endl;

    }

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

    {

        HANDLE g_hModule;

        switch(dwReason)

        {

        case DLL_PROCESS_ATTACH:

           g_hModule = (HINSTANCE)hModule;

           break;

        case DLL_PROCESS_DETACH:

            g_hModule=NULL;

            break;

        }

        return TRUE;

    }

    編譯鏈接完后Dumpbin一下,可以看到輸出了5個(gè)符號(hào):

    1    0 00001040 ??0CDll_Object@@QAE@XZ

     2    1 00001000 ??4CDll_Object@@QAEAAV0@ABV0@@Z

     3    2 00001020 ?FuncInDll@@YAXXZ

     4    3 00008040 ?g_nDll@@3HA

     5    4 00001069 ?show@CDll_Object@@QAEHXZ

    它們分別代表類(lèi)CDll_Object,類(lèi)的構(gòu)造函數(shù),FuncInDll函數(shù),全局變量g_nDll和類(lèi)的成員函數(shù)show。下面是客戶(hù)端代碼:dll_object_client.cpp

    #include "dll_object.h"

    #include <iostream.h>

    //注意路徑,加載 dll的另一種方法是 Project | setting | link 設(shè)置里

    #pragma comment(lib,"dll_object.lib")

    int main(void)

    {

        cout<<"call dll"<<endl;

        cout<<"call function in dll"<<endl;

        FuncInDll();//只要這樣我們就可以調(diào)用dll里的函數(shù)了

        cout<<"global var in dll g_nDll ="<<g_nDll<<endl;

        cout<<"call member function of class CDll_Object in dll"<<endl;

        CDll_Object obj;

        obj.show();

        return 0;

    }

    運(yùn)行這個(gè)客戶(hù)端可以看到:

    call dll

    call function in dll

    FuncInDll is called!

    global var in dll g_nDll =9

    call member function of class CDll_Object in dll

    ctor of CDll_Object

    function show in class CDll_Object

    可知,在客戶(hù)端成功的訪(fǎng)問(wèn)了dll中的全局變量,并創(chuàng)建了dll中定義的C++對(duì)象,還調(diào)用了該對(duì)象的成員函數(shù)。

    中間的小結(jié)

    牢記一點(diǎn),說(shuō)到底,DLL是對(duì)應(yīng)C語(yǔ)言的動(dòng)態(tài)鏈接技術(shù),在輸出C函數(shù)和變量時(shí)顯得方便快捷;而在輸出C++類(lèi)、函數(shù)時(shí)需要通過(guò)各種手段,而且也并沒(méi)有完美的解決方案,除非客戶(hù)端也是c++。

    記住,只有COM是對(duì)應(yīng)C++語(yǔ)言的技術(shù)。

    下面開(kāi)始對(duì)各各問(wèn)題一一小結(jié)。

    顯式調(diào)用和隱式調(diào)用

    何時(shí)使用顯式調(diào)用?何時(shí)使用隱式調(diào)用?我認(rèn)為,只有一個(gè)時(shí)候使用顯式調(diào)用是合理的,就是當(dāng)客戶(hù)端不是C/C++的時(shí)候。這時(shí)是無(wú)法隱式調(diào)用的。例如用VB調(diào)用C++寫(xiě)的dll。(VB我不會(huì),所以沒(méi)有例子)

    Def__declspec(dllexport)

    其實(shí)def的功能相當(dāng)于extern “C” __declspec(dllexport),所以它也僅能處理C函數(shù),而不能處理重載函數(shù)。而__declspec(dllexport)__declspec(dllimport)配合使用能夠適應(yīng)任何情況,因此__declspec(dllexport)是更為先進(jìn)的方法。所以,目前普遍的看法是不使用def文件,我也同意這個(gè)看法。

    從其它語(yǔ)言調(diào)用DLL

    從其它編程語(yǔ)言中調(diào)用DLL,有兩個(gè)最大的問(wèn)題,第一個(gè)就是函數(shù)符號(hào)的問(wèn)題,前面已經(jīng)多次提過(guò)了。這里有個(gè)兩難選擇,若使用extern “C”,則函數(shù)名稱(chēng)保持不變,調(diào)用較方便,但是不支持函數(shù)重載等一系列c++功能;若不使用extern “C”,則調(diào)用前要查看編譯后的符號(hào),非常不方便。

    第二個(gè)問(wèn)題就是函數(shù)調(diào)用壓棧順序的問(wèn)題,即__cdecl__stdcall的問(wèn)題。__cdecl是常規(guī)的C/C++調(diào)用約定,這種調(diào)用約定下,函數(shù)調(diào)用后棧的清理工作是由調(diào)用者完成的。__stdcall是標(biāo)準(zhǔn)的調(diào)用約定,即這些函數(shù)將在返回到調(diào)用者之前將參數(shù)從棧中刪除。

    這兩個(gè)問(wèn)題DLL都不能很好的解決,只能說(shuō)湊合著用。但是在COM中,都得到了完美的解決。所以,要在Windows平臺(tái)實(shí)現(xiàn)語(yǔ)言無(wú)關(guān)性,還是只有使用COM中間件。

    總而言之,除非客戶(hù)端也使用C++,否則dll是不便于支持函數(shù)重載、類(lèi)等c++特性的。DLL對(duì)c函數(shù)的支持很好,我想這也是為什么windows的函數(shù)庫(kù)使用Cdll實(shí)現(xiàn)的理由之一。

    VC中編寫(xiě)DLL

    VC中創(chuàng)建、編譯、鏈接dll是非常方便的,點(diǎn)擊fileàNewàProjectàWin32 Dynamic-Link Library,輸入dll名稱(chēng)dll_InVC然后點(diǎn)擊確定。然后選擇A DLL that export some symbols,點(diǎn)擊Finish。即可得到一個(gè)完整的DLL。

    仔細(xì)觀(guān)察其源代碼,是不是有很多地方似曾相識(shí)啊,哈哈!

    最后

    貼上女兒近照一張,小家伙長(zhǎng)得太快了!

    評(píng)論共2頁(yè): 1 2 下一頁(yè) 

    評(píng)論

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-12-10 14:09 by zz
    很好.拜一下
    已轉(zhuǎn)到我博客,已注明作者與原文鏈接

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-11 12:58 by wxb_nudt
    @zz
    好的,謝謝!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-11 21:54 by 蘇三
    恩 ,寫(xiě)的很好。期待。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-14 12:30 by dAYu
    非常好,謝謝!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-19 01:02 by xx
    很有啟發(fā),拜讀了,謝謝

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-21 11:40 by jjlsky
    非常感謝
    讓我對(duì)dll的編制過(guò)程有所理解
    有待實(shí)踐
    呵呵

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2007-12-27 10:53 by 1211
    我靠,寫(xiě)的太好了,比一些垃圾書(shū)上面寫(xiě)得好多了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-01-11 17:04 by hitma
    走來(lái)又飄走。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-01-31 02:56 by samwon
    四個(gè)字:豁然開(kāi)朗!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-02-13 19:04 by
    內(nèi)容很好 但是.....能否換個(gè)歌 第一次打開(kāi)我還以為電腦又中毒了 嚇?biāo)牢伊?/div>

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-02-23 14:20 by wenjiahe
    從Google搜到你這片文章,寫(xiě)的太好了。
    加入收藏夾了,希望盡快看到你關(guān)于com技術(shù)的高論。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-03-10 20:43 by jef
    樓主在國(guó)防科大上學(xué)和工作的,博士學(xué)歷

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-03-13 11:16 by wangcheng
    雖然有這么多人說(shuō)寫(xiě)得好,但我還是得說(shuō):"真得寫(xiě)的非常好!!"

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-03-19 10:30 by deadjn
    玩得夠透了,佩服!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-03-20 14:39 by kris
    寫(xiě)得太好了,我查了很多資料,這篇文章寫(xiě)得既有條理,有清晰,果然是大作啊

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-02 08:28 by Ulti
    呵呵,文美,照片也美

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-08 13:11 by 王俊華
    寫(xiě)的非常好!謝謝!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-08 16:30 by 白狐
    Thanks !

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-13 22:27 by ziffwong
    清晰明了,非常不錯(cuò)。3x!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-14 00:16 by 陳帥
    十分感謝。。。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-04-17 15:14 by Alexander
    博主寫(xiě)得好!最后的方法是不是把所有DLL中的全局符號(hào)都輸出了?

    # 求教  回復(fù)  更多評(píng)論   

    2008-04-20 15:37 by 逍遙郁悶
    現(xiàn)在在網(wǎng)上查資料的時(shí)候很郁悶,最近想寫(xiě)一個(gè)能傳入和傳入字符串的DLL,可是我發(fā)現(xiàn)網(wǎng)上那個(gè)有關(guān)DLL編程的帖子全用int來(lái)舉例,有沒(méi)有那位大哥來(lái)一個(gè)string,CString,String之類(lèi)的,哪怕你傳入和傳出數(shù)組也行。。。。。郁悶。
    這位大哥你能不能在抽點(diǎn)時(shí)間寫(xiě)一個(gè)能在電腦上注冊(cè)的DLL,用你說(shuō)的這些方法寫(xiě)的DLL都無(wú)法注冊(cè),不能注冊(cè)使用的時(shí)候非常不方便。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-05-04 18:02 by wycoo
    謝謝啊

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-05-28 21:54 by pzy123cn
    現(xiàn)在在網(wǎng)上查資料的時(shí)候很郁悶,最近想寫(xiě)一個(gè)能傳入和傳入字符串的DLL,可是我發(fā)現(xiàn)網(wǎng)上那個(gè)有關(guān)DLL編程的帖子全用int來(lái)舉例,有沒(méi)有那位大哥來(lái)一個(gè)string,CString,String之類(lèi)的,哪怕你傳入和傳出數(shù)組也行。。。。。郁悶。
    這位大哥你能不能在抽點(diǎn)時(shí)間寫(xiě)一個(gè)能在電腦上注冊(cè)的DLL,用你說(shuō)的這些方法寫(xiě)的DLL都無(wú)法注冊(cè),不能注冊(cè)使用的時(shí)候非常不方便。


    我前幾天也遇到了這個(gè)問(wèn)題 , 我的解決方法是用指針

    在.h文件中定義

    extern "C" void __declspec(dllexport) SetTestS(char * s);
    extern "C" __declspec(dllexport) char * GetTestS();

    在cpp中:

    char * tests= 0; // 全局變量
    char * GetTestS()
    {
    //獲得tests的值
    return tests ;
    }
    void SetTestS(char * s)
    {
    //設(shè)置tests
    tests = s ;
    }

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-06-18 17:45 by zache
    不是所有的DLL都能注冊(cè)的,能注冊(cè)是DLL要實(shí)現(xiàn)DllRegisterServer函數(shù)
    RegSvr32只是調(diào)用該函數(shù)而已。你說(shuō)的恐怕是COM了,那又是個(gè)大課題

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-07-16 17:34 by oo
    謝謝樓主啊

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-07-21 11:45 by oo
    受益匪淺啊!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-07-25 13:54 by daodao
    不是很懂,但感覺(jué)寫(xiě)的不錯(cuò)!
    謝謝樓主!你的女兒看起來(lái)很聰明.

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-07-29 14:54 by mangshe0
    好!寫(xiě)的太好了!謝謝樓主,我看了一下午,學(xué)到了很多東西。真的感謝您.

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-07-29 15:56 by jiejie
    十分感激

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-08-22 10:40 by YMM
    真是好文啊。這個(gè)才是偶需要的,好文!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-09-02 16:45 by huhusu
    很好的文章 謝謝!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-09-12 15:37 by piit
    再怎么感謝你也無(wú)法表達(dá)我對(duì)你的感激之情啊,祝你全家幸福!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-09-20 22:33 by 小松
    寫(xiě)的漂亮,小姑娘更漂亮

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-11-17 11:07 by joe
    很好的文章 謝謝!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-12-15 13:20 by 編程愛(ài)好者
    感謝樓主的無(wú)私奉獻(xiàn)!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-12-25 10:52 by lianyi
    盡管該說(shuō)的別人都說(shuō)了,可是我還是忍不住要說(shuō)一句:寫(xiě)得實(shí)在太好了!我太佩服你了!我將你的博客珍藏了,以后努力向你學(xué)習(xí)!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2008-12-30 22:18 by lyl0719
    真的不錯(cuò),謝謝你。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2009-01-06 12:26 by h
    怎一個(gè)強(qiáng)字了得………………

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-02-09 20:29 by 胡致璘
    寫(xiě)得太好了。
    我曾花了近一個(gè)星期的時(shí)間去找有關(guān)DLL編程的資料。找到了一堆資料,亂七八糟的,今看了你的文章之后我對(duì)DLL編程豁然開(kāi)朗

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-02-16 20:12 by 123
    這里好像是武漢的中山公園呀
    1

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2009-02-17 22:02 by wxb_nudt
    @123
    錯(cuò)了,是北京動(dòng)物園?。?/div>

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-02-26 10:28 by kook@21cn.com
    樓上的文章寫(xiě)的太好了,該贊的大家都已贊完。
    我給你發(fā)了封EMAIL,沒(méi)等到你的回復(fù),大概意思在這里說(shuō)一下,有一個(gè)DLL,沒(méi)有原文件,只有.h和.lib文件,實(shí)現(xiàn)功能有:socket通信,最重要是實(shí)現(xiàn)了一個(gè)通用的打包解包功能,其他功能還有指定線(xiàn)程數(shù),短聯(lián)接長(zhǎng)聯(lián)接,滑動(dòng)窗口控制,UDP,回調(diào)函數(shù)等,其性能非常卓越,公司每日幾千萬(wàn)的吞吐量。我學(xué)著重寫(xiě)了一遍,源碼沒(méi)勇氣拿出手,只有樓主這水平的重寫(xiě)一遍才行,在博客上發(fā)出來(lái)供大家學(xué)習(xí),保證是一篇非常好的博文。
    頭文件怎么給你?
    歡迎有樓主這水平的人參與,kook@21cn.com 聯(lián)系。

    說(shuō)不寫(xiě)我家小子可以和樓主千金訂個(gè)娃娃親,haha。照片如下:
    http://photo.163.com/photo/youless1/#m=1&ai=27240730&p=1&n=60&cp=1

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-04-22 16:37 by 11
    非常感謝,比一些破書(shū)上的好多了!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-04-22 16:37 by 11
    非常感謝,比一些破書(shū)上的好多了!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-06-14 15:44 by 零魂
    寫(xiě)的太好了,雖然看到該贊的大家都已經(jīng)贊完了,不過(guò)我還是忍不住要頂一下。
    我心中的很多疑惑基本在你這一篇文章里面全給解答了....

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-06-27 20:14 by WwcMonkey
    呵呵,很樸實(shí)、實(shí)用的入門(mén)文章
    總算開(kāi)了個(gè)頭, 謝了!

    期待更多大作

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2009-07-23 00:11 by Master Wei
    好不容易找到這篇文章的原始地址
    特趕來(lái)道謝
    教程寫(xiě)得太好了

    # 怎么編譯?  回復(fù)  更多評(píng)論   

    2009-09-02 21:55 by dll
    怎么弄?是在命令行里面寫(xiě)命令,還是什么?

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-02-21 14:48 by 慢步者
    支持好文!

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2010-02-23 22:20 by 蕭何
    我感動(dòng)的淚流滿(mǎn)面,謝謝博主

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-02-26 13:33 by 水辰
    特來(lái)登門(mén)道謝!文章不是一般的好

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2010-02-26 14:08 by wxb_nudt
    @蕭何
    內(nèi)牛滿(mǎn)面夸張了點(diǎn)吧,哈哈,大家新年好。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-03-18 16:42 by lizhi
    寫(xiě)了那么多年的程序,還搞不大清楚,真的汗顏,樓主寫(xiě)的明了清晰

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-04-20 10:39 by epinszteinic
    兩個(gè)字:NB?。。。?br>寫(xiě)得真是太好了?。。?!
    感激之情猶如滔滔江水?。。。?br>趕緊存下來(lái)!!!!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-07-26 14:16 by zz_yun
    博主事業(yè)有成,生活幸福??!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-08-26 15:56 by shirui
    太感謝樓主了,寫(xiě)得太好了,可為什么我下載源代碼的時(shí)候沒(méi)速度呢,嗚嗚~~~~(>_<)~~~~ ,能不能把源代碼發(fā)到我郵箱一份,我的郵箱地址是shiruiyiruo@msn.cn
    非常感謝

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-09-20 14:48 by 柯南
    感謝樓主的教程

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2010-12-04 00:42 by 感謝祖國(guó)
    看完樓主的教程。。解開(kāi)了我以前很多的疑惑。。樓主可否推薦幾本書(shū),多想。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-01-01 13:28 by kingbird
    好,比那些以上來(lái)就教我用IDE寫(xiě)DLL的強(qiáng)多了,他們以為會(huì)用就好,可是我怎么也不能理解,我覺(jué)得編程人員向成為高手,就要從最樸實(shí)開(kāi)始。。。。遠(yuǎn)離IDE,成就高手。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2011-01-04 16:37 by
    祝樓主新年快樂(lè),呵呵,小女越來(lái)越漂亮

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-01-06 10:33 by turtle_2
    大牛啊,講的很清楚,謝謝。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-01-17 08:21 by micRabbit
    寫(xiě)的很霸氣

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-02-26 21:12 by 過(guò)路螞蟻
    寫(xiě)的真好,兼?zhèn)洳艢夂瓦壿嫞y得

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-03-01 14:52 by Cathy
    謝謝博主,這篇文章對(duì)我?guī)椭艽?,所以很想把它分享給更多人。
    轉(zhuǎn)發(fā)后博客中已注明作者和出處。

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-04-02 18:02 by 王朋
    贊一個(gè)

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2011-04-03 20:08 by RYAN
    感謝博主!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-05-20 12:56 by jj

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-05-20 12:57 by jj
    頂weqw

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-05-30 12:09 by 踏血無(wú)痕
    令人敬佩的文章,謝謝了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-06-03 01:00 by 陳水文
    qq 1300510038 很想跟你學(xué)習(xí)

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-06-21 11:19 by 楊元
    我是想在VB中調(diào)用Dll,必須要用C寫(xiě)才可以,看了您的文章,很好!
    而且感覺(jué)C語(yǔ)言比VB方便很多

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-07-20 11:00 by 無(wú)語(yǔ)紫玉
    看完了~~獲益匪淺啊~~

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2011-09-07 19:09 by fan
    小小的入門(mén)了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2012-02-23 22:55 by DllMain
    寫(xiě)的很詳細(xì),支持一下

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2012-02-24 14:16 by 團(tuán)團(tuán)
    感謝樓主,寫(xiě)的很詳細(xì)!
    總算是入門(mén)了,呵呵

    # 寫(xiě)的很好  回復(fù)  更多評(píng)論   

    2012-02-26 19:08 by DLL大全
    寫(xiě)的很好,支持一下

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2012-03-03 22:21 by Alex.Wu
    非常好的教程,起碼我是在這里搞懂如何編寫(xiě)dll的。十分感謝

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2012-03-04 11:49 by c初級(jí)程序員
    謝謝樓主,讓我知識(shí)面有廣了

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-07-10 22:30 by 飛鳥(niǎo)
    很不錯(cuò),一個(gè)偶然的機(jī)會(huì)讓我學(xué)會(huì)了DLL,哈哈

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2012-08-14 15:36 by Logger
    獲益良多,可惜沒(méi)有介紹類(lèi)的導(dǎo)出方法。期待樓主繼續(xù)完善。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-10-02 22:01 by lobby
    找了好久,終于找到說(shuō)的清晰明了的好文章,太好了;學(xué)到了很多,謝謝樓主。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-12-04 12:26 by 123
    教程很清晰,收獲很大,非常感謝!!

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-03-20 16:47 by Andy
    程序媛辛苦了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-03-27 20:59 by 麥穗兒
    寫(xiě)得真是太好了!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-04-13 16:03 by 王海輝
    不得不好,真的是很好。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-07-23 23:47 by 小輝
    非常棒?。?!很清楚~

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-08-15 17:59 by feitian
    剛拜讀完文章,寫(xiě)得很不錯(cuò),受益匪淺,期待更多更好的文章!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-08-16 13:09 by 沈軍濤
    不錯(cuò),學(xué)習(xí)了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-09-06 01:46 by Frankie
    實(shí)在太感謝了,比書(shū)里講的好多了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-09-14 14:12 by be.truth
    __declspec(dllexport) 導(dǎo)出不了函數(shù),用dumpbin看不到導(dǎo)出函數(shù) 用的是vs2008 的CL

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-10-03 16:47 by caotengfei
    厲害,學(xué)習(xí)了

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2013-10-20 16:43 by thinkercui
    我忍不住,要感謝樓主,為傳播程序員文化所做出的努力!
    謝謝。

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2014-02-11 23:12 by
    雖然這么多贊的,但是我還要來(lái)贊一下??!

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2014-03-13 21:56 by 無(wú)名
    寫(xiě)的十分清晰,十分感謝

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2014-04-10 16:53 by 1234
    膜拜樓主,非常清晰

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2014-04-16 03:00 by prx
    請(qǐng)教您了:照您的做法,我dll中的h是這樣:
    #define BASE_EXPORTS
    #ifdef BASE_EXPORTS
    #define  BASE_API __declspec(dllexport)
    #else
    #define  BASE_API __declspec(dllimport)
    #endif
    BASE_API BOOL BASIT;
    cpp如下:
    BASE_API BOOL BASIT=FALSE;
    編譯出現(xiàn):
    D:\VC6\MyProjects\Base\Base.cpp(327) : error C2086: 'BASIT' : redefinition
    請(qǐng)你指點(diǎn)下!

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2014-08-21 16:52 by liuruoze
    謝謝 很不錯(cuò)的文章

    # re: DLL編寫(xiě)教程[未登錄](méi)  回復(fù)  更多評(píng)論   

    2015-11-11 22:56 by HelloWorld
    樓主好文。我做學(xué)習(xí)筆記轉(zhuǎn)走了。么么噠

    # re: DLL編寫(xiě)教程  回復(fù)  更多評(píng)論   

    2016-08-10 20:56 by liqiao
    這不就是一天學(xué)會(huì),深入淺出……
    :p
    評(píng)論共2頁(yè): 1 2 下一頁(yè) 
    主站蜘蛛池模板: 亚洲最大黄色网址| 久久久久亚洲Av无码专| 国产精品亚洲精品日韩动图| 67194成是人免费无码| 亚洲三级中文字幕| 免费可以在线看A∨网站| 国产亚洲sss在线播放| 好吊妞在线成人免费| 亚洲av无码成人精品国产| 在线观看免费大黄网站| 亚洲AV女人18毛片水真多| 四虎影永久在线高清免费| 一级女人18片毛片免费视频| 国产亚洲精品福利在线无卡一| 中国国产高清免费av片| 亚洲精选在线观看| 无码国产精品久久一区免费| 亚洲最大中文字幕无码网站| 免费a级毛片18以上观看精品| 免费国产草莓视频在线观看黄| 亚洲中文字幕无码爆乳av中文| 久青草视频97国内免费影视| 亚洲人成影院在线| 免费做爰猛烈吃奶摸视频在线观看 | 激情内射亚洲一区二区三区爱妻| 成人特黄a级毛片免费视频| 麻豆亚洲AV成人无码久久精品| 亚洲最大av无码网址| 精品无码无人网站免费视频| 亚洲人成www在线播放| 亚洲国产一区视频| 久久99国产综合精品免费| 久久精品国产亚洲AV未满十八| 在线观看国产区亚洲一区成人 | 亚洲精品白浆高清久久久久久| 91青青青国产在观免费影视| 亚洲av无码专区亚洲av不卡| 伊人久久综在合线亚洲91| 18禁网站免费无遮挡无码中文| 免费看黄网站在线看| 亚洲成aⅴ人片在线观|