Windows DLL調用實例


      DLL全稱Dynamic Link Library,是微軟定義的動態鏈接庫類型。動態鏈接庫的好處不必多說。那么在windows下如何使用DLL呢?DLL的使用有2種方式:第一種稱之為”顯式鏈接”,只需提供DLL文件和知曉函數名即可;第二種稱之為“隱式鏈接”,需要提供lib,頭文件和dll,這種方式比較正規。首先,我們來制作一個dll文件。

      打開vs2010,選擇Win32 Console Application,填入工程名”mydll”,在接下來的Application Settings設置的時候,將Application type設置為DLL,將Additional options設置為Empty project。

分別創建mydllbase.h ,mydll.h和mydll.cpp文件。文件內容如下:

mydllbase.h:

#ifndef MYDLLBASE_H
#define MYDLLBASE_H
class mydllbase
{
public:
    virtual ~mydllbase(){};
    virtual int add(int a, int b) = 0;
};
#endif

mydll.h:

#ifndef MYDLL_H
#define MYDLL_H
class __declspec( dllexport ) mymath: public mydllbase
{
public:
    mymath(){}
    int add(int a, int b);
};
#endif

mydll.cpp:

#include "mydll.h"
extern "C" __declspec(dllexport) mymath* getInstance()
{
    return new mymath;
}
int mymath::add(int a, int b)
{
    return a+b;
}

如何導出函數,classes,詳見:

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

編譯后生成:

Mydll.dll  mydll.lib 文件。

新建一個Console Application,創建main.cpp文件,將Mydll.dll mydll.lib mydll.h mydllbase.h拷貝到main.cpp同目錄下。

 

顯式鏈接的方式調用dll:

只要添加 mydllbase.h 頭文件。

main.cpp:

#include <iostream>
#include <cstdio>
#include <Windows.h>
#include "mydllbase.h"
using namespace std;
typedef mydllbase* (*getInstance)();

int main()
{
    getInstance func;
    int sum = 0;
    HINSTANCE hInstLibrary = LoadLibrary(L"mydll.dll");
    if (hInstLibrary == NULL)
    {
        cout<<"cannot load library"<<endl;
    }
    else
    {
        printf("load library successfully %p\n", hInstLibrary);
    }
    func = (getInstance)GetProcAddress(hInstLibrary, "getInstance");
    if (func == NULL)
    {
        FreeLibrary(hInstLibrary);
        printf("GetProcAddress failed\n");
    }
    else
    {
        printf("GetProcAddress load function successfully %p!\n", func);
    }
    class mydllbase* m = func();
    if (m != NULL)
    {
        sum = m->add(1, 10);
        delete m;
    }
    cout<<"sum: "<<sum<<endl;
    FreeLibrary(hInstLibrary);
    return 0;
}

執行結果:

 

顯然,在顯式鏈接中,我們不能直接調用class,需要通過一個全局getInstance函數,隱式地創建class的實例,同時需要創建一個基類,將所有成員函數命名成純虛函數,然后讓class繼承基類函數,來達到捕獲class實例的目的。這是多么麻煩啊!!!

隱式鏈接的方式調用dll就簡單多了:

main.cpp:

#include <iostream>
#include <cstdio>
#include "mydll.h"
using namespace std;
#pragma comment(lib, "mydll.lib")
int main()
{
    mymath m;
    cout<<"sum: "<<m.add(10, 1)<<endl;
}

執行結果:

非常簡單!通過#pragma comment()宏將lib引入lib庫,可以像本地class一樣調用dll的class。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM