Variable Parameterliste weitergeben



  • Hallo Leute, ich habe folgendes Problem:

    Untenstehende Funktion wird aus der .NET Umgebung (C#) aufgerufen. Der Parameter 'testArr' enthält auch die von mir übergebenen variablen Parameter (in unserem Fall z.B. einen string = "Test" und einen int = 3). Jetzt schaut es so aus, dass ich dieses erhaltene Array vom Typ Object an die Funktion TestMessageBox weitergeben muss.

    int S200Win32::Win32Ressources::NetTestMessageBox(int testType, int testIDTitle, int testIDText, ... array<System::Object^>^ testArr)
    {
    	int i = TestMessageBox(iType, iIDTitle, iIDText, testArr);
    	return i;
    }
    

    TestMessageBox ist folgendermassen deklariert:

    __declspec(dllimport) int TestMessageBox(int testType, int testIDTitle, int testIDText, ...);
    

    Wie ihr sehen könnt kann die Funktion 'TestMessageBox' ebenfalls mit einer variablen Parameterliste aufgerufen werden.

    Die Funktion 'TestMessageBox' soll einfach die übergebenen Parameter anzeigen (sprich den string = "Test" und den int = 3). Das funktioniert allerdings so nicht. Meine Frage daher lautet:
    Weiss jemand von Euch wie man variable Parameterlisten an Funktionen, welche variable Parameter empfangen können, weitergeben kann?

    Mfg Kr@uti



  • Wenn es sich dabei um eine Ellipse aus C handelt, hast Du vermutlich keine Chance.



  • Es handelt sich dabei um keine Ellipse aus C, die Funktion TestMessageBox ist eine komplett eigens entwickelte Funktion

    Mfg Kr@uti



  • Christian Kraut schrieb:

    Es handelt sich dabei um keine Ellipse aus C, die Funktion TestMessageBox ist eine komplett eigens entwickelte Funktion

    Was hat das eine mit dem anderen zu tun? 😉

    Ich denke, dass die TextMessageBox-Funktion eine reine C-Funktion ist, jedenfalls lässt das dllimport-Attribut darauf schließen. Desweiteren fehlt für das .NET ParameterArray eben jenes Array hinter "...". Ich konnte jedenfalls kein anderes Sprachmittel der CLI-Erweiterung finden, welches mit "..." angesprochen wird. Damit wäre das "..." eine variable Parameterliste aus der Sprache C geerbt (auch genannt: Ellipse) und vermutlich nicht mit der erweiterten Ellipse (Parameterarray) von C++/CLI in Einklang zu bringen.

    Aber wenn in der Liste ein System::String^ enthalten ist, wird die C-Funktion da vermutlich ohnehin nicht viel mit anfangen können.



  • Stimmt, das habe ich falsch verstanden. Es ist eine C-Funktion ;). Und es gibt keine Möglichkeit z.B. mittels den Makros 'va_list, va_start usw.' das aus der C#-Welt erhaltene 'Object-Array' an die C-Funktion weiterzugeben???

    Ich glaube nämlich das ich nur so eine Liste nachbauen müsste welche die verschiedenen Objekte beinhaltet. Weil wenn ich so eine Liste dann habe dann kann ich die ja auch übergeben.

    Weil die Funktion 'NetTestMessageBox' verarbeitet dann diese variablen Parameter mittels 'va_list' und 'va_start' usw. so wie man es gewohnt ist. Was haltet Ihr davon?

    Mfg Kr@uti



  • Wenn du die Zielfunktion selber entwickelt hast, könntest du den Lösungsansatz von printf()/vprintf() nachbauen - schreib dir eine zweite Funktion, die anstelle der variablen Argumente ein va_list übernimmt (und wenn du Code-Duplikationen vermeiden willst, übernimmt letztere die Arbeit und die va-Funktion legt nur die va_list an).



  • Das Problem ist zum einen die technische Sicht: Ein ParameterArray ist ein Objekt auf dem Aufrufstack, nämlich das Array.

    Eine Ellipse hat für jeden Parameter ein Objekt auf dem Aufrufstack, ist also kein wirkliches Array. In C ist auch nicht bekannt, wo diese Liste aufhört.

    Dazu kommt die Tatsache, dass die C-Funktion nicht mit managed Referenzen klarkommen wird.

    Insgesamt fällt mir kein Weg ein, wie man diese Klippe umschiffen könnte. Aber davon ganz abgesehen, würde ich in C++, und besonders in C++/CLI, Funktionen mit Ellipsen ganz meiden (auch printf).



  • Tja dann muss ich wohl die unschöne Lösung in Angriff nehmen. Dadurch das diese 'TestMessageBox' exportiert ist kann ich mittels P/Invoke in C# die Funktion aufrufen. Dazu müsste ich nur eine als 'static' deklarierte Funktion mit der richtigen Signatur (richtiges Data-Marshalling der Parameter) nachbauen.
    Genau das wollte ich allerdings umgehen, weil diese .h Datei hat über 300 deklarierte Funktionen. Und jede einzelne Funktion als static deklarieren und nach zu bauen rentiert sich irgendwie nicht so richtig. Schade. Danke jedenfalls für Eure Hilfe.

    Mfg Kr@uti


Anmelden zum Antworten