usbdmx.dll nutzen mit Delphi

We proudly present: The release of DMXControl 3.3.3!


On September 29, 2026, we held our release show for DMXControl 3.3.3. During our usual “hour-long” session, we showed you all the new features in this version and what it now has to offer.
Read all about it in the corresponding news article: We proudly present: The release of DMXControl 3.3.3!


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

    Edited once, last by av@dmx: neue Erkenntnisse (April 20, 2014 at 5:30 PM).

  • 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 April 9, 2018 at 7:27 PM

    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.