DLL Funktionsproblem



  • Hallo,

    ich hab folgendes Problem:
    ich soll eine DLL einbinden und mit Hilfe einer Funktion aus dieser DLL eine Hardware abfragen.
    Die DLL konnt ich erfolgreich einbinden, und eine Funktion die mir bei der Abfrage der Hardware helfen könnte habe ich auch schon gefunden.
    Nur wenn ich auf diese zugreifen will, dann kommt immer die Fehlermeldung
    "raised exception class EAccessViolation with message 'Die Anwendung ist für diese Funktion nicht lizenziert'".
    Diese macht aber wenig sinn denn der Hardwareherrsteller hat diese selbst zur Verfügung gestellt.
    Vielleicht habt ihr ne Ahnung was ich verkehrt gemacht hab.
    hier mein kleines testprogramm
    .h

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <FileCtrl.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TButton *Button1;
            TButton *Button2;
            TButton *Button3;
            TLabel *Label1;
            TEdit *Edit1;
            TEdit *Edit2;
    
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button3Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    private:	// User declarations
        HINSTANCE DllInstance; // Instanz auf die DLL deklarieren
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    .cpp

    #include <vcl.h>
    #pragma hdrstop
    #include "windows.h"
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        if (!DllInstance) DllInstance = LoadLibrary("CubeAV.dll"); // DLL laden
    
        if (DllInstance) Form1->Caption = "CubeAV.dll wurde geladen.";
    }
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        if (DllInstance)
           if (FreeLibrary(DllInstance)) DllInstance = NULL; // DLL entladen
    
        if (!DllInstance) Form1->Caption = "CubeAV.dll nicht geladen.";
    }
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        // Funktionstyp deklarieren
        typedef unsigned char (__stdcall *IMPFUNC) (void);//???
    
        // Deklaration für die DLL-Funktion
        IMPFUNC DllFunktion;
        char cStatus;
        unsigned char *ComCode;
        ComCode ="A0006280";
        if (DllInstance)
        {
            //DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "Addiere");
            DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "?GetCurrentMode@CCubeAV@@QAEEXZ");
    
            if (DllFunktion)
            {
                // DLL-Funktion aufrufen,
                cStatus = DllFunktion();
    
                Label1->Caption = cStatus;
                Form1->Caption = "Funktionsname existiert!";
            }
            else Form1->Caption = "Funktionsname existiert nicht!";
        }
        else
        {
            Label1->Caption = "Bitte DLL laden!";
        }
    }
    

    "?GetCurrentMode@CCubeAV@@QAEEXZ" steht für
    "unsigned char CCubeAV::GetCurrentMode(void)"
    (hab ich mit Dependency Walker rausgefunden)



  • Hast oder hattest du zuvor oder parallel eine andere BCB-Version installiert?



  • hatte davor version 5 drauf, aber da ich sie unter xp net zum laufen gebracht hatte ist version 6 gekommen.

    noch ein nachtrag zu der ausgewählten funktion:
    die "?GetCurrentMode@CCubeAV@@QAEEXZ" die ich bräuchte gibt die
    besagte fehlermeldung aber diese Funktion geht
    "?NotifyCurrentMode@CCubeAV@@QAEXH@Z"
    ohne fehlermeldung.



  • CS schrieb:

    hatte davor version 5 drauf

    Das ist eine potentielle Ursache für das Problem. Um das auszuschliessen müsstest du den BCB6 komplett de- und dann neuinstallieren, einschliesslich der ggf. manuellen Entfernung sämtlich verbliebener BCB5- und/oder BCB6-Dateien und aller Borland-bezogenen Registry-Einträge.



  • hi there,

    sach mal "cubeAV.dll" hört sich für mich nach dem AOpen EA65 AV Cube an. hast Du den Auftrag von AOpen bekommen, dies zu tun?

    mfg,

    stonie



  • Sach mal, wieso gräbst du so nen alten Thread aus?



  • Und vor allem: Wie hast du den ohne Suchfunktion überhaupt gefunden?



  • Das Forum lässt sich zum Grossteil auch noch durchsuchen, wenn man unter www.google.ch hingeht und als Suchwort "site:c-plusplus.net" zur restlichen Abfrage hinzufügt.



  • HEZ schrieb:

    Und vor allem: Wie hast du den ohne Suchfunktion überhaupt gefunden?

    HEZ, denk mal nicht 2dimensional.. 😃
    geh mal auf www.google.de und gib das als suche ein:

    Googlesuche schrieb:

    site:www.c-plusplus.net DLL Funktionsproblem

    🤡

    [edit] och zu spät... 😞 [/edit]


Anmelden zum Antworten