La production d’une Dll se décompose généralement selon les étapes suivantes :
1 Écrire une procédure ou une fonction dans un projet DLL
2 Écrivez un mot-clé Exports et écrivez le nom de la procédure en dessous. Il n'est pas nécessaire d'écrire des paramètres ni d'appeler des suffixes.
Deux paramètres passés
1 Le type de paramètre doit être cohérent avec le type de paramètre de la fenêtre C++. N'utilisez pas le type de données DELPHI.
2 Il est préférable d'avoir une valeur de retour [même s'il s'agit d'une procédure] pour signaler le succès ou l'échec de l'appel, ou l'état. La valeur de retour du succès ou de l'échec est de préférence 1 [succès] ou 0 [échec]. En un mot, elle est compatible avec Windows C++.
3 Déclarez le suffixe avec stdcall.
4 De préférence sensible à la casse.
5 Il n'est pas nécessaire d'utiliser le suffixe d'appel lointain, c'est uniquement pour des raisons de compatibilité avec les programmes Windows 16 bits.
Initialisation et nettoyage de sortie de trois DLL [si l'initialisation et le nettoyage de sortie sont requis]
1 DLLPRoc [un pointeur de l'unité SysUtils] est l'entrée de la DLL. Ici, vous pouvez remplacer son entrée par votre fonction. Mais votre fonction doit répondre aux exigences suivantes [en fait une fonction de rappel]. comme suit:
procédure DllEnterPoint(dwReason: DWord);far;stdcall;
Il existe quatre types de paramètres dwReason :
DLL_PROCESS_ATTACH : lorsque le processus entre
DLL_PROCESS_DETACH à la fin du processus
DLL_THREAD_ATTACH lorsque le fil entre
DLL_THREAD_DETACH lorsque le thread se termine
Dans la section d'initialisation, écrivez :
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 S'il existe un composant TdcomConnection sur le formulaire, utilisez Uses Activex et écrivez CoInitialize (nil) lors de l'initialisation ;
3 Assurez-vous que DcomConnection.Connected := False en quittant et que l'ensemble de données a été fermé. Sinon, l'adresse indiquée est fausse.
L'utilisation de quatre variables globales
Dans le programme Widnows 32 bits, les espaces d'adressage des deux applications ne sont pas liés l'un à l'autre. Bien que la DLL soit une copie dans la mémoire, les variables se trouvent dans l'espace d'adressage de chaque processus. Vous ne pouvez donc pas utiliser les variables globales de la DLL pour transférer des données entre deux applications, sauf si vous utilisez un fichier image mémoire.
5. Appelez le chargement statique
1 Déclaration de fonction client :
1) Sensible à la casse.
2) Identique à la déclaration dans la DLL.
Tels que : showform(form:Tform);Far;external'yproject_dll.dll';
3) Le type de paramètre transmis lors de l’appel doit être le même que celui de Windows C++.
4) Lors de l'appel, la DLL doit être dans le chemin de recherche de Windows. L'ordre est le suivant : chemin du répertoire Windows ;
Six appels au chargement dynamique
1 Créez un type de procédure [Si vous êtes clair sur la nature d'une variable de type de procédure qui n'est qu'un pointeur, vous saurez ce qui se passe]. comme:
taper
monpointeur=procédure(form:Tform);Loin;externe;
var
Astuce : Thandle ;
showform:monpointeur;
commencer
Hinst:=loadlibrary('yproject_dll');//Chargez une DLL et recherchez-la par nom de fichier.
showform:=getprocaddress(Hinst,'showform');//Recherche par nom de fonction, sensible à la casse. Cela est clair si vous connaissez la nature des objets d'automatisation.
showform(application.mainform);//Appelé lors de la recherche du pointeur d'entrée de fonction.
Bibliothèque gratuite (Hinst);
fin;
7. Créez un TForM dans la DLL
1 Utilise votre formulaire dans Dll, et les unités associées utilisées par votre formulaire doivent également être utilisées dans [C'est le point le plus gênant, car votre formulaire peut utiliser de nombreuses unités ou fonctions spéciales]
2 Passez un paramètre Application et utilisez-le pour créer le formulaire.
8. Créez un TMDIChildForM dans la DLL
1 MDIForm.FormStyle dans la DLL n'a pas besoin d'être fmMDIChild.
2 Écrivez les deux phrases suivantes après CreateForm :
fonction ShowForm(mainForm:TForm):entier;stdcall
var
Formulaire1 : TForm1 ;
ptr:PLongInt;
commencer
ptr:=@(Application.MainForm);//Enregistrez d'abord le handle MainForm de la dll, il n'est pas nécessaire de le libérer, remplacez-le simplement
ptr^:=LongInt(mainForm);//Remplacez le MainForm de la DLL par le mainForm du programme appelant. MainForm est une FENÊTRE spéciale qui gère spécifiquement les ressources Forms dans l'application.
//Pourquoi pas directement Application.MainForm := mainForm, car Application.MainForm est une propriété en lecture seule
Form1:=TForm1.Create(mainForm);//Créer avec des paramètres
fin;
Remarque : Le paramètre est Application.MainForm du programme appelant.
Neuf exemples :
Code source de la DLL :
projet de bibliothèque2 ;
utilise
SysUtils,
Cours,
Dialogues,
Formulaires,
Unit2 dans 'Unit2.pas' {Form2} ;
{$R *.RES}
var
ccc : Pchar ;
procédure OpenForm(mainForm:TForm);stdcall;
var
Formulaire1 : TForm1 ;
ptr:PLongInt;
commencer
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
Form1:=TForm1.Create(mainForm);
fin;
procédure InputCCC(Texte : Pchar);stdcall;
commencer
ccc := Texte;
fin;
procédure ShowCCC;stdcall;
commencer
ShowMessage(Chaîne(ccc));
fin;
exportations
OuvrirFormulaire ;
EntréeCCC,
AfficherCCC ;
commencer
fin.
Code source de l'appelant :
unité Unité1 ;
interface
utilise
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue,
StdCtrl ;
taper
TForm1 = classe(TForm)
Bouton1 : TButton ;
Bouton2 : TButton ;
Edit1 : TEdit ;
procédure Button1Click (Expéditeur : TObject);
procédure Button2Click (Expéditeur : TObject);
privé
{Déclarations privées}
publique
{Déclarations publiques}
fin;
var
Formulaire1 : TForm1 ;
mise en œuvre
{$R *.DFM}
procédure OpenForm(mainForm:TForm);stdcall;External'project2.dll';
procédure ShowCCC;stdcall;External'project2.dll';
procédure InputCCC(Texte : Pchar);stdcall;External'project2.dll';
procédure TForm1.Button1Click(Expéditeur : TObject);
var
Texte : Pchar ;
commencer
Texte := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//Afin d'ajuster MDICHILD
InputCCC(Text);//Afin de tester si les variables globales de la DLL sont partagées entre diverses applications
fin;
procédure TForm1.Button2Click(Expéditeur : TObject);
commencer
ShowCCC;//Cela montre que les variables globales de la DLL de l'application WINDOWS 32 bits se trouvent également dans l'espace d'adressage de l'application. L'application 16 bits peut être différente et aucune expérience n'a été effectuée.
fin;