Forms in DLL

From: Mikael Lenfors (mikael_at_lenfors.se)
Date: 10/29/03


Date: Wed, 29 Oct 2003 17:17:14 +0100

Hello!

I use a Form in my DLL, but when I do a FreeLibrary after use I get Access
violation. Do I have to do someting with the form to unload it? Is there a
problem when I send the database components (TADOConnection and TADOQuery)
to the DLL as parameters? I tried to remove these but got the same error.

Regards, Mikael

Se code below:

procedure TMainForm.Button1Click(Sender: TObject);
Var DllHandle: THandle;
      fLogin: Function(Database: TADOConnection; ADOQuery: TADOQuery; Var
SystemLevel, LoggedInStore: Integer; Var CurrentUser, UserAccessList:
ShortString): Boolean;
Begin
      DllHandle := LoadLibrary('LoginDLL.dll');
      If DllHandle <> 0 Then
      Begin
         @fLogin := GetProcAddress(DllHandle, 'Login');
         If @fLogin <> Nil Then
         Begin
            If fLogin(FormDB.Database, FormDB.ADOQuery, SystemLevel,
LoggedInStore, CurrentUser, UserAccessList) Then
            Begin
               <Code>
            End; // Login ok
         End; // Function loaded
         FreeLibrary(DllHandle); // Crashes here!!!!!!!!!!!!!!
      End // DLL loaded
   End; // Systemlevel = 0
End;

Code for LoginDLL below:

library LoginDLL;
uses ADODB, SysUtils, Classes,
         LoginUnit in 'LoginUnit.pas' {LoginForm}; // Standard form with
some dialogs and a database query.
Function Login(Database: TADOConnection; ADOQuery: TADOQuery; Var
SystemLevel, LoggedInStore: Integer; Var CurrentUser, UserAccessList:
ShortString): Boolean;
Var LoginForm: TLoginForm;
Begin
   LoginForm := TLoginForm.Create(nil);
   Result := LoginForm.Login(Database, ADOQuery, SystemLevel, LoggedInStore,
CurrentUser, UserAccessList);
   LoginForm.Free;
End;
Exports Login Name 'Login';
End.


Quantcast