![]() |
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. ![]() ![]() Der Funktionsquellcode:
Delphi-Quellcode:
Der Programmquellcode:
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', ...;
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 |
Re: RuntimeError mit DLL
erstmal willkommen bei DP :)
Schau mal ![]() Ich glaub aber dein Fehler ist, dass 'Name' fehlt. Versuchs mal so:
Delphi-Quellcode:
Grüße
function GetFileVersion(const Filename: string; var Version: string; typ: Integer): Boolean; stdcall;
external 'olt_data.dll' Name 'GetFileVersion'; |
Re: RuntimeError mit DLL
Zitat:
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. } |
Re: RuntimeError mit DLL
Zitat:
das denke ich ganz stark. änder mal den parameter const Filename: string; in const Filename: pchar;. ich hoffe, dann geht es. Aenogym |
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:
Wichtig war zum einen, dass ich keinerlei Strings übergebe, und wenn, dann nur ShortStrings oder PChar's!!!
getfileversion(PChar(application.ExeName),2);
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 ![]() 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 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz