Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RuntimeError mit DLL (https://www.delphipraxis.net/37616-runtimeerror-mit-dll.html)

Bluemeus 7. Jan 2005 22:49


RuntimeError mit DLL
 
hallo,

mein Probelm ist folgendes:

Ich habe eine DLL in mein Programm integriert. Dies tue ich, da sich einiges an funktionen angesammelt hat, was weiterverwendet werden soll.

Ich hatte die Funktion vorher im Programm selbst, wo sie tadellos funtzte...

Seit der auslagerung bekomme ich einen RuntimerError, welcher aber nur beim Beenden auftritt.

http://ftp.bluemeus.de/screenshots/debuggermeldung.gif

http://ftp.bluemeus.de/screenshots/runtimeerror.gif

Der Funktionsquellcode:
Delphi-Quellcode:
function GetFileVersion(const Filename: string; var Version: string; typ: Integer): Boolean; stdcall;
var
  VerBlk: VS_FIXEDFILEINFO;
  InfoSize,puLen : DWord;
  Pt,InfoPtr : Pointer;
begin
  Version := '';
  InfoSize := GetFileVersionInfoSize(PChar(Filename), puLen);
  FillChar(VerBlk, SizeOf(VS_FIXEDFILEINFO),0);
  if InfoSize > 0 then
  begin
    GetMem(Pt, InfoSize);
    GetFileVersionInfo(PChar(Filename), 0, InfoSize, Pt);
    VerQueryValue(Pt, '\', InfoPtr, puLen);
    move(InfoPtr^, VerBlk, SizeOf(VS_FIXEDFILEINFO));
    case typ of
    1: begin
        Version := Format('%d.%d.%d.%d',[VerBlk.dwFileVersionMS shr 16,
                                         VerBlk.dwFileVersionMS and 65535,
                                         VerBlk.dwFileVersionLS shr 16,
                                         VerBlk.dwFileVersionLS and 65535]);
       end;
    2: begin
        Version := Format('%d.%d Release %d Built %d',[VerBlk.dwFileVersionMS shr 16,
                                         VerBlk.dwFileVersionMS and 65535,
                                         VerBlk.dwFileVersionLS shr 16,
                                         VerBlk.dwFileVersionLS and 65535]);
       end;


    end;
    FreeMem(Pt);
    Result := True;
  end else
    Result := False;
end;

...

exports
 GetFileVersion name 'GetFileVersion',
 ...;
Der Programmquellcode:
Delphi-Quellcode:
unit Load;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, StdCtrls, Registry, OneInstance;

type
  TIntro = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    OneInstance1: TOneInstance;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormResize(Sender: TObject);

  private
  public
  end;

var
  Intro: TIntro;
  Version: String;

implementation
  uses main, options, MiniMode;

function GetFileVersion(const Filename: string; var Version: string; typ: Integer): Boolean; stdcall;
external 'olt_data.dll';

{$R *.dfm}

procedure TIntro.FormCreate(Sender: TObject);
begin
getfileversion(application.ExeName,version,2);

label1.Caption:= 'Version ' + version;
label2.Caption:= label1.Caption;
label3.Caption:= 'Lade Ressourcen...';
label4.Caption:= label3.Caption;

form3.Openreg;

if reg.ValueExists('MiniMode_on') then
if reg.ReadInteger('MiniMode_on') = 1 then form1.PopupMenu1.Items[3].Click;

form3.CloseReg;
end;

procedure TIntro.Timer1Timer(Sender: TObject);
begin
//form3.openreg;
//if reg.ReadInteger('Hauptfenster') = 1 then Form1.Show;
//form3.closereg;

Form3.OpenReg;
if reg.ReadInteger('Pinger') = 1 then
 begin
  form1.pingtimer.Interval:= reg.ReadInteger('Pingtime');
  form1.pingtimer.Enabled:= true;
  form1.PingTimerTimer(form1);
  form1.button1.Visible:= false;
 end
else
 begin
  form1.Button1.Visible:= true;
 end;
form3.CloseReg;

intro.Hide;
timer1.Enabled:= false;
end;

procedure TIntro.FormResize(Sender: TObject);
begin
intro.Width:= 310;
intro.height:= 229;
end;

end.

Es handelt sich hierbei um einen Ladebildschirm, der als Hauptformular dient. Er wird nach ende des Timers unsichtbar - siehe Quellcode ^^ :duck:


Ich hoffe mir kann jemand von euch helfen. Ich habe bis jetzt nur Probleme mit DLL's gehabt und komme damit nicht besonders gut klar ... :roteyes:


Danke im Vorraus
Blue

Morlon 7. Jan 2005 22:58

Re: RuntimeError mit DLL
 
erstmal willkommen bei DP :)

Schau mal hier. Da wird gezeigt wie du DLL's debuggen kannst.
Ich glaub aber dein Fehler ist, dass 'Name' fehlt. Versuchs mal so:

Delphi-Quellcode:
function GetFileVersion(const Filename: string; var Version: string; typ: Integer): Boolean; stdcall;
external 'olt_data.dll' Name 'GetFileVersion';
Grüße

Bluemeus 7. Jan 2005 23:10

Re: RuntimeError mit DLL
 
Zitat:

Zitat von Morlon
erstmal willkommen bei DP :)

