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

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

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

    1.創建dll工程

    以創建win32 dll程序為例,一般有兩種方式:

    一種是建立lib鏈接方式的dll(靜態鏈接,使用的時候需要lib)

    #ifdef __cplusplus 

    #define EXPORT extern "C"__declspec(dllexport)

    #else

    #define EXPORT __declspec(dllexport)

    #endif

    EXPORT int HelloWorld()

    {

    cout << "hello world" << endl;

    return 0;

    }

    第二種是為工程創建def文件,生成不需要libdll文件:

    如下:(先生成一個def文件)

    LIBRARY "computer"

    EXPORTS

    add PRIVATE

    而在代碼里只需要用:

    DllMain 前面加上你自己要導出的函數:

    int add(int x,int y)

    return(x + y);

    }

    而在使用的時候:

    HMODULE hDll = ::LoadLibrary(TEXT("computer.dll"));

    //typedef int pHelloWorld();

    //pHelloWorld *pHello = (pHelloWorld *)::GetProcAddress(hDll, "HelloWorld");

    typedef int (*pHelloWorld)();

    pHelloWorld pHello = (pHelloWorld)::GetProcAddress(hDll, "HelloWorld");

    int a = pHello();

    2.上面是最簡單的方式,弊端別人可以輕易的使用我們的dll。

    如果我們要想著封裝下免得被其他人隨意使用,于是就有了導出函數指針,創建對象的思路了...具體闡述如下:

    創建一個接口文件,供使用者參考。dll里面提供導出函數指針,創建這個接口的現實類對象,利用這個對象就可以使用其中的功能了。

    a ) 創建一個publish文件(提供給使用者)

    比如: computer_def.h

    class Icomputer
    {
    public:
        
    virtual int add(int a, int b ) = 0;
        
    virtual void del() = 0;
    };

    當然不要忘記書寫你的def文件:

    LIBRARY    "computer"
    EXPORTS
    DllGetClassObject    PRIVATE


    在dll中:

    class Ccomputer : public Icomputer
    {
    public:
        
    virtual int add(int a , int b)
        {
            
    return a + b;
        }
        
    virtual void del()
        {

            delete 
    this;
        }

    };

    HRESULT __stdcall DllGetClassObject(Icomputer
    ** ppv)
    {
        
    if( ppv == NULL )
            
    return E_INVALIDARG;

        
    *ppv = (Icomputer*)(new Ccomputer());

        
    if*ppv == NULL )
            
    return E_OUTOFMEMORY;

         
    return S_OK;

    }


    完成接口實現。提供導出函數。

    在使用的工程中,記得引入頭文件 computer_def.h文件,然后:

    Icomputer *pComputer;

            HMODULE hDll 
    = ::LoadLibrary(TEXT("computer.dll"));
            
            typedef HRESULT (__stdcall 
    *PFN_DllGetClassObject)(Icomputer** ppv);

            PFN_DllGetClassObject pDllGetClassObject 
    = (PFN_DllGetClassObject)::GetProcAddress(hDll, "DllGetClassObject");
            
            
    if(NULL == pDllGetClassObject)
            {
                
    //nRet = STATUS_SEVERITY_ERROR;
            }

            
    // 創建接口
            HRESULT hRet = pDllGetClassObject(&pComputer);

    使用的時候:

    int iRet = pComputer->add(iNum_1,iNum_2);

       pComputer->del();


    記得在使用完畢時,FreeLibrary(hDll); 釋放資源。
    posted on 2009-08-17 23:04 -274°C 閱讀(1045) 評論(0)  編輯  收藏 所屬分類: C++

    常用鏈接

    留言簿(21)

    隨筆分類(265)

    隨筆檔案(242)

    相冊

    JAVA網站

    關注的Blog

    搜索

    •  

    積分與排名

    • 積分 - 914507
    • 排名 - 40

    最新評論

    主站蜘蛛池模板: av永久免费网站在线观看 | 岛国av无码免费无禁网站| 亚洲人成电影亚洲人成9999网 | 国产大片91精品免费看3| 亚洲成AV人片高潮喷水| 好男人视频在线观看免费看片| 亚洲精品无码少妇30P| 午夜一级免费视频| 女人裸身j部免费视频无遮挡| 亚洲av片一区二区三区| 国产成人精品免费视频大全| 永久亚洲成a人片777777| 无码精品人妻一区二区三区免费看 | 久久久精品视频免费观看| 亚洲伊人久久大香线蕉综合图片| 嫩草影院在线播放www免费观看| 久久精品国产亚洲77777| 成人免费一级毛片在线播放视频| 亚洲av日韩av无码av| 国产在线19禁免费观看| 久久久受www免费人成| 日产亚洲一区二区三区| 天天看免费高清影视| 无码免费又爽又高潮喷水的视频| 亚洲乱码精品久久久久..| 亚欧人成精品免费观看| 亚洲AV无码成人精品区狼人影院| 永久亚洲成a人片777777| 无码区日韩特区永久免费系列| 国产成人精品亚洲| 亚洲av中文无码乱人伦在线播放| 999国内精品永久免费视频| 污视频网站在线免费看| 亚洲一区二区成人| 国产在线ts人妖免费视频| 毛片在线全部免费观看| 亚洲精品永久在线观看| 亚洲成A∨人片在线观看不卡| 日韩欧毛片免费视频| 国产免费一区二区三区免费视频| 久久精品国产亚洲AV久|