CharWerte aus Dll lesen
-
Hallo @ all
Ich habe mal versucht eine dll zu schreiben und eine Form daraus auslesen zu lassen das hatte auch Prima funktioniert.
Nun wollte ich Strings bzw. Char werte auslesen da haut es alles schon mal wieder net hin weiß im mom net weiter würde mich über Hilfe freuen.
PS: Die Suchfunktion geht hier net ....
Code aus der DLL
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------- extern "C" __declspec (dllexport) void Trial_Form(char *Reg_Serial)// String Reg_Company, String Reg_Serial) { TStrings* Liste1 = new TStringList(); Liste1->LoadFromFile("TApplication.key"); Reg_Serial = "FF00-000-000-FFDH"; }Header Datei meines Programms
private: // Anwender-Deklarationen typedef void TTrial_Form(char *Reg_Serial);Aufruf der dll im Hauptprogramm
__fastcall TSplash_Form_1::TSplash_Form_1(TComponent* Owner) : TForm(Owner) { TTrial_Form* Trial_Form; HINSTANCE h = LoadLibrary("trial.dll"); if(h != 0) Trial_Form = (TTrial_Form*)GetProcAddress(h,"_Trial_Form"); else { FreeLibrary(h); MessageDlg("Kann ' trial.dll ' nicht laden ! Programm wird geschlossen !",mtInformation, TMsgDlgButtons() << mbOK, 0); Application->Terminate(); } if(Trial_Form != NULL) { // Hier wollte ich Reg_Serial aufrufen kommt aber immer die // Fehlermeldung Trial_Form(*keine Parameter erwartet*) Name->Caption = Trial_Form(Reg_serial); } else FreeLibrary(h); } //---------------------------------------------------------------------------
-
Hallo,
Deine Trial_Form-Funktion gibt ja auch nichts zurück (Rückgabetyp void).
Du müsstest für Reg_Serial erstmal Speicher bereitstellen und dann deinen String da hineinkopieren (mit strcpy, nicht nur zuweisen). Einfacher wirds für dich wenn du auf char* ganz verzichtest und statt dessen std::string oder ähnliches verwendest.
Was soll deine Funktion eigentlich bewirken. So wie sie da steht ist sie nämlich ziemlich sinnlos.
-
@ Braunstein
Ich weiß sieht alles noch ein wenig komisch aus wollte aber erst mal probieren ob ich einen String aus einer Dll in mein Hauptprogramm bekomme .
Zu einen späteren Zeitpunkt wenn ich es mal hinbekommen habe es aus der dll zu lesen soll die werte aus der StringList gelesen werden aus einer *key datei.
habe ja gelesen das ich statt String lieber char oder ShortString bei einer dll
benutzen soll.(Buch gelesen)//Bin villeicht zu dumm dazu//Aber das hat im mom eh noch keinen zweck weil ich ja noch nichmal Reg_Serial auf mein Hauptformular in das Feld Serial->Caption = Trial_Form(Reg_Serial) aus der dll bekomme.
Es soll ja auch irgendwann noch name und company und so weiter aus der dll kommen .
PS: Ein Formular geht ja ohne Prob aber dieses eben nicht.
Gruss Praetorianer
-
Ich würde halt std::string als Rückgabetyp empfehlen. Da hast du dann keine Probleme mit der Speicherverwaltung.
Auf dein Beispiel bezogen etwa so:extern "C" __declspec (dllexport) std::string Trial_Form()// String Reg_Company, String Reg_Serial) { TStrings* Liste1 = new TStringList(); Liste1->LoadFromFile("TApplication.key"); delete Liste1; //[edit] Ok habs hinzugefügt return "FF00-000-000-FFDH"; }private: // Anwender-Deklarationen typedef std::string TTrial_Form();__fastcall TSplash_Form_1::TSplash_Form_1(TComponent* Owner) : TForm(Owner) { TTrial_Form* Trial_Form; HINSTANCE h = LoadLibrary("trial.dll"); if(h != 0) Trial_Form = (TTrial_Form*)GetProcAddress(h,"_Trial_Form"); else { FreeLibrary(h); MessageDlg("Kann ' trial.dll ' nicht laden ! Programm wird geschlossen !",mtInformation, TMsgDlgButtons() << mbOK, 0); Application->Terminate(); } if(Trial_Form != NULL) { // Hier wollte ich Reg_Serial aufrufen kommt aber immer die // Fehlermeldung Trial_Form(*keine Parameter erwartet*) Name->Caption = Trial_Form().c_str(); } else FreeLibrary(h); } //---------------------------------------------------------------------------
-
!! Liste1 frei geben !!
-
hallo
Habe es probiert funktioniert auch, aber was machhe ich mit mehrern Werten.
Ich geb was in die Schnittstelle und es wird auf dem Hauptformular net ausgegeben. Warum funktioniert es wenn ich die Schnittstelle leer lasse,
sobald ich Werte übergebe geht es net. DankeCode DLL
extern "C" __declspec (dllexport) String Trial_Form(String Reg_Name, String Reg_Company) { TStrings* Liste1 = new TStringList(); Liste1->LoadFromFile("TApplication.key"); Reg_Name = Liste1->Strings[4]; Reg_Company = Liste1->Strings[5]; delete Liste1; //Reg_Serial = "FF00-000-000-FFDH"; return Reg_Name,Reg_Company; }Code aus Header
//--------------------------------------------------------------------------- #ifndef SplashH #define SplashH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <jpeg.hpp> //--------------------------------------------------------------------------- class TSplash_Form_1 : public TForm { __published: // Von der IDE verwaltete Komponenten TImage *Splash_1; TLabel *Registrierung; TLabel *Name; TLabel *Company; TLabel *Serial; TLabel *Reg_Date; TLabel *Version; TLabel *VNR; TLabel *Trial_Time; TLabel *Noch; TLabel *Tage; void __fastcall FormCreate(TObject *Sender); private: // Anwender-Deklarationen typedef String TTrial_Form(String Reg_Name,String Reg_Company); public: // Anwender-Deklarationen __fastcall TSplash_Form_1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TSplash_Form_1 *Splash_Form_1; //--------------------------------------------------------------------------- #endifcode aus dem Programm
__fastcall TSplash_Form_1::TSplash_Form_1(TComponent* Owner) : TForm(Owner) { TTrial_Form* Trial_Form; HINSTANCE h = LoadLibrary("trial.dll"); if(h != 0) Trial_Form = (TTrial_Form*)GetProcAddress(h,"_Trial_Form"); else { FreeLibrary(h); MessageDlg("Kann ' trial.dll ' nicht laden ! Programm wird geschlossen !",mtInformation, TMsgDlgButtons() << mbOK, 0); Application->Terminate(); } if(Trial_Form != NULL) { Name->Caption = Trial_Form(// hier sollte das stehen Reg_Name).c_str(); Company->Caption = Trial_Form(// hier sollte das stehen Reg_Company).c_str(); } else FreeLibrary(h); } //---------------------------------------------------------------------------
-
Hallo,
Eine Funktion kann doch nicht mehrere Returnwerte haben. Entweder du übergibst deine Strings (in der Parameterliste der Funktion) per Referenz (dann kannst du sie neu belegen und erhälst die Werte zurück) oder du gibst eine Struktur zurück, die beide Strings enthält.
Es scheint mir als solltest du mal ein C++ Tutorial zum Theme Funktionen bzw. Variablenübergabe durchlesen.
Ciao