Autor Beitrag
Mike
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Do 25.07.02 19:15 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: Do 25.07.02 19:23 
tag auch

gib uns dochmal nen bissel quellcode. wie hast dus deklariert usw.
Mike Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 26.07.02 08:37 
OK, die Projekt-Unit enthält:
ausblenden 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:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 26.07.02 10:19 
Hab das Problem gefunden!! :roll:

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


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

Richtig:
ausblenden 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?