DLL Tut von fatman (F98)
-
Hi.
Ich versuche grad dein Tut mit den dll zu benutzen. Alles geht, außer das es mit dem Tut ohne die .lib datei, da schmiert das PRogramm immer ab, wenn die Funktion Addiere aufgerufen wird.
-
Folgende Checkpunkte (Hüftschuß):
1. Haste denn auch eine DLL die die Funktion "Addiere" implementiert hat?
2. stimmt folgende Codezeile (Pfad zu Deiner DLL):
[cpp]if (!DllInstance) DllInstance = LoadLibrary("DllName.dll"); // DLL laden[/cpp]
3. Überprüfe mal im Debugger, ob DllFunktion nicht NULL ist, also eine gültige Speicheraresse hat.[ Dieser Beitrag wurde am 24.01.2003 um 13:02 Uhr von F98 editiert. ]
-
1. Ja, deine DLL.
2. Jo, sogar case sensetive.
3. Jo, NULL.Wieso? Soweit ich denke hat er die dll net geladen. Obwohl der name korekkt ist. ICh habe auch auf den Button geklickt das die dll lädt. Steht ja dann in der Titel leiste.
Beim abschmieren kommt diese Meldung als DialogBox:
Project cool.exe raised exception class EAccessViolation with message 'Access violation ad adress 000000000. Read of adress 000000'. PRocess stopped...ICh habe jetzt die 0 nicht gezählt...
[ Dieser Beitrag wurde am 24.01.2003 um 13:35 Uhr von DJ BlackEagle editiert. ]
-
Lies F98' Frage 3, lies deine Antwort 3.
Was ist der Wert von DllInstance?
-junix
-
Original erstellt von junix:
**Lies F98' Frage 3, lies deine Antwort 3.Was ist der Wert von DllInstance?
-junix**
Oops, ja hat ne Adresse..
[cpp]
typedef int (__stdcall *IMPFUNC) (int, int);IMPFUNC DllFunktion;
int iSumme;if (DllInstance)
{DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "Addiere"); // Hier ist der wert für DLLFunktion NULL
iSumme = DllFunktion(Edit1->Text.ToIntDef(0), Edit2->Text.ToIntDef(0));// DA schmiert der ab.[/cpp]
Da DllFunktion den Wert NULL hat, heißt das er ein Fehler hat, laut BCB Hilfe. Wäre alles Ok, wäre die Adresse drin. Aber die ist es nicht. why?
[ Dieser Beitrag wurde am 24.01.2003 um 14:06 Uhr von DJ BlackEagle editiert. ]
-
Original erstellt von junix:
**Lies F98' Frage 3, lies deine Antwort 3.Was ist der Wert von DllInstance?
-junix**
Öhm, hab grad F98 nochmal gelesen, da hat er auch von DllFunktion geredet und nicht von DllInstance.
-
Da Du das Addieren-Beispiel auf meiner Seite verwendest: Dort heißt die Funktion in der DLL: Addieren
Und im *.lib-lade-Beispiel solltest Du dann auch Addieren mit n verwenden:
[cpp]
DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "Addieren");[/cpp][ Dieser Beitrag wurde am 24.01.2003 um 14:09 Uhr von F98 editiert. ]
-
Original erstellt von F98:
[qb]Da Du das Addieren-Beispiel auf meiner Seite verwendest: Dort heißt die Funktion in der DLL: Addieren[QB]Habs geändert, aber trotzdem immer noch der Fehler.
PS: Hab Copy Paste von deiner Seite gemacht.[ Dieser Beitrag wurde am 24.01.2003 um 14:12 Uhr von DJ BlackEagle editiert. ]
-
1. Lies hier Abschnitt 2.1
2. Die frage nach DllInstance war eine von mir formulierte Frage... klar weiss ich dass F98 nach dem Funktionszeiger gefragt hat.-junix
-
Aso. Hatte das irgendwie mit Frage 3 in zusammenhang gebracht. Sorry.
DllInstance = :003D000
DllFunktion = NULL
-
Ahja, BTW: Wennimmer du irgendwelche Zeiger welche du in dieser Art erhalten hast verwendest (also mit möglichem Rückgabewert NULL) prüfe den Zeiger bevor du ihn verwendest! das ist enorm wichtig.
Ich frage nochmals: Besitzt DllInstance einen gültigen Wert?
-junix
-
Öhm...
KA.
Weiß nur das er nen WErt hat...
Woher soll ich wissen ob er gültig ist???
Wie soll ich das den überprüfen?Was ich dann nicht verstehe ist, warum der Code nicht bei mir geht, wenn er bei ihn geht....
-
Also, ich habe mein Beispiel nochmal nachvollzogen. Die DLL wird geladen (DllInstance hat eine gültige Adresse), nur bekommt DllFunktion keine gültige Adresse zugewiesen, ist also NULL.
Hm.
Mit der Delphi-DLL funktionierts, mit der vom BCB generierten nicht...
-
Das freut mich das es nicht an mir liegt..
Schade. ICh habe das auf thebits.org genau auch ein Tut gesehen, da mußt ich mir noch ne DLL namens Nviewlib.dll runterladen, da war auch alles so erklärt wie bei dir, nur das etwas anders war. ICh habe das auf deine dll Tut umgeändert (zugriff auf deine DLL), und das ging auch nicht...Wie kann man das den jetzt lösen?
-
Tja, da bin ich mit meinem Latein auch am Ende. Vielleicht sind ja noch ein paar DLL-Meister hier im Forum, die uns da weiterhelfen können ...
-
Versucht doch mal, wenn ihr die Dll mit BCB erstellt habt, statt "Addieren"
die Funktion "_Addieren" einzubinden.
Entgegen der Annahme, das extern "C" den Namen der Funktion nicht verändert, steht in eurer DLL tatsächlich nur eine Funktion mit dem Namen "_Addieren".Also:
DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "Addiere");
Man kann sich das z.B. mit dem Dependency Walker von MS ansehen.
Da ihr die Funktion über den Namen importieren wollt und nicht über die Ordinalzahl, müsst ihr den Namen so angeben, wie er in der Dll gespeichert ist. Ansonsten wird die Funktion nicht gefunden.
-
Sorry,
sollte natürlichDllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren");
hiessen.
Blödes CutAndPaste...
-
Jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
Es geht: :p
[cpp]
#include <vcl.h>
#pragma hdrstop
#include "windows.h" // Wichtig!!
#include "TestUnit.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString DLLFile = "d:\\Borland\\DllTestneu\\Project1.dll";
DllInstance = NULL;
if (FileExists(DLLFile))
if (!DllInstance) DllInstance = LoadLibrary(DLLFile.c_str()); // DLL laden
if (DllInstance) Form1->Caption = "DLL wurde geladen.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (DllInstance)
if (FreeLibrary(DllInstance)) DllInstance = NULL; // DLL entladenif (!DllInstance) Form1->Caption = "DLL nicht geladen.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// Funktionstyp deklarieren
typedef int (__stdcall *IMPFUNC) (int, int);// Deklaration für die DLL-Funktion
IMPFUNC DllFunktion;
int iSumme;if (DllInstance)
{// Addresse der Funktion "Addiere" in der DLL herausfinden
DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren");// DLL-Funktion aufrufen,
// An die DLL werden 2 int-Werte übergeben (aus Edit1 und Edit2)
// Rückgabewert ist ein int-Wert (Summe)
iSumme = DllFunktion(Edit1->Text.ToIntDef(0), Edit2->Text.ToIntDef(0));Label1->Caption = IntToStr(iSumme);
}
else
{
Label1->Caption = "Bitte DLL laden!";
}
}[/cpp]Danke an SilentSurfer für den Tip!