VC++中DLL的創建和使用

Dynamic-Link-Library

 

1、  函數

a)         DLL中:

extern "C" __declspec(dllexport) BOOL isPrime(int num)

{        BOOL flag = false;        for(int i = 2 ; i < num ; i ++)

 

       {

              if(num % i == 0)

                     break;

       }

       if (i == num)

              flag = true;        else

              flag = false;

              flag = false;

 

 

       return flag;

}

b)        應用程序

typedef BOOL ISPRIME(int);

       ISPRIME *isPrime;

       hm = ::LoadLibrary("mydll2.dll");

       isPrime = (ISPRIME *)::GetProcAddress(hm,"isPrime");

       if(isPrime(8))

              MessageBox("是素數");

       else

              MessageBox("不是素數");

       hm = ::LoadLibrary("mydll2.dll");

 

 

2、  類

a)         DLL

                         i.              IloveYou.h頭文件

class __declspec(dllexport)  CILoveYou 

{

public:

       int GetValue();

       void SetValue(int v);

       CILoveYou();

       virtual ~CILoveYou();

 

 

private:

       int a;

};

                       ii.              IloveYou.cpp程序文件

CILoveYou::CILoveYou()

{

       a = 0;

}

 

 

CILoveYou::~CILoveYou()

{

 

 

}

 

 

__declspec(dllexport) void CILoveYou::SetValue(int v)

{

       this->a = v;

}

 

 

__declspec(dllexport) int CILoveYou::GetValue()

{

       return a;

}

b)        應用程序

先把#include "ILoveYou.h"文件導入進來,然後在StdAfc.h頭文件加入:

class __declspec(dllimport)  CILoveYou;

 

 

訪問該類的代碼:

CILoveYou ily;

ily.SetValue(900);

char s[100];

wsprintf(s,"調用了類中的成員哦,值是:%d",ily.GetValue());

ShowMessage(this->GetSafeHwnd(),s);

 

 

 

 

MFC 規則DLL

 

1、  函數

a)         DLL

此類DLL有一個繼承了CwinApp的類,但是函數可以不放在該類中。

extern "C" __declspec(dllexport)  BOOL isOdd(int num)

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());//此句一定要

       if(num % 2 == 0)

              return true;

       else

              return false;

}

b)        應用程序

void CTestdll2Dlg::OnButton5()

{

       // TODO: Add your control notification handler code here

       typedef BOOL ISODD(int);

       ISODD *isOdd;

 

 

       HINSTANCE hm;

       if(hm = ::LoadLibrary("mfcdll4.dll"))

       {

              isOdd = (ISODD *)::GetProcAddress(hm,"isOdd");

              if(isOdd)

              {

                     if(isOdd(9))

                            MessageBox("是偶數");

                     else

                     MessageBox("不是偶數");

              }

              else

              {

                     MessageBox("有問題");

              }

              ::FreeLibrary(hm);

       }

       else

       {

              MessageBox("DLL加載失敗");

       }

}

      

2、  類

a)         DLL中的代碼

                         i.              Clzh類的頭文件:lzh.h

class AFX_EXT_CLASS Clzh  //此處一定要用AFX_EXT_CLASS

{

public:

       CString GetValue();

       void SetValue(CString str);

       Clzh();

 

 

private:

       CString str;

};

 

 

                       ii.              Clzh類的實現文件:lzh.cpp

Clzh::Clzh()

{

 

 

}

 

 

__declspec(dllexport) void Clzh::SetValue(CString str)

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());

       this->str = str;

}

 

 

__declspec(dllexport) CString Clzh::GetValue()

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());

       return str;

}

 

 

b)        應用程序

在StdAfx.h中頭文件中加入:class __declspec(dllimport)  Clzh;

在要訪問該類的地方加入頭文件:#include "lzh.h"

程序如下:

void CTestdll2Dlg::OnButton7()

{

       // TODO: Add your control notification handler code here

       Clzh lzh;

       lzh.SetValue("abc");

       MessageBox(lzh.GetValue());

}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章