Dll Funktionsaufruf aus Thread
- 
					
					
					
					
 Ich versuche eine Funktion aus einer Dll aufzurufen, der leider mit 0xc0000005 fehlschlagen tut. Der selbe Aufruf aus der main funktion läuft ohne Probleme int main 
 {
 struct om_hdr_ptr om_hdr;
 int id;rtn=omopen(&om_hdr,&id);} 
 das läuft sauber schon seit wochenThread Beispiel: void omfunc( void * ); 
 int main
 {
 _beginthread( omfunc 0, NULL );
 }
 void omfunc(void * ignored)
 {
 struct om_hdr_ptr om_hdr;
 int id;rtn=omopen(&om_hdr,&id); Fehler 0xc0000005} was mache ich falsch das die Funktion den Pointer nicht lesen kann?? 
 
- 
					
					
					
					
 @Mike-P sagte in Dll Funktionsaufruf aus Thread: int main 
 {
 _beginthread( omfunc 0, NULL );
 }Das erzeugt einen neuen Thread, und beendet danach gleich das Programm. Ich vermute dass das das Problem ist. Ob es daran liegt kannst du ausprobieren indem du z.B. einfach mal ein Sleep(10000);nach_beginthread( omfunc 0, NULL );reinschreibst. Wenn der Crash dann erst 10 Sekunden später kommt - bzw. ganz ausbleibt - dann ist das vermutlich der Grund.
 
- 
					
					
					
					
 Danke für deine Anwort, ist nur ein Codeauszug, hab in main noch ein getchar(); zum warten. Habe es auch mit dem Debugger durch gestept es bleibt beim Funktionsaufruf hängen! 
 
- 
					
					
					
					
 Wow. Das motiviert mich jetzt gleich unglaublich mich weiter mit dem Problem zu beschäftigen. 
 
- 
					
					
					
					
 @Mike-P 
 hustbaer möchte Dir damit sagen, Du möchtest bitte ein auf das notwendigste gekürztes aber vollständiges Programm zeigen, mit dem sich das Problem nachvollziehen lässt.
 
- 
					
					
					
					
 Da ist nicht viel mehr code habe es zum testen, aufs minimum reduziert. 
 Es geht um eine Messung, wo man die Daten auslesen kann, eine .dll,.lib und eine Header kommen vom Hersteller.
 Dieser Code öffnet eine Liste und gibt dann die Listen ID zurück, mit dieser ID ist dann das auslesen des Listenwerte möglich(funktion omread).
 Die Strukturen sind in der Header definiert und auch die Definierung der Funktionen(omopen).
 Die *.lib Datei hab ich bei Visual Studio im Projekt->Linker eingetragen.
 Mit der Struktur open_vars legt man die Werte fest die man lesen möchte.
 Ist die Liste angelegt kann man sie im Display der Messung auslesen, zum checken.
 Das funktioniert auch alles, aber nur wenn ich die Funktion omfunc direkt in main aufrufe, ruft ein Thread sie auf kommt der Zugriffsfehler.
 An der Funktion omopen werden ja Zeiger übergeben, es sieht so aus als ob wenn man die Funktion vom Thread startet, er kein Zugriff auf die Speicheradresse des Zeigers hat.
 Eigentlich sollte ein Thread die Liste öffnen und zyklisch die Werte lesen.#include <Windows.h> #include <stdio.h> #include "omlist.h" void omfunc( void * ); int main() { //Es ist beim testen immer nur ein Aufruf aktiv omfunc(); // Dieser Aufruf funktioniert ohne Probleme und die Liste wird im Gerät angelegt _beginthread( omfunc, 0, NULL ); //Aufruf vom Thread Fehler 0xc0000005 Zugriffsfehler getchar(); return 0; } void omfunc(void * ignored) { 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 }
 
- 
					
					
					
					
 Hmh, jetzt auf einmal geht eine vernünftige Code-Formatierung und ein SSCCE doch?  
 
- 
					
					
					
					
 @Mike-P sagte in Dll Funktionsaufruf aus Thread: Überprüfe mal die Variablen on_hdr,vars[1]exakt ob diese richtig initialisiert wurden. Gerade in Bezug auf Arrays der Größe 1 habe ich da schlechte Erfahrungen gemacht.BTW: Müsste da nicht vars[0].name="Temperatur_c11";stehen?
 
- 
					
					
					
					
 @Mike-P 
 Noch ein BTW: Müsste da nichtvoid __cdecl omfunc(void * ignored)stehen?
 
- 
					
					
					
					
 @Mike-P 
 Und noch ein Tipp: Nutztestd::threadstatt_beginthread.
 
- 
					
					
					
					
 @Quiche-Lorraine Habe ich auch überlegt, machen die hier: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/beginthread-beginthreadex?view=msvc-170 aber auch nicht 
 
- 
					
					
					
					
 @Quiche-Lorraine Oder, wenn C++ 20 möglich ist std::jthread
 
- 
					
					
					
					
 @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 
 
- 
					
					
					
					
 @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. 
 
- 
					
					
					
					
 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, LesezugriffsfehlerIch verstehe deinen Code nicht. Warum ist varsals ein Array der Größe 1 definiert?
 Können da mehrereopen_varVariablen übergeben werden?
 Wenn ja, woher weiß die Funktionomopendie 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 omopenauch 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 omopendie Anzahl dervarsParameter kennt.Nicht dass die Funktion meint om_hdr.open_list_ptrwäre ein Array von 2varsElementen und entsprechend beschreibt. Das knallt dann abhängig vom aktuellen Mondstand.
 
 
			
			
		
