usbdmx.dll nutzen mit Delphi

  • In der Object-Pascal-Umgebung "Delphi" habe ich unter Einbindung der Liblrary usbdmx.dll das DE-Interface erfolgreich in Betrieb genommen. Die Daten von "DMX-In" lese ich dabei in einem festen Zeitraster aus. Dieses "Polling" ist allerdings ineffizient, da meistens keine Änderungen stattfinden. Um ereignisgesteuert zu reagieren, wurden in der DLL beispielsweise die Funktionen RegisterInputChangeNotification und UnregisterInputChangeNotification vorgesehen. Die Funktion RegisterInputChangeNotification beinhaltet den Parameter vom Typ THOSTINPUTCHANGEPROC. Ich vermute, das Proc der Bezeichner einer Routine im eigenen Programm ist, das aufgerufen werden soll, sobald eine Änderung der Eingabedaten erfolgte.


    Leider kenne ich mich auf dieser Ebene in Delphi nicht so gut aus, um die nötigen hierfür zu erzeugen. Es wäre für mich sehr hielfreich, wenn jemand einen kurzen Ausschnitt mit den Programmzeilen zur Verfügung stellen könnte, aus denen dies ersichtlich ist.


    Vielen Dank im Voraus,


    av@dmx.


    Ich habe weiter gesucht und getestet. Für RegisterdeviceChangeNotification und RegisterInputChangeotification habe ich eine funktionierende Lösung gefunden; sie ist wie folgt (Beispiel: RegisterInputChangeNotification):


    util main:
    interfaces
    type
    PDMXArray = ^TDMXArray;
    TDMXArray = array[0..511] of byte;
    TSERIAL = array[0..15] of Char;
    TSERIALLIST = array[0..31] of TSERIAL;
    THOSTDEVICECHANGEPROC = procedure; stdcall;
    THOSTINPUTCHANGEPROC = procedure; stdcall;
    THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall;
    ...
    function RegisterInputChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD;
    stdcall external 'usbdmx.dll';
    ...
    implementation
    {$R *.dfm}
    procedure InputChangeNotification;
    begin
    ... kurze Zuweisungen
    end;


    procedure Form1.ScanButtonClick(Sender: TObject);
    begin
    ...
    RegisterInputChangeNotification(@InputChangeNotification)
    ...
    end;


    Möglicherweise ist dies nicht der korrekte Weg, da die äquivalente Vorgehensweise für RegisterInputChangeBlockNotificatioen zum Absturz führt:


    util main;
    interfaces
    type
    PDMXArray = ^TDMXArray;
    TDMXArray = array[0..511] of byte;
    TSERIAL = array[0..15] of Char;
    TSERIALLIST = array[0..31] of TSERIAL;
    THOSTDEVICECHANGEPROC = procedure; stdcall;
    THOSTINPUTCHANGEPROC = procedure; stdcall;
    THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall;
    ...
    function RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK):
    DWORD; stdcall external 'usbdmx.dll';
    ...
    implementation
    {$R *.dfm}
    procedure InputChangeBlockNotification(Block : Byte);
    begin
    Edit1.Caption := IntToStr(Block);
    end;


    procedure Form1.ScanBlockButtonClick(Sender: TObject);
    begin
    ...
    RegisterInputChangeBlockNotification(@InputChangeBlockNotification);
    ...
    end;
    ...
    end.


    Das Programm läuft zunächst fehlerfrei. Sobald über DMX-In eine Veränderung eintrifft, wird offenbar die Procedur InputChangeBlockNotification(Block : Byte) aufgerufen (es erscheint in label1 die Nummer des 32bit-Blocks, in dem eine Änderung erfolgte; z.B. die "1", wenn Kanal 38 sich änderte, bzw. "0" bei Kanal 5) und nach zwei bis drei Sekunden erscheint die folgende Meldung in der Entwicklungsumgebung "Im Projekt ... sind zu viele aufeinander folgende Exceptions aufgetreten". Beim Aufruf der ausführbaren Datei erfolgt nach sehr viel kürzerer Zeit ein schlichter Absturz.


    Was läuft hier falsch und wie kann ich es korrigieren?


    Vielen Dank im Voraus für eine Lösung,


    av@dmx.

  • Ich bin leider im Schreiben von Forenbeiträgen unerfahren und hatte meine neuen Erkenntnisse im ersten Beitrag durch "Bearbeiten" ergänzt. Leider wird im Forum nicht angeezeigt, dass der Beitrag aktualisiert wurde. Ich hoffe, durch diese Antwort den Hinweis zu geben.


    av@dmx

  • Souko

    Added the Label DE Interface
  • Newly created posts will remain inaccessible for others until approved by a moderator.

    The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.