Schau mal hier. Da wird gezeigt wie du DLL's debuggen kannst.
Ich glaub aber dein Fehler ist, dass 'Name' fehlt. Versuchs mal so:

Delphi-Quellcode:
function GetFileVersion(const Filename: string; var Version: string; typ: Integer): Boolean; stdcall;
external 'olt_data.dll' Name 'GetFileVersion';
Grüße

Habe ich probiert. Liegt aber nicht daran ... ich vertsehe nich, warum der Pointer ungültig ist ... im Programm selbst hat es fehlerfrei geklappt!

EDIT:

Ich habe vergessen zu erwähnen, dass die Funktion ohne Probleme seinen dienst tut, aber der Fehler "Ungültige Zeigeroperation" kommt hin oder her ... warum?! Warum nicht schon, als die Funktion im Programm slebst integriert war?

EDIT2:

könnte dies hier vllt. etwas damit zu tun haben?

Delphi-Quellcode:
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }

Aenogym 8. Jan 2005 00:59

Re: RuntimeError mit DLL
 
Zitat:

Zitat von Bluemeus
könnte dies hier vllt. etwas damit zu tun haben?

Delphi-Quellcode:
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }

hi,
das denke ich ganz stark. änder mal den parameter const Filename: string; in const Filename: pchar;.
ich hoffe, dann geht es.

Aenogym

Bluemeus 8. Jan 2005 13:59

Re: RuntimeError mit DLL
 
Nein, geht nicht ... leider.

Also die Funktion selbst funktioniert ja tadellos!

Aber ich erhalte mittlerweile beim Programmstart die oben dargestellte Fehlermeldung.

Ich nehme an, dass es mit dem ShareMem zu tun hat ... aber eine Lösung habe ich nicht!


EDIT:

Hab so eben die Lösung gefunden, die mir eine fehlerfreie Übergabe ermöglicht!

Funktion:

Delphi-Quellcode:
function GetFileVersion(const Filename: PChar; Typ: Integer): ShortString; stdcall;

Aufruf:

Delphi-Quellcode:
getfileversion(PChar(application.ExeName),2);
Wichtig war zum einen, dass ich keinerlei Strings übergebe, und wenn, dann nur ShortStrings oder PChar's!!!


Danke Aenogym, dass du mich auf die Idee gebracht hast. Dadurch hab ich angefangen neu danach zu suchen!
Tja ... wer suchet - der findet!
(Habe die Lösung hier gefunden)

Und da ich jetzt auch weiß, wieso und warum ... hab ich wieder ordentlich dazu gelernt!!!



gReeTz Blue :dancer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz