Problem mit Delphi DLL



  • Hi,

    ich habe eine DLL die in Delphi geschrieben ist und die ich gern in meinem
    WinAPI Programm verwenden möchte. Diese DLL stellt Funktionen zu Verfügung
    die zur Ansteuerung eines Dimmers über rs232 nötig sind.

    Die für mich verwendbaren Funktionen sind:

    procedure DLLActivate(CallbackGetDLLValues,CallbackGetDLLNames,CallbackPluginFirstStart:Pointer);stdcall;

    Diese Funktion soll in meinem Programm die definierten CALLBACK Funktionen aufrufen Und aktuelle Werte an mein Programm liefern.
    Sie erwartet drei Pointer auf meine Funktionen.

    Die Callback Funktionen sind in Delphi so definiert:

    procedure CallbackGetDLLValues(address,startvalue,endvalue,fadetime:integer);
    procedure CallbackGetDLLNames(address:integer; channelname:PChar);
    procedure CallbackPluginFirstStart(address:integer);

    procedure DLLSenddata(address,startvalue,endvalue,fadetime:integer);stdcall;

    Mit dieser Funktion ist es möglich dem Dimmer neue Werte zu senden.

    Ich habe das ganze nun so gelöst:

    typedef void (CALLBACK *fpDLLGetValues)(DWORD, DWORD, DWORD, DWORD);
    typedef void (CALLBACK *fpDLLGetNames)(DWORD,char[30]);
    typedef void (CALLBACK *fpDLLPluginFirstStart)(DWORD);
    typedef void (WINAPI *fpActivate)(fpDLLGetValues,fpDLLGetNames,fpDLLPluginFirstStart);
    typedef void (WINAPI *fpSenddata)( DWORD, DWORD, DWORD, DWORD );
    fpActivate DLLActivate;
    fpSenddata DLLSenddata;

    void InitDll(HWND hDlg)
    {
    hLib = LoadLibrary( "PC_DIMMER_COM.DLL" );
    if ( !hLib )
    {
    MessageBox(hDlg, "PC_DIMMER_COM.DLL could not be found", "PC_DIMMER Remote Control" , MB_OK | MB_ICONERROR );
    SendMessage(hDlg,WM_CLOSE,0,0L);
    }
    else
    {
    DLLActivate = (fpActivate)GetProcAddress( hLib, "DLLActivate" );
    DLLSenddata = (fpSenddata)GetProcAddress( hLib, "DLLSenddata" );
    }
    }

    void CALLBACK DLLGetValues (DWORD address,DWORD startvalue,DWORD endvalue,DWORD fadetime)
    {
    MessageBox(NULL, "DLLGetValues success", "PC_DIMMER Remote Control" , MB_OK );
    }

    fpDLLGetValues CallbackGetDLLValues = (fpDLLGetValues) DLLGetValues;

    void CALLBACK DLLGetNames (DWORD address,char names)
    {
    MessageBox(NULL, "DLLGetNames success", "PC_DIMMER Remote Control" , MB_OK );
    }

    fpDLLGetNames CallbackGetDLLNames = (fpDLLGetNames) DLLGetNames;

    void CALLBACK DLLPluginFirstStart (DWORD address)
    {
    MessageBox(NULL, "DLLPluginFirstStart success", "PC_DIMMER Remote Control" , MB_OK );
    }

    fpDLLPluginFirstStart CallbackPluginFirstStart = (fpDLLPluginFirstStart) DLLPluginFirstStart;

    Danach wird DLLActivate unter WM_INITDIALOG aufgerufen:

    DLLActivate(CallbackGetDLLValues,CallbackGetDLLNames,CallbackPluginFirstStart);

    Das Problem was ich nun habe ist folgendes:

    Ich kann ohne Probleme Daten über DLLSenddata versenden aber sobald
    meine DLLGetValues Funktion Daten empfangen sollte kommt es zu einer
    Zugriffsverletzung.

    Zur Kontrolle habe ich die MessageBox Aufrufe eingebaut. Diese werden auch ausgeführt
    aber sobald man den OK Button drückt kommt es zur Zugriffsverletzung.

    Danach habe ich mit dem Debugger die übergebenen Were angesehen address steht auf 0 und die anderen 3 haben irgendwelche
    Werte von 15753140 usw. Die Werte sollten aber für address 1 - 8 sein und für die nächsten zwei 0 - 255 fadetime 0 - 10000

    Die Frage ist nun was ist an meinem Code falsch?

    Gruß Milbrot


Anmelden zum Antworten