Dll Funktionsaufruf aus Thread



  • @Quiche-Lorraine sagte in Dll Funktionsaufruf aus Thread:

    vars[0].name="Temperatur_c11";

    ja stimmt muss es, hab ich auch so gemacht, nur hier im forum falsch


  • Mod

    @Mike-P sagte in Dll Funktionsaufruf aus Thread:

    ja stimmt muss es, hab ich auch so gemacht, nur hier im forum falsch

    Was bedeutet, dass du Code hier für das Forum getippt hast, anstatt deinen Fehlercode zu kopieren. Tu das nicht! Immer Copy&Paste von dem minimalen Codebeispiel, das den Fehler produziert! Gerade bei komischen Fehlern in C kommt es auf jedes einzelne Zeichen an. Da darf der Code im Forumsbeitrag nicht nur so ähnlich aussehen, sondern er muss identisch sein zum Fehlercode.



  • der code stimmt jetzt hier nochmal die Fehlermeldung vom debuggen

    Unhandled exception at 0x0f6e3f99 (ntdll.dll) in om_app.exe: 0xC0000005: Access violation reading location 0x00000074.



  • @Mike-P

      struct om_hdr_ptr om_hdr;
      struct open_var vars[1];
      int id;
      int rtn;
         
      vars[0].name="Temperatur_c11";
      om_hdr.open_list_ptr = vars;
      om_hdr.device_id = 1;
    
       rtn=omopen(&om_hdr,&id);  // beim Aufruf von omopen, Lesezugriffsfehler
    

    Ich verstehe deinen Code nicht.

    Warum ist vars als ein Array der Größe 1 definiert?
    Können da mehrere open_var Variablen übergeben werden?
    Wenn ja, woher weiß die Funktion omopen die Anzahl?



  • Ja es können mehere open_var übergeben werden;

    Hab eine liste mit 10 Werten.

    struct open_var vars[10];
    
    vars[0].name="Temperatur_c11";
    vars[1].name="Menge_Betrieb_f1";
    vars[2].name="dichte_d13";
    ...
    

    habe es nur zum test mit ein Wert gemacht

    om_hdr.open_list_ptr = vars;
    

    wird ja da komplett übergeben, so steht im Beispiel vom Hersteller, das leider nicht sehr genau ist.
    wenn es jetzt garnicht laufen wurde, als einfache anwendung in main ja, bloss nicht im seperaten Thread



  • @Mike-P Du solltest sauber abtippen oder wirklich besser Copy&Paste nutzen. Dein Code Beispiel schreibt alles an die gleiche Stelle, nämlich an die erste Stelle im Array. Was für eine Software willst du denn ansteuern? Ist die Multithreading fähig? Ich gehe mal davon aus, das omopen auch schon von dem Anbieter stammt?



  • ja kommt vom Hersteller



  • @Mike-P sagte in Dll Funktionsaufruf aus Thread:

    wenn es jetzt garnicht laufen wurde, als einfache anwendung in main ja, bloss nicht im seperaten Thread

    Prüfe trotzdem mal woher die Funktion omopen die Anzahl der vars Parameter kennt.

    Nicht dass die Funktion meint om_hdr.open_list_ptr wäre ein Array von 2 vars Elementen und entsprechend beschreibt. Das knallt dann abhängig vom aktuellen Mondstand.



  • @Mike-P Gibt es dazu eine offizielle Dokumentation oder irgendwas was du uns als Information über die Funktion geben kannst?



  • omopen – Open a Set of Values
    This call opens a list of up to 255 Values.

    Format:

    int omopen(<om_descriptor>,<open_id>)
    
    struct om_hdr_ptr *om_descriptor;
    int *open_id;
    

    Where:
    *om_descriptor A pointer to the header_node data structure
    *open_id A pointer to the location where the Manager returns the list
    number.

    mehr hab ich nicht dazu und ein kurzes Beispiel was ich so aber umgesetzt habe.



  • @Mike-P sagte in Dll Funktionsaufruf aus Thread:

    This call opens a list of up to 255 Values.

    Dann probiere doch mal 255 Werte zu übergeben. Der erste Wert initalisierst du wie üblich, die restlichen initalisierst du mit 0.

    Crasht dann dein Programm auch?


  • Mod

    Doku der header_node (struct om_hdr_ptr) Datenstruktur?



  • @Mike-P Da das mit dem Abschreiben ins Forum schon zwei mal problematisch war, vlt kopierst du uns das Beispiel auch mal hier rein



  • @Mike-P
    Es wäre gut wenn du hier die Definitionen der Strukturen om_hdr_ptr und open_var zeigen könntest. Bzw. wenn das aus rechtlichen Gründen nicht möglich ist, dann solltest du dir die selbst mal genau ansehen.
    Irgendwoher muss die Funktion ja wissen wie viel Parameter es sind. Und wenn es keinen Wert in om_hdr_ptr gibt mit dem man das angibt, dann gibt es zwei denkbare Möglichkeiten:

    1. Die Funktion nimmt immer das dokumentierte Maximum an
    2. Es gibt eine Art "Terminator" - also z.B. die Parameterliste endet mit einem Eintrag mit name = NULL oder name = ""

    Was auch noch komisch ist, ist dass die Strukturen nicht mit memset bzw. ={} vor-initialisiert werden. Selbst wenn das im Beispiel vom Hersteller so steht, muss es nicht richtig sein. Ich hab schon so extrem viel schlechten Beispielcode von Herstellern gesehen... also verlass dich bloss niemals darauf dass da alles richtig gemacht wird.


Anmelden zum Antworten