Windows DLL調用實例

      DLL全稱Dynamic Link Library,是微軟定義的動態連接庫類型。動態連接庫的好處沒必要多說。那麼在windows下如何使用DLL呢?DLL的使用有2種方式:第一種稱之爲」顯式連接」,只需提供DLL文件和知曉函數名便可;第二種稱之爲「隱式連接」,須要提供lib,頭文件和dll,這種方式比較正規。首先,咱們來製做一個dll文件。ios

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

分別建立mydllbase.h ,mydll.h和mydll.cpp文件。文件內容以下:函數

mydllbase.h:spa

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

mydll.h:code

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

mydll.cpp:blog

#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.aspxget

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

編譯後生成:io

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。

相關文章
相關標籤/搜索