Dll 작성 및 Dll 표시 및 암시적 호출

5239 단어 dll호출현식은식
Dll 작성:
현재 새로 만든 Dll 프로젝트에서 새 클래스를 만듭니다. 이 클래스에서 Add,Substract, Mutiply,Divide 네 가지 방법을 간단하게 정의했습니다.
구체적인 코드는 다음과 같습니다.(MathFuncs.h)
#pragma once

#ifndef _MathFuncs_H
#define _MathFuncs_H

//      
#ifdef __cplusplus
#define MyDll extern "C" __declspec(dllexport)  
#else
#define  MyDll __declspec(dllexport)
#endif // __cplusplus

//    extern "C"   , C++           ,                   
//                   
//#define MyDll  __declspec(dllexport)  

MyDll double Add(double a, double b);
MyDll double Substract(double a, double b);
MyDll double Mutiply(double a, double b);
MyDll double Divide(double a, double b);

class MathFuncs
{
public:
    MathFuncs(void);
    ~MathFuncs(void);

    double Add(double a, double b);

    double Substract(double a, double b);

    double Mutiply(double a, double b);

    double Divide(double a, double b);
};

#endif // !_MathFuncs_H

클래스 외부에서 사용할 방법을 앞에서 정의한 키워드로 내보내야 합니다.
그리고 cpp 파일에서 그들을 실현한다. 코드는 다음과 같다.
#include "stdafx.h"
#include "MathFuncs.h"
#include <stdexcept>

using namespace std;

MathFuncs::MathFuncs(void)
{
}

MathFuncs::~MathFuncs(void)
{
}

double MathFuncs::Add(double a, double b)
{
    return a + b;
}

double MathFuncs::Substract(double a, double b)
{
    return a - b;
}

double MathFuncs::Mutiply(double a, double b)
{
    return a * b;
}

double MathFuncs::Divide(double a, double b)
{
    if (0 == b)
    {
	  throw new invalid_argument("b can not be zero!");
    } 
    else
    {
	  return a / b;
    }
}

//                 
//              
double Add(double a, double b)
{
    MathFuncs clsMF;
    return clsMF.Add(a, b);
}

double Substract(double a, double b)
{
    MathFuncs clsMF;
    return clsMF.Substract(a, b);
}

double Mutiply(double a, double b)
{
    MathFuncs clsMF;
    return clsMF.Mutiply(a, b);
}

double Divide(double a, double b)
{
    MathFuncs clsMF;
    return clsMF.Divide(a, b);
}

완료되면 프로젝트를 컴파일하면 dll,lib 등의 파일을 얻을 수 있습니다.이제 이 dll 파일을 사용합니다.
동적 호출이라고도 하는 호출 표시
상응하는 함수 포인터 정의 -> LoadLibrary를 사용하여 필요한 dll 불러오기 -> GetProcAddress 방법을 이용하여 dll의 방법 이름에 따라 상응하는 방법을 호출하기 -> FreeLibrary를 사용하여 호출된 dll 파일을 방출하기
코드는 다음과 같습니다.
//      ,c++ c            

//    (    )
//1.          
//2.  LoadLibrary        Dll
//3.   Dll             
//4.   FreeLibrary     Dll  

#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <conio.h>  //     、  ,                        
#include <string>

//                     Dll              
typedef double (*Calculate)(double a, double b);

using namespace std;

int main(void)
{
    HINSTANCE hDll;  //           Dll   

    //        TEXT()       
    hDll = LoadLibrary(TEXT("../UsingDll/MathFuncsDll.dll"));  //“..”       “exe”          (     )

    if (NULL != hDll)
    {
	  double a, b, dblResult;
	  string strSign;

	  cout << "            (Add, Substract, Mutiply, Divide):";
	  getline(cin, strSign);
	  LPCSTR lpcStr = strSign.c_str();  //string LPCSTR

	  cout << "     a:";
	  cin >> a;
	  cout << endl << "     b:";
	  cin >> b;
	 
	  Calculate pCalculate = NULL;  //        

	  pCalculate = (Calculate)GetProcAddress(hDll, lpcStr);  //  Dll   “lpcStr”   

	  if (NULL != pCalculate)
	  {
		dblResult = (*pCalculate)(a, b);
		cout << "  Dll          :" << dblResult << endl;

		FreeLibrary(hDll);  //      Dll            
	  }
	  else
	  {
		cout << "  Dll     !" << endl;
	  }
    }

    system("pause");
    return 0;
}

다음은 암시적 호출입니다.
먼저 dll 프로젝트에서 생성된lib 파일을 이 프로젝트에 가져온 다음, dll 파일을 프로그램이 실행하는 루트 디렉터리 (.exe) 나 시스템 32 폴더에 놓고, 코드를 이용하여 사용할 방법을 키워드로declspec(dllimport)에서 그들을 가져옵니다.
코드는 다음과 같습니다.
#include <iostream>

//    
//   Dll      extern   "C"   C++          
//1.         Dll    (  、       )
//2.       lib       
//3.     Dll      exe          ,  system32    
extern "C" __declspec(dllimport)double Add(double a, double b);
extern "C" __declspec(dllimport)double Substract(double a, double b);
extern "C" __declspec(dllimport)double Mutiply(double a, double b);
extern "C" __declspec(dllimport)double Divide(double a, double b);

using namespace std;

int main(_In_ int _Argc, char* argv[] )
{
    double a, b;
    double dblAddResult, dblSubstractResult, dblMutiplyResult, dblDivideResult;

    cout << "   a:";
    cin >> a;
    cout << endl << "   b:";
    cin >> b;

    dblAddResult = Add(a, b);

    dblSubstractResult = Substract(a, b);

    dblMutiplyResult = Mutiply(a, b);

    dblDivideResult = Divide(a, b);

    cout << "  Dll Add        :" << dblAddResult << endl;
    cout << "  Dll Substract        :" << dblSubstractResult << endl;
    cout << "  Dll Mutiply        :" << dblMutiplyResult << endl;
    cout << "  Dll Divide        :" << dblDivideResult << endl;

    system("pause");

    return 0;
}

좋은 웹페이지 즐겨찾기