DLLs (dynamisch) laden

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

DLLs (dynamisch) laden

Beitrag von Bergmann89 »

Hey,

ich hab ein Problem beim laden der libPNG12.dll. Das ganze sieht so aus:

Code: Alles auswählen

{...}{$ifdef WINDOWS}
const
  Kernel32 = 'kernel32.dll';
 
  function LoadLibrary(lpFileName: pAnsiChar): LongWord; stdcall; external Kernel32 name 'LoadLibraryA';
  function FreeLibrary(hModule: LongWord): LongBool; stdcall; external Kernel32 name 'FreeLibrary';
  function GetProcAddress(hModule: LongWord; lpProcName: pAnsiChar): Pointer; stdcall; external Kernel32 name 'GetProcAddress';
{$else} 
 
{...}
 
libPNG_Handle := LoadLibrary(pAnsiChar(libPNG_Name));    //libPNG_Name = libpng12.dll 
 
{...}
Die DLL liegt im gleichen Ordner, wie die EXE des Programms. Doch LoadLibrary gibt mir immer 0 zurück. Ich hab auch versucht das ganze statisch zu laden:

Code: Alles auswählen

function png_access_version_number: png_uint_32; cdecl external 'libpng12.dll';
Aber da bekomm ich beim Programmstart ne AccessViolation.
Iwie hab ich das Gefühl, das er die DLL nicht finden kann. Ich hab extra nochma

Code: Alles auswählen

SetCurrentDir(ExtractFilePath(Application.ExeName));
gemacht, aber das hat auch nix geholfen. Hat jemand ne Idee warum das hier nicht so funktioniert wie es soll?

MfG & Thx Bergmann

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: DLLs (dynamisch) laden

Beitrag von MmVisual »

Starte mal die EXE ohne Debugger und ohne Lazarus direkt aus dem Ordner mit dem Datei-Browser
EleLa - Elektronik Lagerverwaltung - www.elela.de

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: DLLs (dynamisch) laden

Beitrag von Bergmann89 »

gleiches Ergebnis...

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: DLLs (dynamisch) laden

Beitrag von theo »

Hat zwar evtl. nicht direkt damit zu tun, aber wieso benutzt du nicht die Fkt. in unit dynlibs?
http://www.freepascal.org/docs-html/rtl ... brary.html" onclick="window.open(this.href);return false;
http://wiki.freepascal.org/Lazarus/FPC_Libraries" onclick="window.open(this.href);return false;

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: DLLs (dynamisch) laden

Beitrag von Bergmann89 »

Die Unit is nich von mir, ich benutz die nur in meinem Projekt. Und derjenige, der das damals geschreiben hat, hat es halt mit möglichst wenig eingebundenen Units gemacht. Ich habs auch mal mit der dynlibs probiert, aber da hab ich das gleiche Problem. Intern wird da eh die selbe Funktion aufgerufen. Siehe Windows.LoadLibrary:

Code: Alles auswählen

function LoadLibrary(lpLibFileName:LPCSTR):HINST; external 'kernel32' name 'LoadLibraryA';

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DLLs (dynamisch) laden

Beitrag von Socke »

Bergmann89 hat geschrieben:Die DLL liegt im gleichen Ordner, wie die EXE des Programms. Doch LoadLibrary gibt mir immer 0 zurück. Ich hab auch versucht das ganze statisch zu laden:

Code: Alles auswählen

function png_access_version_number: png_uint_32; cdecl external 'libpng12.dll';
Aber da bekomm ich beim Programmstart ne AccessViolation.
Erhälst du die Access Violation schon allein dadurch, dass du auf die Funktion verlinkst, oder dadurch, dass sie aufgerufen wird?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: DLLs (dynamisch) laden

Beitrag von Bergmann89 »

Weder noch. Ich kann das Programm normal compilieren und linken, und bekomm auch ne EXE. Und wenn ich die dann ausführe kommt die AV. Aber nur, wenn mind. ein Funktionsaufruf im Programm vorhanden ist. Wenn ich die Funktion nur deklariere und nicht aufrufe funktioniert es ohne Probleme (da wird die sicher vom Compiler wegoptimiert).

€: vlt sollte ich noch erwähnen, das ich mit Lazarus x64 arbeite...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: DLLs (dynamisch) laden

Beitrag von m.fuchs »

Bergmann89 hat geschrieben:€: vlt sollte ich noch erwähnen, das ich mit Lazarus x64 arbeite...
Und die DLL ist auch 64-Bit? Wenn nicht kann das AFAIK nicht funktionieren.

Ein 64-Bit-Prozess kann wohl nur 64-Bit-DLLs ansteuern. (Außer man geht einen Umweg über COM)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: DLLs (dynamisch) laden

Beitrag von Bergmann89 »

Hm, das leuchtet irgendwie ein... Und da es die libPNG meines Wissens nicht für 64bit gibt, hab ich jetzt ein Problem :( Jetzt darf ich mir die komplette Lib neu kompilieren, hoffentlich klappt das auf anhieb -.- Danke für die schnelle Hilfe.

€: ich glaub das mit der x64 lib kann ich knicken. Version 1.5 compiliert 1a, aber da fehlt die hälfte der Funktionen die ich brauch. Und Version 1.2 (die die ich jetzt als 32bit da hab) lässt sich nich compilieren, da sin haufen Fehler drin un durchblicken tut da auch kein Schwein. Also hab ich versucht mein Lazarus mit nem 32bit FPC zum laufen zu bringen. FPC-i386-win32 installiert, den CompilerPfad im Lazarus geänder, Zielsystem/-Architektur im Projekt auf Win32/i386. Lazarus und Projekt erfolgreich neu compiliert. Doch beim starten kommt ne External Exception vom Typ "?". Die Exe funktioniert 1a. Ich nehme an, das da der Debugger (gdb) abschmiert. Muss ich da auch noch iwas umstellen?

Antworten