Autor Beitrag
chille07
Hält's aus hier
Beiträge: 8

Win XP Prof, WIN 2000
D6
BeitragVerfasst: Sa 04.09.04 22:06 
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:
ausblenden Delphi-Quelltext
1:
function test_function(testvar: string): Boolean; stdcallexternal 'test.dll';					

Dabei kommt aber immer eine fehlermeldung.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: So 05.09.04 00:05 
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.

_________________
Ist Zeit wirklich Geld?
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: So 05.09.04 12:00 
Ist die Funktion in der DLL als __stdcall deklariert?? Wenn nicht geht es so:
ausblenden 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.

_________________
MfG
Johannes ehem. jbmaier
chille07 Threadstarter
Hält's aus hier
Beiträge: 8

Win XP Prof, WIN 2000
D6
BeitragVerfasst: So 05.09.04 14:02 
Fehlermeldung:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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:

www.delphi-forum.de/...+delphi+7_29809.html

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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.

_________________
MfG
Johannes ehem. jbmaier
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 06.09.04 22:03 
ausblenden volle Höhe 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

ausblenden 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.