Développement de DLL (FireDAC)
Remonter à Utilisation des connexions (FireDAC)
Cette rubrique explique comment utiliser FireDAC dans les bibliothèques à chargement dynamique.
Sommaire
Informations générales
FireDAC peut être utilisé dans une DLL en tant qu'application normale. Cependant, les développeurs doivent être informés de deux techniques spécifiques au développement de DLL.
Partage de connexion entre une application et une DLL
Lorsqu'une application doit être transférée d'une application vers la DLL, cette application ne doit pas transférer l'objet TFDCustomConnection, car cela peut générer des erreurs de violation d'accès et d'autres problèmes. Le problème ne vient pas de FireDAC. Il est dû aux limitations RTL / RTTI de Delphi. Notez qu'une connexion ne peut pas être partagée avec un autre processus, car le partage fonctionne uniquement au sein d'un même espace d'adresse.
Pour transférer une connexion entre une application et une DLL, l'application doit transférer la valeur de la propriété TFDCustomConnection.CliHandle vers la DLL. Dans ce cas le handle doit être assigné à la propriété TFDCustomConnection.SharedCliHandle .
Une fois le TFDCustomConnection.SharedCliHandle assigné, la connexion à la DLL peut être activée en définissant Connected sur True. Notez qu'il est inutile de configurer une définition de connexion, y compris DriverID. Ensuite, la connexion peut être utilisée comme une connexion de base de données normale. Enfin, elle peut être fermée en définissant Connected sur False. Cela ne ferme pas la connexion physique, donc la connexion de l'application reste active.
La connexion de l'application ne suit pas les modifications d'état effectuées par la DLL. Par conséquent, la DLL doit conserver l'état de transaction qui était le sien avant l'appel à la DLL. Il est recommandé de ne pas gérer les transactions dans une DLL, ni modifier le niveau d'isolement des transactions ou d'autres paramètres dans une DLL.
Par ailleurs, le fait de définir SharedCliHandle ne transfère pas les valeurs d'options d'une application vers un objet de connexion de DLL. Les options de connexion de la DLL peuvent être définies de la même manière que les options de connexion de l'application.
Voici un exemple de code de DLL :
procedure SomeTask(ACliHandle: Pointer); stdcall;
var
oConn: TFDConnection;
oQuery: TFDQuery;
begin
oConn := TFDConnection.Create(nil);
oQuery := TFDQuery.Create(nil);
try
oConn.SharedCliHandle := ACliHandle;
oConn.Connected := True;
oQuery.Connection := oConn;
oQuery.ExecSQL('delete from aaa');
finally
oQuery.Free;
oConn.Free;
end;
end;
exports
SomeTask;
Et un exemple de code d'application :
procedure TForm1.Button1Click(Sender: TObject);
type
TSomeTaskProc = procedure (ACliHandle: Pointer); stdcall;
var
hDll: THandle;
pSomeTask: TSomeTaskProc;
begin
hDll := LoadLibrary(PChar('Project2.dll'));
try
@pSomeTask := GetProcAddress(hDll, PChar('SomeTask'));
FDConnection1.StartTransaction;
try
pSomeTask(FDConnection1.CliHandle);
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
finally
FreeLibrary(hDll);
end;
end;
Remarque
- Gérer les erreurs de chargement de la DLL.
- S'intéresser au déchargement d'une DLL FireDAC (voir le chapitre suivant).
- Conserver la DLL chargée pendant une longue période et conserver les objets DLL pendant une longue période.
Déchargement d'une DLL FireDAC
Une application peut être suspendue au moment du déchargement d'une DLL contenant FireDAC. Le symptôme standard est le suivant : l'application est suspendue au moment de l'appel de FreeLibrary. Cette limitation de FireDAC peut être contournée de deux manières :
- Activez le mode silencieux de FireDAC dans la DLL pour qu'aucun curseur d'attente, ni aucun dialogue ou autre ne soit affiché par FireDAC. Pour ce faire, placez ce qui suit dans le fichier DPR de votre DLL :
uses
FireDAC.UI.Intf;
begin
FFDGUIxSilentMode := True;
end.
- Arrêtez le gestionnaire FireDAC avant le déchargement d'une DLL. Pour cela, la DLL doit exporter une procédure, qui appelle la procédure ADTerminate. Pour ce faire, placez ce qui suit dans le fichier DPR de votre DLL :
uses
FireDAC.Stan.Factory;
procedure Shutdown;
begin
FDTerminate;
end;
exports
Shutdown;
Puis, importez et appelez la procédure Shutdown à partir de l'application avant l'appel de FreeLibrary :
var
Shutdown: procedure;
....
Shutdown := GetProcAddress(hLib, 'Shutdown');
if Assigned(Shutdown) then
Shutdown();
FreeLibrary(hLib);
Remarque : La technique ci-dessus doit être utilisée pour les serveurs ActiveX intégrant FireDAC.
Voir aussi
Exemples
- Exemple FireDAC DLL Sharing