DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
Hallo !
Sorry - nicht von Ihnen, sondern vom Original Autor (siehe oben).
Open gibt ein gültiges Handle zurück und wie gesagt open, getitemnodes und getidemnodes geht, gibt ein handle zurück, kein fehler und daten. nur die getdata nicht... (liefert eine 0 zurück (fehler) und die daten werden direkt aus dem erstellten array durchgeschoben)
alle bemühungen, die dll vom windows verzeichnis oder direkt von c: zu starten haben nichts gebracht...
14.10.2011, 11:09 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2011 11:10 von rolfk.)
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
(13.10.2011 10:55 )ralph.d schrieb: Hallo !
Sorry - nicht von Ihnen, sondern vom Original Autor (siehe oben).
Open gibt ein gültiges Handle zurück und wie gesagt open, getitemnodes und getidemnodes geht, gibt ein handle zurück, kein fehler und daten. nur die getdata nicht... (liefert eine 0 zurück (fehler) und die daten werden direkt aus dem erstellten array durchgeschoben)
alle bemühungen, die dll vom windows verzeichnis oder direkt von c: zu starten haben nichts gebracht...
Also GetItemDesc kann so wie es programmiert ist sowieso nichts sinnvolles tun. Da muss man dem vierten Parameter ein Array of Bytes spendieren das man anlegen muss und im dritten Parameter mitteilen wie gross dieses ist. So wie es jetzt ist wird diesen Parametern gar nichts mitgegeben. D.h. die Parameter werden "wahrscheinlich" durch LabVIEW auf die Default Werte gesetzt, was 0 für den dritten Parameter und ein NULL Array für den vierten Parameter bedeutet. Das ist aber unsauber und vertraut darauf dass LabVIEW schon alles sauber initilialisiert. Und selbst wenn LabVIEW das sauber macht UND die DLL-Funktion sich tatsächlich strikt daran hält was in der Dokumentation steht, macht der Funktionsaufruf absolut keinen Sinn. Denn was er eigentlich tut ist nichts anderes als die DLL bitten Informationen zurückzugeben, ihr aber jegliche Möglichkeit zu nehmen das dann auch wirklich zu tun.
Und zum Pfad: Kopiere die DLL ins selbe Verzeichnis als Deine VIs in denen Du sie aufrufst, Disable die Funktion um den Pfad im Diagram anzugeben, ändere den Pfad im Konfigurationsdialog um nur noch den DLL Namen zu enthalten und Du hast Dir wieder ein Problem erspart wenn Du später alles in ein Executable bauen willst. Diese Vorgehensweise ist nicht bei allen DLLs anzubefehlen, sondern nur bei DLLs die ohne weitere Abhängigkeiten ausser Windows APIs selbständig laufen.
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
Hab's nochmal probiert mit Verweis auf die DLL im Knoten selbst. Leider kein Erfolg. Aber GetitemNodes und GetItemDesc geht - siehe angehängtes Bild...
17.10.2011, 14:17 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2011 14:22 von rolfk.)
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
(17.10.2011 12:08 )ralph.d schrieb: Hab's nochmal probiert mit Verweis auf die DLL im Knoten selbst. Leider kein Erfolg. Aber GetitemNodes und GetItemDesc geht - siehe angehängtes Bild...
Sagen wir's so: GetItemDesc kracht zwar nicht, aber etwas im Speicher ist garantiert korrumpiert nach dem Aufruf dieser Funktion. Der 4. Parameter dieser Funktion ist nämlich ein Byte Array das vom Aufrufer alloziert werden muss. D.h. man sollte diesen Parameter als Arraypointer von U8 konfigurieren und mit Initialize Array ein Byte Array anlegen und übergeben. Im 3. Parameter übergibt man dann die Länge dieses Arrays und nach Rückkehr kürzt man das Array mit Array Subset auf die Länge die vom 3. Parameter zurückgegeben wurde.
Wenn die Funktion im 3.Parameter einen grösseren Wert zurückgibt dann man am Eingang angegeben hat, hat sie gemäss Dokumentation über das Ende des übergebenen Buffers geschrieben und damit eine Speicherkorrumption verursacht. So wie Du es im Moment implementiert hast übergibst Du einen 16 bit Integer als Buffer, also die Funktion kann genau 2 Bytes reinschreiben ohne den Speicher zu korrumpieren. Zudem initilisierst Du sowohl den 3. als auch den 4. Parameter nicht so dass es unsicher ist was die Funktion den darin überhaupt sieht.
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
OK. Vielen Dank für die Hilfe. Aber die GetitemNodes und GetItemDesc brauch ich eigentlich nicht wirklich... Hab ich nur probiert, da ich GetData nicht hinbekommen habe.
Und bei GetData kommen nur die Werte wieder raus, die ich im Array angelegt habe und in die DLL übergeben werden. Irgendwie ist das falsch. Als Rückmeldung von GetData bekomme ich ja auch "0" d.h. Fehler. Aber warum ? Ist das angelegte Array falsch initialisiert ?
Habe alle DLL Verweise rausgenommen und nur direkt im Knoten angegeben. Kein Erfolg...
Haben sie vielleicht noch ne Idee ?
19.10.2011, 17:06 (Dieser Beitrag wurde zuletzt bearbeitet: 19.10.2011 17:08 von rolfk.)
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
(19.10.2011 13:45 )ralph.d schrieb: OK. Vielen Dank für die Hilfe. Aber die GetitemNodes und GetItemDesc brauch ich eigentlich nicht wirklich... Hab ich nur probiert, da ich GetData nicht hinbekommen habe.
Und bei GetData kommen nur die Werte wieder raus, die ich im Array angelegt habe und in die DLL übergeben werden. Irgendwie ist das falsch. Als Rückmeldung von GetData bekomme ich ja auch "0" d.h. Fehler. Aber warum ? Ist das angelegte Array falsch initialisiert ?
Habe alle DLL Verweise rausgenommen und nur direkt im Knoten angegeben. Kein Erfolg...
Haben sie vielleicht noch ne Idee ?
Was ist der Wert der von ISMM_Open zurückgeliefert wird? Der Test auf gleich NULL davon ist falsch. Zwar kann er nie NULL sein aber der Wert der im Fehlerfall zurückgegeben wird ist -1. Wenn die Funktion also -1 zurückgibt bewirkt der Test dass die anderen Funktionen doch ausgeführt werden aber wenn sie intelligent programmiert sind machen sie einen Plausiblitätscheck bevor sie versuchen dieses Handle zu dereferenzieren. Und NULL und -1 sind halt eben keine gültigen Werte, so dass es gut sein kann dass die Funktion unmittelbar mit einem Fehlercode zurückkehrt.
Wenn bei ISMM_Open -1 rauskommt, wird der nächste Schritt sein herauszufinden weshalb das so ist. Dazu sollte man den Fehlercode der Windows API Funktion GetLastError() abfragen aber um das in LabVEIW sinnvoll zu machen und nicht irgendeinen Code zu lesen sondern der von der vorhergehenden Funktion, muss man den Funktionsaufruf und den Aufruf von GetLastError() in ein SubVI stopfen und dieses als Subroutine Priorität konfigurieren. Ansonsten können andere Funktion von LabVIEW zwischen den beiden Call Library Nodes aufgerufen werden die den GetLastError() ebenfalls modifizieren.
RE: DLL einbinden für Intel-Atom N270 an SuperI/O-Chip
(19.10.2011 13:45 )ralph.d schrieb: OK. Vielen Dank für die Hilfe. Aber die GetitemNodes und GetItemDesc brauch ich eigentlich nicht wirklich... Hab ich nur probiert, da ich GetData nicht hinbekommen habe.
Und bei GetData kommen nur die Werte wieder raus, die ich im Array angelegt habe und in die DLL übergeben werden. Irgendwie ist das falsch. Als Rückmeldung von GetData bekomme ich ja auch "0" d.h. Fehler. Aber warum ? Ist das angelegte Array falsch initialisiert ?
Habe alle DLL Verweise rausgenommen und nur direkt im Knoten angegeben. Kein Erfolg...
Haben sie vielleicht noch ne Idee ?
Ok ich habe mich mal hingesetzt und eine Stunde meiner kostbaren Zeit geopfert, und das im Anhang ist was rausgekommen ist. So hätte die ganze Sache von Beginn an angepackt werden können. Ich bekomme auf meinem System error 1011 in ISMM_Open. Die DLL scheint einfach Windows API error Codes zu verwenden, also muss man bei Microsoft in MSDN nachschauen was diese bedeuten. In diesem Fall bedeutet es dass der Konfigurations-Registrykey nicht gefunden werden kann. Eine nicht ganz deutliche Fehlermeldung, aber mehr gibts halt nicht.