Entwickler-Ecke

Dateizugriff - DLL läßt sich nicht einbinden


Mike - Do 25.07.02 19:15
Titel: DLL läßt sich nicht einbinden
Hallo Freunde von Delphi!

Problem: Habe eine DLL programmiert, binde sie in eine - ebenfalls selbst programmierte - EXE ein, lasse das ganze laufen, Fehler erscheint:
"Runtime error 216 at 0000210C", danach erscheint folgende Fehlermeldung:

Initialisierung der DLL "NAME DER DLL" gescheitert. Prozeß wird nicht normal beendet.

dann befinde ich mich im CPU-Debug-Fenster und Delphi labert was von "Anwendung kann nicht normal beendet werden".

Hat jemand ne Idee? Für mich sieht das alles in Ordnung aus. Funzt aber nicht. Oder gibt's vielleicht irgendwelche ganz krassen Tricks um graphische Elemente in die DLL einzubauen (Den Beitrag dazu wie man ein Formular in eine DLL einbindet habe ich schon gelesen :-)) ?


cbs - Do 25.07.02 19:23

tag auch

gib uns dochmal nen bissel quellcode. wie hast dus deklariert usw.


Mike - Fr 26.07.02 08:37

OK, die Projekt-Unit enthält:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
library DBV;

uses
  SysUtils,
  dbtables,
  Classes,
  DBVUnit1 in 'DBVUnit1.pas';

exports
  GetDBVersion;

begin
end.

und die DBVUnit1 enthält:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
unit DBVUnit1;

interface

uses dbtables, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

procedure GetDBVersion(Alias, Username, PWD: PChar; var VersionsNr: PChar); stdcall; export;

implementation

procedure GetDBVersion(Alias, Username, PWD: PChar; var VersionsNr: PChar); stdcall; export;
var
  p: pchar;
  s: string;
  Database1: TDatabase;
  qyRelease: TQuery;
begin
  try
    Database1 := TDatabase.Create(nil);
    Database1.AliasName := strpas(Alias);
    Database1.Params.Add('USER NAME=' + strpas(Username));
    Database1.Params.Add('PASSWORD=' + strpas(PWD));
    try
      Database1.Connected := True;
    except
      VersionsNr := 'Error';
      exit;
    end;
    try
      p := nil;
      s := '';
      qyRelease := tQuery.Create(nil);
      qyRelease.sql.Add('SELECT release FROM release');
      qyRelease.sql.Add('ORDER BY releasedat');
      qyRelease.open;
      qyRelease.first;
      if not qyRelease.IsEmpty then
      begin
        p := pchar(qyRelease.fieldbyname('release').AsString);
        if strlen(p) >= 3 then
        begin
          s := p[0] + p[2];
        end;
        VersionsNr := PChar(s)
      end
      else VersionsNr := '0';
      qyRelease.close;
    except
      VersionsNr := '0';
    end;
  finally
    Database1.close;
    FreeAndNil(Database1);
  end;
end;

end.


Mike - Fr 26.07.02 10:19

Hab das Problem gefunden!! :roll:

Falsch:

Quelltext
1:
procedure GetDBVersion(Alias, Username, PWD: PChar; var VersionsNr: PChar); stdcall; export;                    


Die Lösung: Kein Call by Reference in Prozeduren.

Richtig:

Quelltext
1:
function GetDBVersion(Alias, Username, PWD: PChar): PChar; stdcall; export;                    


Weiß jemand wieso der Wise Installer DLLs mit Call by Reference Parametern nicht nimmt?