DLL-Aufruf [Erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

DLL-Aufruf [Erledigt]

Beitrag von Jan »

Ich habe gerade eine Schnittstellen-DLL bekommen. In der Doku wird mir als Aufruf folgender Beispielcode mitgegeben:

Code: Alles auswählen

Dim mOPL As New OPListelesen

Private Sub Beispiel
Dim strListe as string
   		strListe = mOPL.Mainfunction KtoNrlng, blnErledigt, strMandant
    		End Sub
Dummerweise funktioniert das nicht. Ich rufe das so auf:

Code: Alles auswählen

dummy := DllCall("OPListeERPInterface", DLL_STDCALL, "OPListelesen", 1154271, "01 KG", .T.) 
Das gibt einen Laufzeitfehler "Unbekannte Funktion". Nach einem Rückruf bei dem Entwickler sagte der mir, jaaa, das ist VB 6.0. Und die eigentliche Funktion sei "Mainfunction". Die müsse ich aufrufen. Aber da gibt es genau den gleichen Fehler.

Für die VB-Kenner hier: Wie muß ich das aufrufen, damit das unter Xbase ++ klappt?

Wobei ich mir garnicht so sicher bin, ob das so korrekt ist. Denn wenn ich mir die Doku zu DllCall ansehe, dann bekomme ich nur eine numerische Rückgabe, wenn ich keine Xbase++-Dll aufrufe. Die Dll will mir aber einen String zurückgeben, denn ich auch brauche. Wie wäre da die korrekte Vorgehensweise? Oder mißinterpretiere ich da die Doku?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: DLL-Aufruf

Beitrag von Rolf »

Hallo Jan,
Prüfe mal mit Dependency Walker wie die Funktionen heißen, es kommt auch vor das die Funktion ein @9 Suffix hat.
Das Beispiel sieht aber eher aus, als ob eine Objekt.Funktion aufgerufen wird.
.T. würde ich als 1 übergeben.

Liebe Grüße
Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von Jan »

Hallo Rolf,

mit dem Dependency Walker war ich da schon rüber gegangen. Und habe mit dem Ergebnis erstmal den Programmierer irritiert - beide Funktionen stehen da nämlich nicht drin.

Was ist denn eine Objekt.Funktion? Er hat mir irgendwas davon erzählt, das die Funktion in einem Modul untergebracht wäre. Ist das das Gleiche? Wen ja - wie komme ich dann da ran?

Nochmal zum Dependency Walker: Der gibt mir in der Modulliste eine Reihe von Dll aus mit der roten Warnmeldung "Error opening file. Das System kann die angegebene Datei nicht finden (2)." Könnte das ebenfalls zu einem Problem führen?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: DLL-Aufruf

Beitrag von Rolf »

Hallo Jan

Modul heißt ja eigentlich nichts anderes als, dass die DLL eine weiter DLL benötigt.
Mit Objekt.Funktion meine ich, das keine Funktion in der DLL steckt sondern eine Klasse.

Liebe Grüße
Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von Jan »

Hallo Rolf,

gerade kam die Antwort vom Entwickler rein:
Soweit ich es verstehe liegt der Fehler daran, dass „OPListelesen“ bzw. „Mainfunction“ direkt als Funktion angesprochen werden. Der Fall ist aber, dass „OPListelesen“ ein Klassenmodul der „OPListeERPInterface“ ist in welchem die „Mainfunction“ vorhanden ist. Von daher müsste zunächst die „OPListelesen“ als Klasse (bzw. XBase++ Äquivalent) angesprochen werden bevor die „Mainfunction“ erkannt/benutzt werden kann.
Grmpf. Toll. Und wie komme ich da jetzt weiter?

DllCall ist schon eine Black Box für mich. Aber jetzt kommt der auch noch mit Klassenmodul an. HILFE!

Und dazu kommt noch das Problem, wie ich denn an die Rückgabewerte der aufgerufenen Funktion rankomme. Wie oben schon beschrieben gibt die mir einen String zurück. DllCall will mir aber anscheinend nur eine nVal zurückgeben. Das bringt mir dann ja auch nichts.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von Tom »

Bei allen Aufruftypen abseits der Xbase-Konventionen ist der Rückgabewert von DllCall() immer numerisch. In der Regel sagt er nur etwas darüber aus, ob die Funktion erfolgreich aufgerufen werden konnte. Rückgabeparameter werden in solchen Situationen per Referenz in der Parameterliste übermittelt.

Außerdem vermisse ich da den DllPrepareCall().
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von Jan »

Hallo Tom,

ich weiß, es gibt keine dummen Fragen. Trotzdem, hier sind gleich zwei:

1) OK, wenn das über die Parameterliste geht, dann wäre ja zumindest der Schritt schon einmal gelöst. Aber wie gebe ich das an? Als letzten Parameter? Woher weiß die Dll, was die damit machen soll? Oder regelt das DllCall für mich?

2) Warum DllPrepareCall()? Was macht das anders als DllCall()? Die Doku erzählt mir irgendwas von einem Template, das da erstellt wird. Wie das passiert, und wozu das gut ist, erschließt sich mir aber nicht. Und die Onlinedoku sagt auch, das DllCall() das Gleiche macht wie DllPrepareCall() + DllExecuteCall(). Warum also DllPrepareCall benutzen?

Und es bleibt ja noch die Frage offen, wie ich per Dllcall() (oder was auch immer) eine Funktion in einem Klassenmodul in einer Dll aufrufe. Sowas hab ich noch nie gehört. Und da ich ohnehin sowohl ein Dll-Dummy bin als auch ein Klassen-Dummy, steh ich hier wie Ochs vorm Berge.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von brandelh »

Wenn ich Objekt und Klasse lese, denke ich an ActiveX und nicht an DLLCALL ...
Gruß
Hubert
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: DLL-Aufruf

Beitrag von Rolf »

Hallo Jan

DLLCall() kann dir zum Beispiel eine Pointer auf einen String zurück geben, währe dann quasi auch ein Integer,
den man dann wieder in einen vernünftigen XBase-String umwandeln kann. Suche nach "lstrcpy" in der Alaska-Newsgroup.
Hilft aber denke ich nicht bei Klassen.

Laut XBase-Doku: "DllPrepareCall() / DllExecuteCall() ist immer dann empfehlenswert,
wenn eine DLL-Funktion mehrmals hintereinander ausgeführt werden soll". Das ist der Hauptunterschied.

Ich würde mir eine C++-DLL schreiben die XBase-konform ist und über eine Funktion mir alles nötige zurückgibt.
Diese würde das mit der Klasse dann übernehmen.
Ist auch einfacher als es sich anhört, wenn dein VB-Beispiel auch für C++ existiert.

Oder Pablo fragen.

Liebe Grüße
Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DLL-Aufruf

Beitrag von Jan »

Der Hinweis von Hubert hat mich da weiter gebracht. Das war zwar nie so abgesprochen, und unter VB6 muß man das wohl auch nicht machen - aber ich habe die Dll jetzt mal per regsvr32 registriert und dann über CreateObject() angesprochen. Und siehe da - das funktioniert!

Damit wäre also dieses Problem auf etwas überraschende Weise gelöst. Vielen Dank für Eure Ideen, Anregungen, und Gedanken dazu.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: DLL-Aufruf [Erledigt]

Beitrag von UliTs »

Jan,

Kannst Du Deine Lösung zeigen?

Danke.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten