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

    Code 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;
    //---------------------------------------------------------------------------
    #endif
    

    code 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


Anmelden zum Antworten