AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RuntimeError mit DLL

Ein Thema von Bluemeus · begonnen am 7. Jan 2005 · letzter Beitrag vom 8. Jan 2005
Antwort Antwort
Benutzerbild von Bluemeus
Bluemeus

Registriert seit: 1. Dez 2004
Ort: Erfurt
16 Beiträge
 
Delphi 7 Enterprise
 
#1

RuntimeError mit DLL

  Alt 7. Jan 2005, 23:49
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 ^^


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 ...


Danke im Vorraus
Blue
Stephan
  Mit Zitat antworten Zitat
Morlon

Registriert seit: 15. Dez 2004
Ort: Dillingen
38 Beiträge
 
Delphi 7 Professional
 
#2

Re: RuntimeError mit DLL

  Alt 7. Jan 2005, 23:58
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.dllName 'GetFileVersion';
Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Bluemeus
Bluemeus

Registriert seit: 1. Dez 2004
Ort: Erfurt
16 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: RuntimeError mit DLL

  Alt 8. Jan 2005, 00:10
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.dllName '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. }
Stephan
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: RuntimeError mit DLL

  Alt 8. Jan 2005, 01:59
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von Bluemeus
Bluemeus

Registriert seit: 1. Dez 2004
Ort: Erfurt
16 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: RuntimeError mit DLL

  Alt 8. Jan 2005, 14:59
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:

function GetFileVersion(const Filename: PChar; Typ: Integer): ShortString; stdcall;
Aufruf:

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
Stephan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 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