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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.