Ich habe eine DLL, die auf die BDE zugreift. Die BDE Zugriffe
funktionieren "normalerweise". Ab und zu tritt sporadisch eine
Exception auf, der Fehler lautet:
"Bei der Initialisierung der Borland Database Engine ist ein
Fehler aufgetreten (Fehler $2501).
Nach langer Suche und Reduktion des Sources habe ich jetzt eine
Kombination gefunden, wie ich den Fehler immer provozieren
kann.
1. Es muss parallel ein anderes Programm laufen, das die BDE
verwendet.
2. Der Fehler tritt nur auf, wenn im aufrufenden Programm
(das kann ein Word-Makro sein oder eine C++ Exe oder eine
Delphi Exe oder eine C-DLL oder oder) ein FileOpen-Dialog
aufgerufen wurde.
Meine Delphi-DLL habe ich jetzt mal auf ein Minimum reduziert,
das sieht dann so aus (statt der Methode RemoveAllPasswords
kann auch jede andere Methode, die letztendlich
InitializeBDE aufruft, verwendet werden):
------------------------------->snip CODE START
library testdll;
uses
dbtables;
procedure AccessBDE; stdcall;
begin
//hier krachts, aber nur wenn ein anderes Prg auf die
//BDE Zugriff hat und vom aufrufenden Programm zuvor
// ein Datei-Öffnen-Dialog aufgerufen wurde.
Session.RemoveAllPasswords;
end;
exports AccessBDE;
{$R *.RES}
begin
end.
------------------------------->snip CODE ENDE
Als nächstes der Ausschnitt aus meinem Testprogramm
(ebenfalls in Delphi, spielt aber keine Rolle, ob Makro oder...):
------------------------------->snip CODE START
procedure TForm1.Button1Click(Sender: TObject);
var
libhandle : HMODULE;
OpenDialog: TOpenDialog;
ptr : function:WORD;
begin
OpenDialog := TOpenDialog.Create(Self);
OpenDialog.Execute;
libhandle := LoadLibrary('c:\test\testdll.DLL');
if libhandle <> 0 then begin
@ptr := GetProcAddress(libhandle, 'AccessBDE');
if assigned(ptr) then
ptr;
FreeLibrary(libhandle);
end;
end;
------------------------------->snip CODE ENDE
Lässt man den OpenDialog.Execute weg, erscheint keine Exception!
Anbei noch die CallStack-Information. Sollte jemand eine
Idee haben, wäre ich sehr dankbar.
Call Stack Information:
---------------------------------------------------------------------
|Address |Module |Unit |Class |Procedure/Method
---------------------------------------------------------------------
|014A0E79|testdll.DLL |DBTables.pas| |DbiError
|014A0E68|testdll.DLL |DBTables.pas| |DbiError
|014A0E85|testdll.DLL |DBTables.pas| |Check
|014A0E80|testdll.DLL |DBTables.pas| |Check
|014A26D0|testdll.DLL |DBTables.pas|TSession|InitializeBDE
|013C4364|testdll.DLL |system.pas |TObject |Free
|014780AE|testdll.DLL |Dialogs.pas | |DoMessageDlgPosHelp
|014A2618|testdll.DLL |DBTables.pas|TSession|InitializeBDE
|014A3780|testdll.DLL |DBTables.pas|TSession|StartSession
|014A36D4|testdll.DLL |DBTables.pas|TSession|StartSession
|014A310D|testdll.DLL |DBTables.pas|TSession|SetActive
|014A30EC|testdll.DLL |DBTables.pas|TSession|SetActive
|014A2B11|testdll.DLL |DBTables.pas|TSession|MakeCurrent
|014A2AF4|testdll.DLL |DBTables.pas|TSession|MakeCurrent
|014A2AD4|testdll.DLL |DBTables.pas|TSession|LockSession
|014A2ABC|testdll.DLL |DBTables.pas|TSession|LockSession
|014A2FCE|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords
|014A2FC4|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords
Besten Dank schon Mal,
Thomas
funktionieren "normalerweise". Ab und zu tritt sporadisch eine
Exception auf, der Fehler lautet:
"Bei der Initialisierung der Borland Database Engine ist ein
Fehler aufgetreten (Fehler $2501).
Nach langer Suche und Reduktion des Sources habe ich jetzt eine
Kombination gefunden, wie ich den Fehler immer provozieren
kann.
1. Es muss parallel ein anderes Programm laufen, das die BDE
verwendet.
2. Der Fehler tritt nur auf, wenn im aufrufenden Programm
(das kann ein Word-Makro sein oder eine C++ Exe oder eine
Delphi Exe oder eine C-DLL oder oder) ein FileOpen-Dialog
aufgerufen wurde.
Meine Delphi-DLL habe ich jetzt mal auf ein Minimum reduziert,
das sieht dann so aus (statt der Methode RemoveAllPasswords
kann auch jede andere Methode, die letztendlich
InitializeBDE aufruft, verwendet werden):
------------------------------->snip CODE START
library testdll;
uses
dbtables;
procedure AccessBDE; stdcall;
begin
//hier krachts, aber nur wenn ein anderes Prg auf die
//BDE Zugriff hat und vom aufrufenden Programm zuvor
// ein Datei-Öffnen-Dialog aufgerufen wurde.
Session.RemoveAllPasswords;
end;
exports AccessBDE;
{$R *.RES}
begin
end.
------------------------------->snip CODE ENDE
Als nächstes der Ausschnitt aus meinem Testprogramm
(ebenfalls in Delphi, spielt aber keine Rolle, ob Makro oder...):
------------------------------->snip CODE START
procedure TForm1.Button1Click(Sender: TObject);
var
libhandle : HMODULE;
OpenDialog: TOpenDialog;
ptr : function:WORD;
begin
OpenDialog := TOpenDialog.Create(Self);
OpenDialog.Execute;
libhandle := LoadLibrary('c:\test\testdll.DLL');
if libhandle <> 0 then begin
@ptr := GetProcAddress(libhandle, 'AccessBDE');
if assigned(ptr) then
ptr;
FreeLibrary(libhandle);
end;
end;
------------------------------->snip CODE ENDE
Lässt man den OpenDialog.Execute weg, erscheint keine Exception!
Anbei noch die CallStack-Information. Sollte jemand eine
Idee haben, wäre ich sehr dankbar.
Call Stack Information:
---------------------------------------------------------------------
|Address |Module |Unit |Class |Procedure/Method
---------------------------------------------------------------------
|014A0E79|testdll.DLL |DBTables.pas| |DbiError
|014A0E68|testdll.DLL |DBTables.pas| |DbiError
|014A0E85|testdll.DLL |DBTables.pas| |Check
|014A0E80|testdll.DLL |DBTables.pas| |Check
|014A26D0|testdll.DLL |DBTables.pas|TSession|InitializeBDE
|013C4364|testdll.DLL |system.pas |TObject |Free
|014780AE|testdll.DLL |Dialogs.pas | |DoMessageDlgPosHelp
|014A2618|testdll.DLL |DBTables.pas|TSession|InitializeBDE
|014A3780|testdll.DLL |DBTables.pas|TSession|StartSession
|014A36D4|testdll.DLL |DBTables.pas|TSession|StartSession
|014A310D|testdll.DLL |DBTables.pas|TSession|SetActive
|014A30EC|testdll.DLL |DBTables.pas|TSession|SetActive
|014A2B11|testdll.DLL |DBTables.pas|TSession|MakeCurrent
|014A2AF4|testdll.DLL |DBTables.pas|TSession|MakeCurrent
|014A2AD4|testdll.DLL |DBTables.pas|TSession|LockSession
|014A2ABC|testdll.DLL |DBTables.pas|TSession|LockSession
|014A2FCE|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords
|014A2FC4|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords
Besten Dank schon Mal,
Thomas
Comment