<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

    最新評論

    主站蜘蛛池模板: 中文字幕成人免费视频| 亚洲码在线中文在线观看| 成人黄动漫画免费网站视频| 久久WWW免费人成—看片| 亚洲AV无码AV男人的天堂不卡| 4480yy私人影院亚洲| 亚洲日产韩国一二三四区| 九月婷婷亚洲综合在线| 成人免费网站在线观看| 中文毛片无遮挡高潮免费| 久久精品一区二区免费看| 国产在线国偷精品免费看| 国产精品亚洲精品久久精品| 亚洲情A成黄在线观看动漫软件| 精品亚洲aⅴ在线观看| 久久亚洲国产伦理| 亚洲欧洲中文日韩久久AV乱码| 成人福利免费视频| 在线观看免费无码专区| 一级做a爱过程免费视频高清| 理论片在线观看免费| 老牛精品亚洲成av人片| 亚洲五月综合网色九月色| 久久青青草原亚洲AV无码麻豆| 国产亚洲av片在线观看18女人 | 亚洲香蕉成人AV网站在线观看| 免费人成视频x8x8入口| 无码国产亚洲日韩国精品视频一区二区三区 | 国产禁女女网站免费看| 岛国大片免费在线观看| 免费黄色app网站| 日本成人免费在线| 免费v片在线观看| www.亚洲一区| 亚洲一区二区三区在线视频| 国产AV无码专区亚洲AWWW| 亚洲无线观看国产精品| 亚洲国产成人高清在线观看 | 国产1000部成人免费视频| 曰批视频免费30分钟成人| 好男人www免费高清视频在线|