C++-DLL mit überschreibbaren Funktionen

Hallo,

ich möchte eine C+±DLL schreiben, deren Funktionen ich auch nach VB.Net exportieren kann. An einem trivialen Beispiel (Taschenrechner) habe ich diese Funktion schon erwirken können.

Darüber hinaus aber würde ich auch gerne diese zu exportierenden Funktionen erst später in dem importierenden Quellcode mit Leben füllen, das heißt sie sollen in der C+±DLL lediglich deklariert werden, ihr Inhalt aber erst im importierenden VB.Net-Code implementiert werden (Bei Java und Objektorientierung wäre der Begriff hier wohl „abstrakte Methoden“).

Hintergrund: Die DLL soll verschiedene Eventlistener implementieren, die bei Eintritt eines Events die entsprechenden Funktionen aufrufen. Diese können aber die Buttons und Felder in einer Maske betreffen und sollen daher erst im VB.Net-Code implementiert werden.

Gibt es eine Möglichkeit, dieses zu erreichen und wenn ja, wie sähe die aus?

Ich freue mich über eure Antworten und möchte mich im Vorfeld schon mal bedanken.

Mit freundlichen Grüßen,
fuenf_punkt_eins

Howdy,

Gibt es eine Möglichkeit, dieses zu erreichen und wenn ja, wie
sähe die aus?

mal abgesehen davon, dass das eine .net bzw. Windoofs Frage ist, die hier nicht hergehoert: Wieso wird die DLL nicht komplett in VB.net implementiert?

Gruss
E.

Hallo,

Gibt es eine Möglichkeit, dieses zu erreichen und wenn ja, wie
sähe die aus?

mal abgesehen davon, dass das eine .net bzw. Windoofs Frage
ist, die hier nicht hergehoert

Es ist in erster Linie eine C+±Frage, da ich ja wissen möchte, wie ich diese Funktionen in C++ implementiere. Was ich später mit der DLL wirklich anstelle, ist ja dann noch eine andere Geschichte. Auf jeden Fall möchte ich halt auf diese Schnittstellen wie beschrieben zugreifen.

Wäre es also möglich und wenn ja, wie?

Wieso wird die DLL nichtkomplett in VB.net implementiert?

Weil darum: http://support.microsoft.com/kb/841712
Was ich eigentlich möchte, ist, von .Net auf TAPI zugreifen. Da sich in der bisherigen Implementation aber einige eklatante Fehler befinden, deren Ursache mir auch nach längerer Recherche weiterhin unbekannt ist, habe ich es einfach darauf geschoben, dass VB.Net „managed code“ ist (siehe Link oben). Daher müsste ich TAPI in einem unmanaged C+±Code aufrufen, der dann quasi von meiner .Net-Datei ferngesteuert wird, bzw. von dem Informationen über Ereignisse in mein Programm gelangen können.

Und da ich in punkto C++ gerade Neuland betrete, wäre ich über eine entsprechende Hilfe sehr erfreut.

Grüße,
fuenf_punkt_eins

Hi,

Es ist in erster Linie eine C+±Frage, da ich ja wissen
möchte, wie ich diese Funktionen in C++ implementiere.

Nochmals: Standard C bzw. Standard C++ -und um die geht es hier im Brett- kennen keine managed Sachen (Nur „Schlauberger“ in Redmond haben sowas in ihre Compiler eingebaut). Wenn du diesbezuegliche Fragen hast, so steht es auch in der Brettbeschreibung, so solltest du dich in das richtige Brett begeben. Hier wird wahrscheinlich keine Antwort kommen.

Wäre es also möglich und wenn ja, wie?

aus dem Bauch heraus sage ich mal: Ja, das ist moeglich, man muss sich nur genau anschauen, wie triviale und wie nicht-triviale Parameter übergeben bzw. weitergereicht werden.

Da sich in der bisherigen Implementation aber einige eklatante
Fehler befinden, deren Ursache mir auch nach längerer
Recherche weiterhin unbekannt ist, habe ich es einfach darauf

Bereite mal ein Beispiel vor, welches zeigt, was wo nicht funktioniert und dann stelle das Ganze in das richtige Brett (Zur Not auch hier, aber Antwortwahrscheinlichkeit… ungewiss). Mit 99.9% Wahrscheinlichkeit ist das kein eigentliches C/C++ Problem.

Gruss
E.

Guten Tag,

Hi,

Es ist in erster Linie eine C+±Frage, da ich ja wissen
möchte, wie ich diese Funktionen in C++ implementiere.

Nochmals: Standard C bzw. Standard C++ -und um die geht es
hier im Brett- kennen keine managed Sachen (Nur „Schlauberger“
in Redmond haben sowas in ihre Compiler eingebaut). Wenn du
diesbezuegliche Fragen hast, so steht es auch in der
Brettbeschreibung, so solltest du dich in das richtige Brett
begeben. Hier wird wahrscheinlich keine Antwort kommen.

Im Grunde hat der Kern meiner Frage nichts speziell mit managed Code zu tun. Ich könnte sie auch so formulieren, dass ich die DLL-Funktionen in einem anderen C++ wie beschrieben aufrufen möchte. Es geht mir im Kern ja nur um die C+±Datei, der spätere Aufruf wird ein anderes Problem sein.

Wäre es also möglich und wenn ja, wie?

aus dem Bauch heraus sage ich mal: Ja, das ist moeglich, man
muss sich nur genau anschauen, wie triviale und wie
nicht-triviale Parameter übergeben bzw. weitergereicht werden.

Und wie wäre es möglich? Müsste ich die Funktionen dann als kennzeichnen? Gibt es da eine bestimmte Technik oder hast du Links?

Da sich in der bisherigen Implementation aber einige eklatante
Fehler befinden, deren Ursache mir auch nach längerer
Recherche weiterhin unbekannt ist, habe ich es einfach darauf

Bereite mal ein Beispiel vor, welches zeigt, was wo nicht
funktioniert und dann stelle das Ganze in das richtige Brett
(Zur Not auch hier, aber Antwortwahrscheinlichkeit…
ungewiss). Mit 99.9% Wahrscheinlichkeit ist das kein
eigentliches C/C++ Problem.

Das ist wahrscheinlich ein 100%iges .net-Problem, das ich bereits in der TAPI-Newsgroup gepostet habe - leider bisher ohne eine Antwort erhalten zu haben. Wie gesagt, ich behaupte in Bezug auf den o. g. KB-Eintrag, dass es nicht ganz fehlerlos möglich ist. Daher habe ich mich auch für die Erstellung einer C+±DLL (die ja _unmanaged_ ist) entschieden, da dies auch der von Microsoft empfohlene Weg ist.

Hi,

Und wie wäre es möglich? Müsste ich die Funktionen dann als
kennzeichnen? Gibt es da eine bestimmte Technik
oder hast du Links?

Fange mit einer einfachen, parameterlosen Funktion an, die korrekt von der DLL exportiert wird (__declspec). Diese Methode sollte nur eine Logausgabe generieren, die man ueberpruefen kann. Dann sollte diese Funktion in VB.net importiert und aufgerufen werden.

Funktioniert dieses, so ist das Laden und exportieren bzw. spaeteres Importieren korrekt.

Zweiter Schritt: Dto mit simplen Typen, z.B. Parameter

int f(int,int)

mit Ausgabe der Werte

Funktioniert dieses mit korrekten Ausgaben, so ist auch die Stackorder korrekt.

Dritter Schritt: Komplexe, nicht triviale Typen.

Hierzu muss man sich per Tante Guugle die Informationen aus dem Netz holen, wie diese Parameter de-facto uebergeben werden (Sie sollten im MSDN verfuegbar sein). Das Suchen nach frei verfuegbaren (also nicht kostenpflichtigen) Informationen kann dabei etwas laenger dauern.

Gruss
E.

Hallo,

Schritt 1 und 2 habe ich bereits erfolgreich ausgeführt. Dann werde ich mich nochmal auf die Suche nach dem Stichwort ‚triviale Parameter‘ begeben. Ich bedanke mich!

Gruß fuenf_punkt_eins