verwalteter Code mit variabler Parameterliste
-
Hallo,
ich habe eine C++ Wrapper DLL in .NET 2003 geschrieben, um eine vorhandene C++ DLL in .NET einbindbar zu machen. D.h. die DLL wrapped unverwalteten Code in verwalteten COde. Die Einbindung und Nutzung (unter .NET 2003 und .NET 2005) funktioniert soweit prima, nur das wrappen einer Methode mit variabler Parameterliste will mir nicht gelingen.
Ich definiere sie so:
static void sendf(unsigned int level, String __gc* fmt, ...) { }
Der zugehörigr Compilerfehler lautet:
error C3269: 'TraceNET2003::Trace::sendf' : a member-function of a managed type cannot be declared with '...'
Was mache ich falsch? Besser gesagt, wie definiere ich hier korrekt eine variable Parameterliste?
Danke,
Christel
-
void paramList( ... array <int>^ params) { // Überprüfungen auf: "params == null" und "params.Rank != 1" };
-
Hallo,
Danke für den Tipp.
Leider gibt es die Datentypen mit "^" nur in -NET 2005, nicht in 2003.
Ausserdem würde Dein Code nur erlauben, Parameter eines Typs (im Beispiel int) zu übergeben. Ich brauche gemischt Datentypen, ähnlich to printf ...Trotzdem vielen Dank,
Christel
-
Denn nimm' halt array <Object> ... .
-
Ja, das hatte ich mir in der Zwischenzeit auch schon überlegt, ein Array von Objects zu nehmen.
Bleibt das Problem der Methodendefinition. Wie gesagt, die "^" Notation gibt es in .NET 2003 nicht, ist etwas anders:Ein einzelnes Object als Parameter definiere ich so:
static void sendf(unsigned int level, String __gc* fmt, Object __gc* obj)
EIn Array aus Objects so:
static void sendf(unsigned int level, String __gc* fmt, Object __gc* obj[])
Im letzteren Fall muss ich dann aber aus der aufrufenden Funktion wirklich ein Array übergeben (sonst "error BC30311: Der Wert vom Typ "Integer" kann nicht zu "1-dimensionales Array von Object" konvertiert werden."). Es muss aber eine variable Argumentliste sein.
Welches Schlüsselwort muss ich eintragen, damit es wirklich eine variable Argumentliste wird?
Danke,
Christel
-
// Diese drei Puntkte vor dem Array! void paramList( ... /*<-- diese*/ /*ein beliebeiger typ*/ params[]) { // Überprüfungen auf: "params == null" und "params.Rank != 1" };
Edit: Anmerkung: ich bin mir nicht sicher, ob dies unter VS 2003 laufen wird
.NET 2003 [...] .NET 2005
Edit: 2 meines Wissens ist Mircosoft erst bei .NET 3,5
-
Hallo Rhombicosidodecahedron,
ich meine natürlich .NET 1.1 (Visual Studio 2003) ... aber Du hast mich schon verstandenDie Lösung der Preisfrage ist übrigens:
static void sendf(int level, String __gc* fmt, [ParamArray] Object __gc* objArr[])
Wieder was gelernt!
Gruß,
Christel
-
Ja, vor allem wenn die Antwort in einem nicht C++ Forum kommt *gg*
-
Ja, schade eigentlich
-
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
-
Christian Kraut schrieb:
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
Das wird so nicht funzen. Du musst einen gemeinsamen Nenner finden. Oder was schlaue leute auch abstraktion nennen.
Nachdem dein Problem ja eigentlich ist, ein C++/CLI spezifisches feature auf C++ zu mappen, musst du auf beiden "Hochzeiten" spielen können.
Dazu bietet sich z.b. die STL an.
Überlege dir wie du deine Parameter mittels eine liste oder array an C++ übergeben kannst -> Und bitte vergiss das C elipsis, es ist untypisiert und bringt nur Probleme mit sich.
-