Von DLL ausgelöstes Event



  • Hi!

    Ich hab' da ein Problem:
    Ich übergebe da Adressen von Funktionen an eine externe Funktion von einer DLL.
    Es werden dann irgendwann Events ausgelöst. Das Problem was ich habe ist jetzt, dass das Programm aber schon längst zu Ende ist bevor schon irgendwas ausgelöst werden kann.

    Ich hoffe jemand kann mir helfen.
    MfG
    davidek

    #include <windows.h>
    #include <stdio.h>
    
    #include "casioio.h"
    
    int handle;
    void onSend();
    void onReceive();
    void (*pOnSend)();
    void (*pOnReceive)();
    
    void main()
    {
      printf("Start von main\n");
      if (CasioIO_Init(1,1) == 1) 
      { 
        pOnSend = onSend;
        pOnReceive = onReceive;
        handle = CasioIO_Open(456,123,pOnSend,pOnReceive);
        printf("Init erfolgreich. Open erfolgreich. handle = %d",handle);
      }
    }
    
    void onSend()
    {
      printf("onSend aufgerufen.");
      unsigned char datatype;
      unsigned char name;
      unsigned char rows;
      unsigned char columns;
      double values[5];
    
      if (CasioIO_AfterSend(handle,&datatype,&name,&rows,&columns,&values[0]) == 1)
      {
        printf("Datentyp: %d",datatype);
        printf("Name: %d",name);
        printf("Zeilen: %d",rows);
        printf("Spalten: %d",columns);
        printf("Inhalt der ersten Position: %d",values[0]);
      }
    }
    
    void onReceive ()
    {
      printf("onReceive aufgerufen.");
    }
    


  • Versuchs mal so (quick & dirty Lösung, müsste aber gehen -- d.h. wenn meine Annahmen richtig sind, und das Teil einen eigenen Thread rausstartet um mit dem CASIO zu kommunizieren):

    #include <windows.h>
    #include <stdio.h>
    
    #include "casioio.h"
    
    volatile int fertig = 0;
    int handle;
    
    void onSend();
    void onReceive();
    //void (*pOnSend)(); // überflüssig
    //void (*pOnReceive)(); // detto
    
    int main() // int, nicht void!
    {
      printf("Start von main\n");
      if (CasioIO_Init(1,1) == 1) 
      { 
        //pOnSend = onSend;
        //pOnReceive = onReceive;
        handle = CasioIO_Open(456,123,onSend,onReceive);
        printf("Init erfolgreich. Open erfolgreich. handle = %d",handle);
      }
    
      // warten bis wir fertig sind
      while (!fertig)
        Sleep(100); // wenns mit Sleep nicht geht: SleepEx(100, TRUE);
    
      // aufräumen
      CasioIO_Close(handle);
      CasioIO_Uninit();  
    
      // und tschüss
      return 0;
    }
    
    void onSend()
    {
      printf("onSend aufgerufen.");
      unsigned char datatype;
      unsigned char name;
      unsigned char rows;
      unsigned char columns;
      double values[5];
    
      if (CasioIO_AfterSend(handle,&datatype,&name,&rows,&columns,&values[0]) == 1)
      {
        printf("Datentyp: %d",datatype);
        printf("Name: %d",name);
        printf("Zeilen: %d",rows);
        printf("Spalten: %d",columns);
        printf("Inhalt der ersten Position: %d",values[0]);
      }
    
      // flag setzen wenn das Programm "fertig ist" und beendet werden soll
      if (1) // <- Bedingung musst du einsetzen
        fertig = 1;
    }
    
    void onReceive ()
    {
      printf("onReceive aufgerufen.");
    }
    

    Falls das nicht hilft frag doch einfach den Betreiber der Seite wo du das "CASIO SDK" vermutlich her hast: http://users.pandora.be/gp/casio/
    (email Adresse steht sogar im CHM File vom SDK



  • Vielen Dank für die Hilfe ersteinmal!

    Auf der Seite des Anbieters steht unter Contact leider "I currently don't have the time to answer any mails, sorry for this.", deswegen habe ich mich damit erstmal zurückgehalten. Ich habe aber auch schon eine eMail an die Adresse aus der .chm-Datei geschrieben, aber noch keine Antwort bekommen.

    Hast du oder jemand anders vielleicht Ahnung von VisualBasic? Ich habe mir das Beispiel-Programm mal angeguckt, ein paat VB-Tutorials dazu, und ich habe es sehr gut verstanden, obwohl ich nur "Casio-Basic" kann.

    Auf jeden Fall wird da so eine Form (Form1.frm) erstellt. Man drückt einen Knopf, der dann das Init und das Open ausführt. Zwei Timer wurden schon vorher erstellt, die sind aber inaktiv (Intervall=0). Die zwei Programme für die Events stehen in der Module1.bas drin. Davon werden beim Open auch die Adressen übergeben. In der Hilfe-Datei steht, dass man die anderen Funktionen (AfterSend, AfterReceive, RespondOnReceive) in VB nicht aus den vom Event aufgerufenen Funktionen aufrufen kann. Deswegen setzen sie das Timer-Intervall auf 5, also wird fast sofort ein Timer-Event ausgelöst, was dazu führt, dass es dann in die entsprechenden Funktionen geht (onSend_Timer, onReceive_Timer), wo der Rest dann abgewickelt wird.

    Jetzt Frage ich mich, wie VisualBasic das denn macht, dass die vom Event aufgerufenen Funktionen "durchkommen"?

    @hustbaer Ich probiere deine gepostete Lösung später aus. (Muss jetz weg.) Ich schreibe dann, ob es geklappt hat (hoffentlich).

    Jetzt noch ein bischen Hintergrund zu der Sache (Ich hab's beim ersten Post weggelassen 😉 ):
    Ich habe einen Grafik-fähigen Taschenrechner von Casio (So ein Ding zum Kurven zeichnen, Schule). Auf dem Ding kann man auch Programme in sogenanntem Casio-Basic schreiben. Das ganze kann man zwecks Datenaustausch auch mit dem Computer mit einem Kabel verbinden.
    Und die genialen Leute von GP haben jetzt eine DLL entwickelt, mit der man die Daten auch live im Programm hin- und herschicken kann, was nun also Zusammenarbeit mit dem PC eröglicht.
    Die Internetseite dazu ist (wie schon geschrieben) http://users.pandora.be/gp/casio/.
    Das Packet, was man sich runterladen kann, enthält:
    CasioIO.dll
    Eine Hilfe-Datei (+Referenz).
    Ein VB-Beispielprogramm mit Source
    Zum Einbinden in C++ ne .h und ne .lib

    Danke für Antworten schon mal im Vorraus 😉
    MfG
    davidek



  • Hi!

    Danke für Antworten schon mal im v****** 😉

    lol, was ist denn dan passiert. eigentlich sollte das zensierte wort heißen: vorraus.

    also ich hab' das programm jetzt mal ausprobiert, wie hier gepostet, aber leider hatte ich weder mit Sleep noch mit SleepEx erfolg.
    ich kriege auf dem taschenrechner einen com-error. die initialisierungwerte (authorID, productID) kann ich aber senden. es muss als irgendwas mit den events nicht klappen...

    mfg
    davidek



  • Danke für Antworten schon mal im vorraus 😉

    Was ist denn da passiert? eigentlich sollte das zensierte Wort wie folgt heißen: vorraus.

    Tja du solltest dir evt. nochmal die deutsche Rechtschreibung zu Herzen nehmen.
    => voraus



  • davidek schrieb:

    Hi!

    Danke für Antworten schon mal im v****** 😉

    lol, was ist denn dan passiert. eigentlich sollte das zensierte wort heißen: v******.

    also ich hab' das programm jetzt mal ausprobiert, wie hier gepostet, aber leider hatte ich weder mit Sleep noch mit SleepEx erfolg.
    ich kriege auf dem taschenrechner einen com-error. die initialisierungwerte (authorID, productID) kann ich aber senden. es muss als irgendwas mit den events nicht klappen...

    mfg
    davidek

    Wird denn onSend bzw. onReceive aufgerufen?
    Wenn ja liegt der Fehler schätze ich woanders. Wenn nein... weiss auch nicht.
    Visual Basic macht im Übrigen garnix bestimmtes damit da irgendwas geht - der Hauptunterschied ist dass es da ein Fenster gibt und der Hauptthread nicht in einer Warteschleife hängt sondern stattdessen in einem Message Loop.

    Du kannst das natürlich auch in C++ machen - mach einfach ein Fenster auf, und bau nen Message Loop ein.



  • (D)Evil schrieb:

    Danke für Antworten schon mal im v****** 😉

    Was ist denn da passiert? eigentlich sollte das zensierte Wort wie folgt heißen: v******.

    Tja du solltest dir evt. nochmal die deutsche Rechtschreibung zu Herzen nehmen.
    => voraus

    Klar, mach ich auch ab un zu, aber wie muss ich mich vertippt haben, dass ein Wort dabei herauskommt, das zensiert wird?

    Wird denn onSend bzw. onReceive aufgerufen?
    Wenn ja liegt der Fehler schätze ich woanders. Wenn nein... weiss auch nicht.

    Nein, sie werden nicht aufgerufen 😞 .

    Visual Basic macht im Übrigen garnix bestimmtes damit da irgendwas geht - der Hauptunterschied ist dass es da ein Fenster gibt und der Hauptthread nicht in einer Warteschleife hängt sondern stattdessen in einem Message Loop.

    Du kannst das natürlich auch in C++ machen - mach einfach ein Fenster auf, und bau nen Message Loop ein.

    OK, probier ich mal.

    Thx
    davidek



  • Klar, mach ich auch ab un zu, aber wie muss ich mich vertippt haben, dass ein Wort dabei herauskommt, das zensiert wird?

    Man schreibt "voraus" mit einem "r". Du hast es aber mit zwei "r" geschrieben. Da dieser Fehler so oftauftrat oder ka warum, wurde das wohl von den Adminstartoren auf die Liste der zensierten Worte gesetzt.



  • Irgendwie bekomme ich das mit dem MessageLoop in dem Fenster nicht hin.
    Wie stelle ich das an?

    Oder gibt es nicht doch noch eine Methode, wie man das ohne Fenster hinkriegt?

    Eigentlich wollte ich gar kein C++ lernen. (Will nur eine Wrapper-DLL schreiben, damit ich die CasioIO in Java einbinden kann... Wahrscheinlich packe ich das deswegen nicht.


Log in to reply