Développement de DLL (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des connexions (FireDAC)


Cette rubrique explique comment utiliser FireDAC dans les bibliothèques à chargement dynamique.

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