Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi LoadLibrary geht hier - dort nicht!? (https://www.delphipraxis.net/65173-loadlibrary-geht-hier-dort-nicht.html)

DracoBlue 13. Mär 2006 13:29


LoadLibrary geht hier - dort nicht!?
 
hallo!

Ich weiss wirklich nicht mehr weiter. Habe dieses Stückchen Quelltext, einmal auf meinem einem Rechner und dann zu testzwecken auf einem anderen probiert. Aus irgendeinem für mich unerkenntlichen grund bleibt der pointer von to_upper auf dem 2ten rechner auf NIL und auf dem ersten ist alles ok. "UnserTollesHandle" ist immer ungleich 0, also die DLL scheint er ja zu finden.

Delphi-Quellcode:
type
  THandle = Integer;
  var
    UnserTollesHandle: THandle;

 procedure initializes(pfad:string);
    var dllname:string;
   begin
    dllname:=pfad+'dllname.dll';
    UnserTollesHandle := LoadLibrary(PChar(dllname));
    if UnserTollesHandle <> 0 then
    begin
     @to_upper := GetProcAddress(UnserTollesHandle, 'to_upper');
     SysLOG(' to_upper is at '+inttostr(Longword(Addr(u_scm.to_upper)))+'\');
     SysLOG(' to_upper returns '+inttostr(u_scm.to_upper(1,2))+'\');
    end else exception.create('Can''t initialize the dll');
 end;
Wenn jemand ein ähnliches Problem hatte, oder vielleicht so weiss woran es liegen kann - vielen dank im vorraus :).

Bis denne,
Jan

gsh 13. Mär 2006 13:39

Re: LoadLibrary geht hier - dort nicht!?
 
Hi überprüf mal ganz genau den Pfad was du angibst
Schon mal mit debuggen probiert?

wenn des nichts hilft dann kannst du ja davor noch ein if Fileexists einbauen

DracoBlue 13. Mär 2006 13:51

Re: LoadLibrary geht hier - dort nicht!?
 
Zitat:

Zitat von gsh
Hi überprüf mal ganz genau den Pfad was du angibst
Schon mal mit debuggen probiert?

wenn des nichts hilft dann kannst du ja davor noch ein if Fileexists einbauen

Exakt das habe ich gemacht. Die datei existiert ja - sonst würde das loadlibary ja 0 zurückgeben.

Ich hab ehrlich keine ahnung was daran schuld ist :|.

Bis denne,
Jan

Bernhard Geyer 13. Mär 2006 13:53

Re: LoadLibrary geht hier - dort nicht!?
 
Liegt die DLL auch wirklich in der gleichen Version bereit?

s.h.a.r.k 13. Mär 2006 13:57

Re: LoadLibrary geht hier - dort nicht!?
 
Wie initialisierst du deinen Pfad?! Endet der Pfad auch immer mit einem "\"? Denn ab und zu liefern bestimmte Funktionen kein "\" am Ende des Pfad-Strings, d.h. eventuell schaut das so aus:
Delphi-Quellcode:
// auf deinem PC:
pfad = 'C:\Test\dllname.dll'

// auf einem anderen PC:
pfad = 'C:\Testdllname.dll'

Heffalump 13. Mär 2006 14:00

Re: LoadLibrary geht hier - dort nicht!?
 
Frage doch mal mit GetLastError den Fehlercode ab. Vieleicht hilft das ein bischen weiter. Manchmal fehlt auch eine Abhängigkeit für die DLL.

_Sebastian_ 13. Mär 2006 14:18

Re: LoadLibrary geht hier - dort nicht!?
 
Ich hatte unter delphi 6 auch einige probleme mit dem dynamischen binden von dlls.
Wie sieht denn dein to_upper genau aus?

Ich hatte zb. die Adresszuweisungen zuerst als "procedure of Object" deklariert und erst als procedure ohne "of Object" funktionierte es alles richtig.

Hast du die Methoden auch alle als stdcall deklariert?

Christian Seehase 13. Mär 2006 14:19

Re: LoadLibrary geht hier - dort nicht!?
 
Moin Jan,

ich würde mal sagen LoadLibrary ist hier nicht das Problem.
Offensichtlich existiert auf dem anderen Rechner die Funktion in der angegebenen DLL nicht.
Entweder zieht sich das Programm die falsche DLL, oder sie liegt in einer anderen Version vor, als auf dem Rechner, auf dem es funktioniert.
Hiermit http://www.dependencywalker.com/ könntest Du Dir die DLL auf dem Rechner, auf dem das Problem auftritt einmal anschauen.

shmia 13. Mär 2006 14:32

Re: LoadLibrary geht hier - dort nicht!?
 
Nimm mal folgende Funktion und lass dir direkt nach LoadLibrary den Pfad anzeigen:
Delphi-Quellcode:
function GetModulePath(const Module: HMODULE): string;
var
  L: Integer;
begin
  L := MAX_PATH + 1;
  SetLength(Result, L);
{$IFDEF MSWINDOWS}
  L := Windows.GetModuleFileName(Module, Pointer(Result), L);
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
  L := GetModuleFileName(Module, Pointer(Result), L);
{$ENDIF UNIX}
  SetLength(Result, L);
end;

DracoBlue 13. Mär 2006 14:43

Re: LoadLibrary geht hier - dort nicht!?
 
Danke für die vielen Antworten.

Die beiden DLLs sind vollkommen identisch. Genauso wie die aufrufende exe. (Ich habe sie testweise beide gelöscht und dann per batchdatei neu rüberkopiert.)

Aus irgend einem weiterem unerkenntlichen Grund :) - schafft er es jetzt nicht mal mehr die dll mit loadlibrary zu laden :|.


Ich habe eine debugdatei erzeugt, und die angaben stimmen. Es funktioniert auf dem einem PC auf dem anderen nicht.


Code:
Rechner1
[14:34:10:DLL]  pfad: C:\dev\MyProject\
[14:34:10:DLL]  dllname: C:\dev\MyProject\dllname.dll
[14:34:10:DLL]  LastError: 1
[14:34:10:DLL]  handle:87818240

Rechner2
[14:35:25:DLL]  pfad: E:\MyProject\
[14:35:25:DLL]  dllname: E:\MyProject\dllname.dll
[14:35:25:DLL]  LastError: 0
[14:35:25:DLL]  Handle: 0
Ich habe es einmal mit
Delphi-Quellcode:
UnserTollesHandle := LoadLibrary(PChar(pfad+'dllname.dll'));
und
Delphi-Quellcode:
UnserTollesHandle := LoadLibrary(PChar(dllname));
probiert, beides schlägt nur auf dem 2.rechner fehl.




edit:
Zitat:

Zitat von shmia
Nimm mal folgende Funktion und lass dir direkt nach LoadLibrary den Pfad anzeigen:
function GetModulePath(const Module: HMODULE): string;

was möchte diese funktion als parameter? Eigentlich ist der Pfad doch egal, wenn ich die position der dll absolut angebe, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz