Problem mit Programm und DLL
-
Was sagt dir denn der #define __Export_Type ?
-
SilentSurfer schrieb:
Was sagt dir denn der #define __Export_Type ?
Weiß es nicht. Ist aus einem Beispiel aus der BCB Hilfe. Meine erste DLL die ich erstelle.
-
OK,
nur kurz:
Du exportierst aus deiner Dll nur diese Versionfunktion. Die Anweisung dafür hast du ja selber hingeschrieben.
Die anderen Funktionen sind nicht exportiert worden, weil kein _EXPORT_TYPE vorangestellt ist.
Logischerweise kann sie der Linker dann auch nicht finden.
-
Und nicht nur das. Auch die Funktionen, die Exportiert werden sollten sind Methoden von TMainForm (Darf nicht sein, wenn es Funktionen aus der Dll sein sollen). Und die Implementation von AnsiString TMainForm::Base64Encod() ist in der dll, aber der Kommentar ganz oben lügt (trotz des Grammatikfehlers).
-
Hier ist jetzt der neue DLL Header. Aber der Fehler kommt immer noch.
#ifdef __BUILDING_THE_DLL #define __EXPORT_TYPE __export #else #define __EXPORT_TYPE __import #endif AnsiString __EXPORT_TYPE Base64Encod(AnsiString slToEnc); AnsiString __EXPORT_TYPE Base64Decod(AnsiString slToDec); AnsiString __EXPORT_TYPE CTWordEncod(AnsiString slToEnc); AnsiString __EXPORT_TYPE CTWordDecod(AnsiString slToDec); void __EXPORT_TYPE Version();
@bIce Verstehe nicht genau was du meinst
-
Ich hab jetzt angepasst wie das ungefähr aussehen könnte. Es kann aber sein, dass ich einen Fehler eingebaut habe.
Zunächst die Dll:
Die Header-Datei: (muss auch von der Cpp-Datei der Exe inkludiert werden).// Aus der DLL die Header Datei #ifdef __BUILDING_THE_DLL #define __EXPORT_TYPE __declspec(dllexport) #else #define __EXPORT_TYPE __declspec(dllimport) #endif __EXPORT_TYPE char * Base64Encod(char * slToEnc); __EXPORT_TYPE char * Base64Decod(char * slToDec); __EXPORT_TYPE char * CTWordEncod(char * slToEnc); __EXPORT_TYPE char * CTWordDecod(char * slToDec); __EXPORT_TYPE void Version(); // AnsiString sollte man nicht verwenden, damit es etwas portabler ist.
Die Cpp-Datei:
// Aus der Dll die *.CPP Datei //--------------------------------------------------------------------------- #include <vcl.h> // Damit die Funktionen exportiert werden. //- Muss auf jedenfall vor dem Inkludieren des //- Dll-Headers aufgerufen werden. #define __BUILDING_THE_DLL #include "KonverterDLL.h" #include "Romain.h" #include <math.h> #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- char * Base64Encod(char * slToEnc) { //TODO: Implementieren } //--------------------------------------------------------------------------- char * Base64Decod(char * slToDec); { //TODO: Implementieren } //--------------------------------------------------------------------------- char * CTWordEncod(char * slToEnc); { //TODO: Implementieren } //--------------------------------------------------------------------------- char * CTWordDecod(char * slToDec); { //TODO: Implementieren } //--------------------------------------------------------------------------- void Version() { MessageBox ( NULL, "Version: v1.0.0.0 Beta", "Konverter DLL", MB_OK ); } //--------------------------------------------------------------------------- #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //---------------------------------------------------------------------------
Jetzt die Exe:
Zum Projekt der Exe musst Du auch noch die *.lib-Datei der Dll hinzufügen.header-Datei:
// Aus dem Progamm die Header Datei //--------------------------------------------------------------------------- #ifndef RomainH #define RomainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Buttons.hpp> #include <ComCtrls.hpp> //--------------------------------------------------------------------------- class TMainForm : public TForm { __published: // Von der IDE verwaltete Komponenten TRichEdit *RichEdit1; TSpeedButton *SpeedButton1; TSpeedButton *SpeedButton5; void __fastcall SpeedButton1Click(TObject *Sender); void __fastcall SpeedButton5Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TMainForm(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TMainForm *MainForm; //--------------------------------------------------------------------------- #endif
Und die Cpp-Datei
// Aus dem Progamm die *.CPP Datei //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Romain.h" #include "KonverterDLL.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton5Click(TObject *Sender) { Version(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton1Click(TObject *Sender) { Base64Encod( RichEdit1->Text.c_str() ); } //---------------------------------------------------------------------------
EDIT: Ein paar Fehler beseitigt
-
Danke soweit geht das jetzt.
Bekomme aber noch einen Fehler! Wenn ich mit dem Programm Konvertiere. Bekomme ich den Fehler "Ungültige Zeigeropeation." Aber Funktionieren tut alles und den Konvertierten Text bekomme ich auch zurück. Aber wie bekomme ich diese Fehlermeldung weg???
-
Wo kommt den der Fehler? Und wie lässt es sich kompilieren, wenn ein Fehler auftaucht? Oder ist es eine Warnung?
-
Der Fehler kommt wenn ich im Programm auf den Button klicke.
Wenn ich dies aus der DLL raus nehme kommt der Fehler nicht mehr. Aber die funktion ist damit auch weg.
return slRetVal;
-
Liegt es evtl. daran, das du mit
return slRetVal;
einen AnsiString zurückgibst, obwohl der Rückgabewert in char* geändert wurde?
-
SilentSurfer schrieb:
Liegt es evtl. daran, das du mit
return slRetVal;
einen AnsiString zurückgibst, obwohl der Rückgabewert in char* geändert wurde?
Nein, habe den Rückgabewert wieder in AnsiString geändert und es geht auch nicht.
-
Hast du schon mit
return slRetVal.c_str();
versucht?
-
bIce schrieb:
Hast du schon mit
return slRetVal.c_str();
versucht?
Ja, dann habe ich den Fehler auch noch. Aber nicht mehr bei jedem mal. Seltsam
-
anfänger_sos schrieb:
bIce schrieb:
Hast du schon mit
return slRetVal.c_str();
versucht?
Ja, dann habe ich den Fehler auch noch. Aber nicht mehr bei jedem mal. Seltsam
Nicht so seltsam. Die Problematik von c_str() wurde meines Wissens hier schon
einige Male erörtert und man findet dazu auch einige Anmerkungen in der Hilfe.
Die Kernaussage ist, daß genau die obige Verwendung zu Problemen führen kann.
Deklariere Dir eine Variable, kopiere den Wert auf den c_str() verweist dort
hinein (vorheriges Speicher allokieren nicht vergessen) und gib diese Variable
zurück.Gruß,
Alexander
-
hmm,
Deklariere Dir eine Variable, kopiere den Wert auf den c_str() verweist dort
hinein (vorheriges Speicher allokieren nicht vergessen) und gib diese Variable
zurück.Ich verstehe nicht wie das gemeint ist.
-
So mache ich das für gewöhnlich. Ob das der beste und einfachste Weg ist,
weiß ich nicht, aber bei mir funktioniert er.char* cResult = new char[slRetVal.Length()+1]; // Speicher allokieren strcpy(cResult, slRetVal.c_str()); // String kopieren
Dieser Code steht übrigens auch in der BCB-Hilfe.
Such mal nach AnsiString c_str() (Beispiel).
Da steht auch ein Fall (der Deinem Fall ähnelt), bei dem es Probleme
geben könnte.Gruß,
Alexander
-
Danke.
Aber der Fehler kommt leider immer noch.
-
anfänger_sos schrieb:
Aber der Fehler kommt leider immer noch.
Jedesmal oder nur ab und zu?
Und welche Fehlermeldung?Gruß,
Alexander
-
So bald ich das erste mal Konvertiert habe kommt es fast jedes mal zu einer fehlermeldung.
Ungültige Zeigeroperation.
Der Text wird aber dennoch ordentlich Konvertiert. Also funktionieren tut alles, nur dieser fehler ist nicht schön.
-
Und bist Du dir sicher, dass der Fehler von der Dll ausgelöst wird?