Pfade von DLLs

Antworten
Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Pfade von DLLs

Beitrag von Theozh »

Hallo,
eben stelle ich ein Verhalten fest, das ich mir nicht erklären kann.
Auf einem Rechner_1 schreibe ich mein Programm, in dem eine DLL verwendet wird.
Sie ist z.B. im Pfad ../EigeneLibs
welcher in den Lazarus-Projekteinstellungen angegeben ist.
Das Programm wird kompiliert und läuft. So weit so gut.

Nun wollte ich das .exe Programm auf einem anderen Rechner_2 laufen lassen. Dazu habe ich die DLL ins gleiche Verzeichnis wie das EXE kopiert.
Beim Start gibt's die Fehlermeldung:
"Prodezureinsprungpunkt "_FuncXXX..." wurde in der DLL "YYY" nicht gefunden."

a) Erstelle ich nun auf Rechner_2 ein Verzeichnis ../EigeneLibs und kopiere die DLL dort hinein, findet das Programm die DLL nicht.
b) Verschiebe ich auf dem Rechner_1 die DLL in das Projektverzeichnis stürzt beim Kompilieren der Kompiler ab.

Der Aufruf der DLL-Funktionen lautet:

Code: Alles auswählen

CWLib = 'USBxyz.dll';
  function CWInit():Pointer; stdcall; external CWLib name '_FCWInitObject@0';
... 
Kann mir das jemand erklären?
Wie bringe ich das Programm mit der DLL auf Rechner_2 zum Laufen und wohin muss ich die DLL kopieren? Oder welche Einstellungen sind evtl. falsch?
Danke für Hinweise. Theo.

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Pfade von DLLs

Beitrag von Thomas B. »

erste Idee: unterschiedliche Betriebssysteme 32 <--> 64 bit ?
zweite Idee: Du rufst eine C-Funktion mittels Name auf, ggf. gibt es da Probleme. Hast Du es mal direkt über "index" mit der zugehörigen Nummer probiert?

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Pfade von DLLs

Beitrag von Antrepolit »

Benutz' absolute Pfade, dann wird die DLL auch gefunden. Du weist ja mitunter nicht, welches das derzeitige Verzeichnis ist. Stichwort:

Code: Alles auswählen

SetCurrentDir
Grüße, Antrepolit

care only if your os is really burning

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Pfade von DLLs

Beitrag von Theozh »

@Thomas B.
1) beides 32 bit Systeme
2) wenn auf dem einen Rechner der Aufruf mit Namen funktioniert, warum sollte er dann auf dem anderen Rechner plötzlich nicht mehr funktionieren?

@Antrepolit
Wenn ich die EXE und die DLL auf beliebigen Rechnern und in beliebigen Verzeichnissen laufen lassen möchte, kann ich doch keine absoluten Pfade benutzen!?

Welchen DLL Pfad kompiliert mir Lazarus/Freepascal überhaupt in das EXE?
Warum stürzt mir Lazarus ab wenn ich die DLL im gleichen Verzeichnis wie die .pas Routinen habe?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Pfade von DLLs

Beitrag von Michl »

Hallo Theo,

ich selber mache den Test, ob die Pfade stimmen immer als erstes, wenn meine Programme starten (teste ob Pfade und Dateien vorhanden, wenn nicht, gibt es eine entsprechende Fehlermeldung und das Programm wird wieder sofort beendet). Dabei nutzte ich bisher immer relative Pfade.

Wofür du die DLL brauchst, weiss ich nicht, würde aber zur Fehlersuche wie folgt vorgehen:
Ein kleines Extra-Testprogramm schreiben, was mit der DLL kommuniziert, dabei die DLL am besten direkt im Programmverzeichnis halten. Das Testprogramm auf dem EntwicklungsPC starten/testen. Wenn das geht, auf dem EntwicklungsPC in noch min. einem anderen Verzeichnis testen. Wenn alles gut, auf einem anderen Rechner. Evtl. hat die DLL ja wirklich Probleme in der Umgebung auf dem anderen Rechner und funktioniert dort nicht richtig?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Pfade von DLLs

Beitrag von Thomas B. »

Ich nehme an, auf Rechner_1 wurde die DLL (USB mit ihren Zusatzfunktionalitäten) vom Setup-Programm des Herstellers installiert, und dabei mittels RegSvr32.exe "C:\...\USBxyz.dll" bei Windows als Dienst angemeldet?
Mit der Index-Nutzung umgeht man die http://en.wikipedia.org/wiki/Name_mangling Problematik.

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Pfade von DLLs

Beitrag von Antrepolit »

Theozh hat geschrieben:(...)

@Antrepolit
Wenn ich die EXE und die DLL auf beliebigen Rechnern und in beliebigen Verzeichnissen laufen lassen möchte, kann ich doch keine absoluten Pfade benutzen!?
Da ParamStr(0) immer den Pfad deiner Exe enthält, wirst du im Initialization ja noch einen Pfad setzen können, bevor die DLL geladen wird. Abgesehen davon wird die DLL immer gefunden, wenn sie im gleichen Verzeichnis wie die Exe liegt. Und wenn das nicht geht, verwendet man ne DLL, die man mit RegSvr32 registrieren kann.
Grüße, Antrepolit

care only if your os is really burning

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Pfade von DLLs

Beitrag von Theozh »

@Thomas B.
aha, der Hinweis mit dem Setup Programm war hilfreich.
Auf Rechner_1 habe ich die DLL offenbar vor einiger Zeit mit dem Setupprogramm des DLL-Herstellers installiert, welches die DLL in der Registry und sonstwo eingetragen hat.
Genau das will ich eben vermeiden, dass ich auf jedem anderen Rechner erst verschiedene Setupprogramme laufen lassen muss!!!

Deshalb habe ich nun die DLL auf Rechner_1 deinstalliert und die DLL einfach in das .pas Verzeichnis kopiert.
Und siehe da, nachdem ich mein Programm mit Lazarus kompiliert habe, funktioniert nun mein Programm auf Rechner_2 problemlos, sofern die DLL dort auch im gleichen Verzeichnis ist.

Offenbar wird in Lazarus vorrangig der originale DLL-Setup-Installationspfad eingearbeitet und nicht der aktuelle Pfad der EXE oder der Eigenen Libs. Ich bin dankbar dafür wenn mir jemand sagen kann, woraus das bei den Lazarusprojekteinstellungen ersichtlich ist.

Eine weiterführende Frage wäre:
Wie kann ich die DLL mit Lazarus in mein EXE Programm integrieren?
Ich hätte gern ein EINZIGES Programm, das ich irgendwo hinkopiere und laufenlassen kann, ohne Installationen und Zusatzfiles.
Ich bilde mir ein, ich hätte das früher schon mal gefragt, finde aber keinen Post dazu. (ok... habe ihn gefunden http://www.lazarusforum.de/viewtopic.php?f=15&t=6107 und habe den dortigen Vorschlag noch nicht ausprobiert, weil mir das zu kompliziert erschien...)

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Pfade von DLLs

Beitrag von Thomas B. »

Entweder du gibst in Deinem Programm direkt den (relativen) Pfad an, oder überlässt die Suche dem Betriebssystem.
Hier wird Windows zuerst einen Abgleich mit den registrierten DLL's machen, dann bei Dir im Programmpfad suchen, und danach in den
"normalen" Suchpfaden (tippe "path" in die Konsole ein)

Zur DLL-Einbindung in den Programmcode hast Du schon den richtigen Link gegeben. Eine andere Möglichkeit sehe ich auch nicht (wenn Du nur die DLL hast).

Antworten