Entwickler-Ecke

Dateizugriff - DLL: Fehler


chille07 - Sa 04.09.04 22:06
Titel: DLL: Fehler
Hallo!

Ich habe mit Microsoft Visual Studio 6.0 eine DLL geschrieben, kann sie aber nicht in Delphi einsetzen.
Wie rufe ich eine Funktion aus einer DLL auf?

thanx im voraus
mfG ©h

PS.:
Ein Schulkollege von mir hat mir geraten:

Delphi-Quelltext
1:
function test_function(testvar: string): Boolean; stdcallexternal 'test.dll';                    

Dabei kommt aber immer eine fehlermeldung.


AndyB - So 05.09.04 00:05
Titel: Re: DLL: Fehler
chille07 hat folgendes geschrieben:
Dabei kommt aber immer eine fehlermeldung.

Naja, ich würde mal vorschlagen du gehst vor die Tür, und schreist das Problem in die Luft.

Was anderes fällt mir gerade nicht zu dieser Fehlerbeschreibung ein.


PS: Vielleicht schaust du einfach mal einen Thread weiter untern nach. Da wurde eigentlich genau das selbe Thema behandelt. Nur wurde einem da etwas mehr als "Es geht nicht" geschildert.


Johannes Maier - So 05.09.04 12:00

Ist die Funktion in der DLL als __stdcall deklariert?? Wenn nicht geht es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
type
  //hier steht die Deklaration von TForm
  
  TMyFunc = function(TestVar: String): Boolean; cdecl;
  //external ist meiner Meinung nach nicht nötig ...
  
//CODE, implementation usw.

procedure TForm1.Button1Click(Sender: TObject);
var
  TestFunktion: TMyFunc;
  hDLL: hModule;
  test: Boolean;
begin
  hDLL := LoadLibrary('meinedll.dll');
  //die DLL muss im gleichen Verzeichnis liegen, oder C:\Windows\system32\
  if hDLL <> 0 then begin
    @TestFunktion := GetProcAddress(hDLL, 'test_function');
    if @TestFunktion <> nil then begin
      //hier kannst du MyFunc als Funktion benutzen, z.B. :
      test := TestFunktion('testwort');
      //CODE
    end;
  FreeLibrary(hDLL);
  end;
end;


Nicht getestet, allerdings sollte es so gehen. Wenn du die Funktion in der DLL als __stdcall deklariert hast (was umständlicher ist, als es nicht zu tun und einfach dann cdecl zu verwenden) dann lies mal den Thread hier drunter.


chille07 - So 05.09.04 14:02

Fehlermeldung:


Quelltext
1:
2:
3:
4:
5:
"Im Projekt ... ist eine Exception der Klasse EAccessViolation aufgetreten. 

Meldung: Zugriffsverletzung bei Adresse 000000000 Lesen von der Adresse 000000000' 

Prozess wurde angehalten. ....."

>> Johannes Maiers Prog:
@TestFunktion ist bei mir immer "nil".
dh warscheinlich, das die Funktion nicht da ist oder?

mfG ©h


tommie-lie - So 05.09.04 14:10

Hmm, DLLs aus dem MSVC, da hatten wir doch neulich erst was... :gruebel:
Ach ja, hier isses ja, nur einen Eintrag unter diesem Topic :lupe:

http://www.delphi-forum.de/topic_Probleme+mit+ddl+aus+Visual+C+unter+delphi+7_29809.html


Johannes Maier - So 05.09.04 15:23

Habs doch in meinem Beitrag ganz unten erwähnt @tommie ;)

@chille: Wenn du mir den Quelltext der .h und.c(pp)-Dateien der C-DLL geben kannst (per PN oder so), dann kann ich dir besser helfen ;)
Ansonsten sag einfach nochmal, wie die Funktion in der DLL deklariert ist, mit __stdcall, ohne so etwas, oder wie?
Falls du es mit __stdcall gemacht hast, dann lass das mal in der C++ - DLL einfach weg und probier meinen Code nochmal. Dann sollte er funktionieren.


uall@ogc - Mo 06.09.04 22:03


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
type 
  //hier steht die Deklaration von TForm 
   
var test_function(TestVar: pchar): Boolean; stdcall;
  
  @//external ist meiner Meinung nach nicht nötig ... 
   // stdcall is nen anderer aufruf als cdecl; bei stdcall liegen die parameter auf dem stack
   // und die funktion selber nimmt sie wieder vom stack runter mit RETN...
   // jaja is vereinfacht ausgedrückt ^^
   //grundsätzlich immer bei dlls stdcall verwednen wegen kompatibilitär zu c (geht auch
   //anders sach aber mal das es standart ist, desweiteren keinen string benutzen
   //sollte zwar auch eghen abr nen pchar is in dem fall auch wieder besser

//CODE, implementation usw. 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  hDLL: cardianl; 
  test: Boolean; 
begin 
  hDLL := LoadLibrary('meinedll.dll'); 
  //die DLL muss im gleichen Verzeichnis liegen, oder C:\Windows\system32\ 
  if hDLL > 0 then begin 
    @Test_funktion := GetProcAddress(hDLL, 'test_function'); 
    //bitte auf groß/kleinschreibung beim importieren achten
    // 'test_function' <> 'Test_function'
    if @Test_funktion <> nil then
    begin 
      
      test := Test_Funktion(pchar('testwort')); 
      //CODE 
    end
  FreeLibrary(hDLL); 
  end
end;


übrigens kannste auch


Delphi-Quelltext
1:
function test_function(testvar: string): Boolean; stdcallexternal 'test.dll';                    


nehmen, denk mal der zugriffverletzung nach ($00000000) lässt darauf schließen das entweder die dll net gefunden wurde (falls se net im exe ordner oder system ordner ist) oder die funktion nicht in der dll ist, d.h. du sie vill falsch geschreiuben hast

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.