Dll의 생산은 일반적으로 다음 단계로 나누어집니다:
1 DLL 프로젝트에 프로시저나 함수를 작성합니다.
2 내보내기 키워드를 작성하고 그 아래에 프로시저 이름을 작성합니다. 매개변수를 작성하거나 접미사를 호출할 필요가 없습니다.
두 개의 매개변수가 전달되었습니다.
1 매개변수 유형은 윈도우 C++의 매개변수 유형과 일치해야 합니다. DELPHI 데이터 유형을 사용하지 마십시오.
2 호출의 성공이나 실패, 상태를 보고하려면 [프로시저라도] 반환 값을 갖는 것이 가장 좋습니다. 성공 또는 실패의 반환 값은 1[성공] 또는 0[실패]이 바람직합니다. 한마디로 Windows C++와 호환됩니다.
3 stdcall을 사용하여 접미사를 선언합니다.
4 대소문자를 구분하는 것이 좋습니다.
5 원거리 호출 접미사를 사용할 필요는 없으며 단지 Windows 16비트 프로그램과의 호환성을 위한 것입니다.
3개 DLL의 초기화 및 종료 정리[초기화 및 종료 정리가 필요한 경우]
1 DLLPROc[SysUtils 유닛의 포인터]는 DLL의 입구입니다. 여기에서 해당 항목을 함수로 바꿀 수 있습니다. 하지만 함수는 다음 요구 사항(실제로는 콜백 함수)을 충족해야 합니다. 다음과 같이:
절차 DllEnterPoint(dwReason: DWord);far;stdcall;
dwReason 매개변수에는 네 가지 유형이 있습니다.
DLL_PROCESS_ATTACH: 프로세스가 진입할 때
프로세스가 종료될 때 DLL_PROCESS_DETACH
스레드가 진입할 때 DLL_THREAD_ATTACH
스레드가 종료될 때 DLL_THREAD_DETACH
초기화 섹션에서 다음을 작성하십시오.
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 양식에 TdcomConnection 구성 요소가 있는 경우 Activex 사용을 사용하고 초기화 중에 CoInitialize(nil)를 씁니다.
3 종료할 때 DcomConnection.Connected := False인지 확인하고 데이터 세트가 닫혀 있는지 확인하십시오. 그렇지 않으면 보고된 주소가 잘못되었습니다.
4개의 전역 변수 사용
Widnows 32비트 프로그램에서 두 응용 프로그램의 주소 공간은 서로 관련이 없습니다. DLL은 메모리의 복사본이지만 변수는 각 프로세스의 주소 공간에 있으므로 메모리 이미지 파일을 사용하지 않는 한 DLL의 전역 변수를 사용하여 두 응용 프로그램 간에 데이터를 전송할 수 없습니다.
5. 정적 로딩 호출
1 클라이언트 기능 선언:
1) 대소문자를 구분합니다.
2) DLL의 선언과 동일합니다.
예: showform(form:Tform);Far;external'yproject_dll.dll';
3) 호출 시 전달되는 매개변수 형식은 Windows C++와 동일해야 합니다.
4) 호출 시 DLL은 Windows 검색 경로에 있어야 합니다. 경로 경로는 windows/ssystem32입니다.
동적 로딩에 대한 6번의 호출
1 프로시저 유형을 만듭니다. [프로시저 유형 변수가 포인터일 뿐이라는 점을 분명히 알고 있다면 무슨 일이 일어나고 있는지 알 수 있습니다]. 좋다:
유형
mypointer=procedure(form:Tform);Far;외부;
var
힌트:핸들;
표시 형식:내 포인터;
시작하다
Hinst:=loadlibrary('yproject_dll');//Dll을 로드하고 파일 이름으로 찾습니다.
showform:=getprocaddress(Hinst,'showform');//함수 이름으로 찾기, 대소문자를 구분합니다. 자동화 개체의 특성을 알고 있다면 이는 분명합니다.
showform(application.mainform);//함수 진입 포인터를 찾을 때 호출됩니다.
자유라이브러리(Hinst);
끝;
7. DLL에 TForM을 생성합니다.
1 Form을 Dll로 사용하고 Form에서 사용하는 관련 단위도 Form에서 사용되어야 합니다. [Form이 많은 특수 단위 또는 기능을 사용할 수 있기 때문에 이것이 가장 문제가 되는 점입니다.]
2 Application 매개변수를 전달하고 이를 사용하여 양식을 생성합니다.
8. DLL에 TMDIChildForM을 생성합니다.
1 Dll의 MDIForm.FormStyle은 fmMDIChild일 필요가 없습니다.
2 CreateForm 뒤에 다음 두 문장을 작성합니다.
함수 ShowForm(mainForm:TForm):정수;stdcall
var
Form1: TForm1;
ptr:PLongInt;
시작하다
ptr:=@(Application.MainForm);//먼저 dll의 MainForm 핸들을 저장합니다. 해제할 필요가 없으며 교체하기만 하면 됩니다.
ptr^:=LongInt(mainForm);//DLL의 MainForm을 호출 프로그램의 mainForm으로 바꿉니다. MainForm은 Application의 Forms 리소스를 특별히 관리하는 특수 WINDOW입니다.
//Application.MainForm을 직접적으로 사용하지 않는 이유 := mainForm, 왜냐하면 Application.MainForm은 읽기 전용 속성이기 때문입니다.
Form1:=TForm1.Create(mainForm);//매개변수를 사용하여 생성
끝;
참고: 매개변수는 호출 프로그램의 Application.MainForm입니다.
9가지 예:
DLL 소스 코드:
라이브러리 프로젝트2;
용도
SysUtils,
수업,
대화상자,
양식,
'Unit2.pas' {Form2}의 Unit2;
{$R *.RES}
var
ccc:Pchar;
절차 OpenForm(mainForm:TForm);stdcall;
var
Form1: TForm1;
ptr:PLongInt;
시작하다
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
Form1:=TForm1.Create(mainForm);
끝;
절차 입력CCC(텍스트: Pchar);stdcall;
시작하다
ccc := 텍스트;
끝;
절차 ShowCCC;stdcall;
시작하다
ShowMessage(String(ccc));
끝;
수출
오픈폼;
입력CCC,
CCC 표시;
시작하다
끝.
호출자 소스 코드:
단위 Unit1;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,
StdCtrls;
유형
TForm1 = 클래스(TForm)
버튼1: T버튼;
Button2: T버튼;
편집1: T편집;
절차 Button1Click(Sender: TObject);
절차 Button2Click(보내는 사람: TObject);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$R *.DFM}
절차 OpenForm(mainForm:TForm);stdcall;External'project2.dll';
절차 ShowCCC;stdcall;External'project2.dll';
절차 입력CCC(텍스트: Pchar);stdcall;외부'project2.dll';
절차 TForm1.Button1Click(Sender: TObject);
var
텍스트: Pchar;
시작하다
텍스트 := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//MDICHILD를 조정하기 위해
InputCCC(Text);//DLL의 전역 변수가 다양한 응용 프로그램 간에 공유되는지 실험하기 위해
끝;
절차 TForm1.Button2Click(Sender: TObject);
시작하다
ShowCCC;//이는 WINDOWS 32비트 애플리케이션 DLL의 전역 변수가 애플리케이션 주소 공간에도 있음을 보여줍니다. 16비트 애플리케이션은 다를 수 있으며 실험이 수행되지 않았습니다.
끝;