동적 링크 라이브러리 만들기 및 호출 방법
오늘 제가 말하고자 하는 것은 주로 mfcdll, 즉 win32 dynamic link library입니다. 아래 그림과 같습니다.
그림 1
1. 간단한 dll 예시
그림1에서 보듯이 file 메뉴 아래 Win32 Dynamic-Link Library 프로젝트는 단순dll.구축된 프로젝트에 다음 파일을 추가합니다
4
/* :simple_dll.h */
#ifndef SIMPLE_DLL_H
#define SIMPLE_DLL_H
extern "C" int _declspec(dllexport)add(int x, int y);
#endif
/* :simple_dll.cpp */
#include "simple_dll.h"
int add(int x, int y)
{
return x + y;
}
위와 같이 간단한 동적 링크 라이브러리 프로젝트를 구축했다.F7을 누르거나build 메뉴에서 build simpledll.dll는 debug 폴더에서 단순 생성 가능dll.lib과 단순dll.dll 파일.다음은 dll의dd 함수를 호출하는 win32 console 응용 프로그램 프로젝트를 작성합니다.파일 메뉴에서 새로 만들기를 누르면 new의 win32 console 응용 프로그램 프로젝트가 다음 그림과 같습니다.이름 설정callsimple_dll.
그리고 단순한...dll 프로젝트의 단순dll.lib과 단순dll.dll에서 call 로 복사simple_dll 프로젝트 폴더 아래에 있습니다.마지막으로callsimple_dll에서 새 main.cpp 파일.
4
/********** main.cpp**************/
#pragma comment(lib,"simple_dll.lib")
#include
//.lib DLL
extern "C" _declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d",result);
return 0;
}
호출 성공, 결과는 5.2. dll의 함수 호출
dll의 함수는 정적, 동적 두 가지 호출 방식이 있습니다.1절의 예는 정적 호출에 속한다.동적 호출은 다음과 같습니다.
제1절의 방식에 따라 공사를 잘 세우고main.cpp.구체적인 코드는 다음과 같이 변경되었습니다.
4
#include
#include
typedef int(*lpAddFun)(int, int); //
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL
lpAddFun addFun; //
hDll = LoadLibrary("..\\Debug\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
컴파일링을 실행하면 1절과 같은 결과를 얻을 수 있습니다.동적 호출이란 LoadLibrary, GetProcAddress, FreeLibrary 세 개의 윈도우즈 API 함수를 사용한 것을 볼 수 있다.정적 호출과 동적 호출의 차이점은 정적 호출은lib 설명 파일을 포함해야 한다는 것이다.클라이언트(즉main 함수)가 연결을 컴파일할 때 dll에서 이 함수의 주소를main 함수에 연결합니다.이렇게 하면 dll가 바뀌면 함수의 주소도 바뀐다.클라이언트도 연결을 다시 컴파일해야 합니다.동적 호출 방식은 후기 동적 연결을 사용하기 때문에 연결할 때 함수의 구체적인 주소를 알 필요가 없다.호출할 때만 연결됩니다.이렇게 하면 dll의 함수를 어떻게 수정하든지 간에 어차피 클라이언트가 호출할 때 이 함수의 주소를 계산하기 때문에 dll가 바뀌어도 클라이언트 프로그램을 다시 컴파일할 필요가 없다.이것이 바로 동적 호출과 정적 호출의 가장 주요한 차이이다.물론 정적 호출 코드는 간결해야 한다는 것을 여러분도 보실 수 있습니다.따라서 dll 기능이 고정되면 정적 링크 방식을 사용할 수 있습니다.3. dll에서 함수 내보내기
1절에서 저희가 사용하는 걸 보실 수 있어요.
4
extern "C" int _declspec(dllexport)add(int x, int y);
add 함수를 설명합니다. 여기declspec(dllexport)의 뜻은 설명 (declaration spec)add 함수가 dll 내보내기 함수라는 것을 의미한다.우리는 단순한dll.dll는vc6 tools가 자체로 가지고 있는depends 도구로 보십시오. 아래 그림과 같이dd 함수의 입구 바늘이 0x00001005인 것을 볼 수 있습니다.이렇게 설명하면dd 기호를 외부에서 호출할 수 있다.4.dll에서 변수 내보내기
변수의 내보내기 방식은 함수와 기본적으로 같다
/* : variable.h */
#ifndef _VARIABLE_H_
#define _VARIABLE_H_
#ifdef EXPORT
#define VARIABLE_DLL _declspec(dllexport)
#else
#define VARIABLE_DLL _declspec(dllimport)
#endif
extern VARIABLE_DLL int dllglobal;
#endif
/* :variable.cpp */
#define EXPORT
#include "variable.h"
int dllglobal = 33;
DLL :
/* :main.cpp */
#include "variable.h"
#include
#pragma comment(lib,"variable.lib")
int main()
{
printf("%d",dllglobal);
}
주의,variable을 사용해야 합니다.h,variable.lib,variable.dll 모두main으로 복사cpp는 같은 폴더 아래에 있습니다.그렇지 않으면 번역이 성공하지 못할 것이다.
5.dll에서 클래스를 내보내는 다음 예에서 DLL에서point와circle 두 클래스를 정의하고 응용 프로젝트에서 인용했습니다.
// :point.h,point
#ifndef POINT_H
#define POINT_H
#ifdef EXPORT
#define CLASS_DLL _declspec(dllexport)
#else
#define CLASS_DLL _declspec(dllimport)
#endif
class CLASS_DLL point // point{public:float y;float x;point();point(float x_coordinate, float y_coordinate);};
#endif
// :point.cpp,point
#define CLASS_DLL
#include "point.h"
// point
point::point()
{
x = 0.0;
y = 0.0
}
// point
point::point(float x_coordinate, float y_coordinate)
{
x = x_coordinate;
y = y_coordinate;
}
#include "circle.h" //
#pragma comment(lib,"circle.lib");
int main()
{
circle c;
printf("area:%f girth:%f", c.x, c.y);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.