동적 링크 라이브러리는 애플리케이션 및 기타 DLL에서 호출할 수 있는 프로시저 및 함수의 모음입니다. 여기에는 공개 코드 또는 리소스가 포함되어 있습니다. DLL 코드는 메모리 공유 기술을 사용하기 때문에 Windows는 일부 위치에서 DLL에 더 높은 권한을 부여하므로 DLL은 Windows HOOK, ISAPI 구현 등과 같은 일반 프로그램으로는 달성할 수 없는 일부 기능을 구현할 수 있습니다. 동시에 DLL은 서로 다른 언어 간 코드 공유를 위한 편리한 방법도 제공합니다. 따라서 DLL은 프로그래밍에 널리 사용됩니다. 이 기사에서는 Delphi에서 DLL을 생성하고 사용하는 방법을 소개합니다.
하나. DLL 라이브러리 메모리 공유 메커니즘
사용법 측면에서 볼 때 DLL과 유닛은 모두 다른 프로젝트 모듈에서 호출할 수 있지만 내부 구현 메커니즘에는 차이가 있습니다. 프로그램 모듈이 유닛을 참조하기 위해 사용 문을 사용하는 경우, 컴파일러는 모듈을 컴파일할 때 이를 유닛과 함께 컴파일하고 컴파일된 실행 코드를 프로그램 모듈에 링크합니다. 이것이 바로 프로그램 모듈이 호출할 수 있는 이유입니다. 참조된 장치의 절차 및 기능. 동일한 유닛이 여러 프로젝트에서 참조되는 경우 각 프로젝트에는 유닛의 실행 코드가 포함됩니다. 유닛을 포함하는 여러 프로젝트가 동시에 실행되면 유닛의 실행 코드가 다른 프로젝트로 여러 번 업데이트됩니다. 메모리에 저장되어 메모리 자원이 낭비됩니다. DLL은 다릅니다. 특정 프로젝트에서 호출되더라도 컴파일 후에도 DLL 라이브러리는 별도의 실행 파일을 구성하며 다른 실행 파일과 연결되지 않습니다. DLL 라이브러리는 특정 프로젝트에 종속되지 않습니다. 여러 프로젝트가 동일한 DLL 라이브러리를 호출하면 첫 번째 프로젝트만 DLL 라이브러리를 메모리로 전송합니다. 다른 프로젝트는 동일한 DLL 라이브러리를 메모리로 반복적으로 전송하지 않습니다. 동일한 공유 메모리 영역. 또한 DLL의 실행 코드는 프로그램 실행 시 전체 프로젝트와 함께 메모리에 전송되는 것이 아니라 프로그램 실행 중에 동적으로 전송됩니다. 이는 동일한 코드가 여러 곳에서 메모리를 점유하는 단위로 인해 발생하는 단점을 제거할 수 있습니다.
2. 델파이에서 DLL 라이브러리 생성
Delphi 환경에서 DLL을 작성하는 것은 일반 애플리케이션을 작성하는 것과 크게 다르지 않습니다. 실제로 DLL 함수를 DLL의 본체로 작성하는 데는 메모리와 리소스 관리의 차이를 제외하고는 특별한 수단이 필요하지 않습니다.
일반 프로젝트 파일의 형식은 다음과 같습니다.
프로그램 프로젝트 제목;
사용 조항;
프로그램 본문
DLL 프로젝트 파일의 형식은 다음과 같습니다.
도서관 프로젝트 제목;
사용 조항;
엑스포트 조항;
프로그램 본문
그들 사이에는 두 가지 주요 차이점이 있습니다.
1. 일반적으로 프로젝트 파일의 헤더는 프로그램 키워드를 사용하고, DLL 프로젝트 파일의 헤더는 라이브러리 키워드를 사용합니다. 키워드가 다르면 컴파일러에게 다른 실행 파일을 생성하라고 지시합니다. 프로그램 키워드는 .exe 파일을 생성하는 데 사용되고, 라이브러리 키워드는 .dll 파일을 생성하는 데 사용됩니다.
2. DLL이 다른 응용 프로그램에서 사용할 수 있도록 함수나 프로시저를 내보내려는 경우 이러한 함수나 프로시저가 내보내기 절에 나열되어야 합니다. 이러한 함수 또는 프로시저 자체는 내보내기 컴파일 지시문을 사용하여 컴파일해야 합니다.
Delphi 메인 메뉴 파일에서 new... 항목을 선택하고 팝업 창에서 DLL 아이콘을 두 번 클릭하면 다음과 같이 DLL 소스 모듈 프레임워크가 자동으로 제공됩니다.
도서관프로젝트1;
{...주석...}
용도
SysUtils, 클래스;
시작하다
끝.
다음으로 USES와 시작 사이에 DLL에 구현하려는 프로시저와 함수의 정의를 추가하고, 다른 모듈이 이를 참조할 수 있도록 내보내기와 내보내기를 사용하여 초기화 코드를 추가할 수 있습니다. DLL 변수를 초기화하는 데 사용됩니다. 주의할 점은, 초기화 코드가 없더라도 다음 예와 같이 start와 end를 생략할 수 없다는 점입니다.
라이브러리최소;
functionMin(X,Y:정수):정수;내보내기;
시작하다
ifX<YthenMin:=XelseMin:=Y;
끝;
functionMax(X,Y:정수):정수;내보내기;
시작하다
ifX>YthenMax:=XelseMax:=Y;
끝;
수출
미니인덱스1,
Maxindex2;
시작하다
끝.
컴파일하고 minmax.DLL로 저장하면 DLL 라이브러리 파일이 형성됩니다.
3개의 DLL 라이브러리에 액세스
DLL 라이브러리에 액세스하는 방법에는 두 가지가 있습니다. 하나는 정적 참조이고 다른 하나는 동적 참조입니다.
정적 참조 방법을 사용하여 DLL을 로드하려면 DLL 라이브러리에 대한 입력 장치를 생성하고 USES를 사용하여 DLL 함수를 사용하는 프로그램 모듈에 입력 장치를 연결하는 두 가지 작업이 필요합니다. DLL 라이브러리용으로 생성된 입력 유닛과 일반 유닛의 유일한 차이점은 해당 인터페이스에서 선언된 프로시저 및 함수가 구현 부분에서 실제 구현 코드를 제공하지 않고 대신 외부 키워드를 사용하여 프로시저 및 함수를 선언하는 것입니다. 함수 구현 세부 사항은 외부 DLL 모듈에 위임됩니다.
외부 명령을 사용하는 구문은 다음과 같습니다.
프로시저/함수 프로시저/함수 이름; externalDLL 모듈 이름;
다음은 위에서 생성한 minmax.DLL 라이브러리용으로 작성된 입력 유닛 소스 파일 testdll.pas를 보면, 입력 유닛과 일반 유닛의 차이점을 알 수 있는 코드는 다음과 같습니다.
단위테스트dll;
인터페이스
용도
functionMin(X,Y:정수):정수;
functionMax(X,Y:정수):정수;
구현
functionMin;외부'minmax.DLL';
functionMax;external'minmax.DLL';
끝.
응용 프로그램이 minmax.DLL의 함수를 호출하려는 경우 해당 사용 문에 testdll 단위만 추가하면 됩니다.
DLL을 동적으로 로드하려면 Windows의 세 가지 API 기능이 필요합니다. Loadlibrary, Freelibrary 및 GetprocAddress. loadlibrary 함수는 DLL 라이브러리를 로드하는 데 사용됩니다. 호출 형식은 다음과 같습니다.
functionloadlobrary(DLLfileName:Pchar):THandle:
DLL 라이브러리가 더 이상 필요하지 않으면 FreeLibrary 함수를 호출하여 귀중한 메모리 리소스를 확보해야 합니다. 호출 형식은 다음과 같습니다.
프로시저FreeLibrary(Libmodule:THandle)
Libmodule은 LoadLibrary 호출로 얻은 DLL 라이브러리 핸들입니다. loadlobrary 함수를 사용하여 DLL 라이브러리를 로드하고 FreeLibrary를 호출하여 DLL 라이브러리를 해제하는 사이의 프로그램 세그먼트에서 DLL 라이브러리의 프로시저와 함수를 사용할 수 있습니다. 구체적인 사용 방법은 다음과 같습니다. GetprocAddress 함수를 사용하여 주소를 가져옵니다. DLL 라이브러리의 함수를 프로그램의 함수 변수에 전달한 다음 해당 변수를 사용하여 DLL 함수를 호출합니다. GetprocAddress 함수는 다음과 같이 선언됩니다.
functionGetprocAddress(Libmodule:THandle:procname:pchar):TFarProc:
다음 예에 표시된 대로:
유형
TTimeRec=기록
둘째:정수;
분:정수;
시간:정수;
끝;
TGetTime=절차(varTime:TTimeRec);
THandle=정수;
var
시간:TTimeRec;
핸들:T핸들;
GetTime:TGetTime;
...
시작하다
핸들:=LoadLibrary('DATETIME.DLL');
ifHandle<>0then
시작하다
@GetTime:=GetProcAddress(핸들,'GetTime');
if@GetTime<>nilthen
시작하다
GetTime(시간);
withTimedo
WriteLn('시간',시간,':',분,':',초);
끝;
FreeLibrary(핸들);
끝;
끝;
동적 링크 라이브러리를 호출할 때 필요한 동적 링크 라이브러리는 응용 프로그램과 동일한 디렉터리 또는 WindowsSystem 디렉터리에 있어야 합니다.
동적 링크 라이브러리는 Windows에서 프로그램을 구성하는 중요한 방법입니다. 동적 링크 라이브러리를 사용하면 다양한 개발 도구와 다양한 기간에 사용자가 수행한 작업을 크게 보호하고 프로그래밍 효율성을 향상시킬 수 있습니다.