eXoCooLd Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 Weis jemand welcher Typ in C++ (kann auch ein Typ aus dem MFC sein) dem Variant aus VB6 entspricht. Ich schreibe grade an ner DLL in VC++, die von VB6 dann benutzt wird und muss da einen Variant zurück liefern. VARIANT und _variant_t scheinen Falsch zu sein weil in VB nur Müll ankommt wenn ich die Benutze. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 VARIANT ist eigentlich genau richtig. Um was für einen Wert handelt es sich denn, und wie schreibst du ihn in den VARIANT rein? Das ist nämlich nicht ganz trivial. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 21. Mai 2003 Autor Teilen Geschrieben 21. Mai 2003 Das ist unterschiedlich ich bekomme in der Function sachen aus nem ADO Objekt zurück also einmal ist es halt ein Array, das nächste mal vieleicht nur ein Int oder ein String zuweisen tue ich es so: varOutPut = adoField->Value; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 Original geschrieben von CyberKiller varOutPut = adoField->Value; Damit ist nicht viel anzufangen. Was ist varOutPut (Typ), und woher kommt er (lokale Variable, Wertparameter, Referenzparameter,...)? Allgemeine funktioniert so eine Zuweisung nur, wenn varOutPut vom Typ _variant_t ist. Wenn Du mit "rohen" VARIANTs umgehst, musst du die zugehörigen Funktionen (VariantInit, VariantCopy, VariantClear usw.) verwenden: VariantCopy( &varOutput, &adoField->Value ); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 21. Mai 2003 Autor Teilen Geschrieben 21. Mai 2003 Ok ma die ganze Function posten: VARIANT _stdcall test(long intest) { ADODB::_ConnectionPtr Con = NULL; ADODB::_RecordsetPtr RecSet = NULL; ADODB::FieldPtr Field; VARIANT *RecordsAffected = NULL; _variant_t varOutPut; if (Con.CreateInstance(__uuidof(ADODB::Connection), NULL) != 0) { varOutPut = "ADODB Error"; return varOutPut; } try { Con->Open("DSN=ODBCLink; UID=username; Password=pass", "", "", 0); } catch (int Exception) { varOutPut = "ADODB Connection Error"; return varOutPut; } // nur BSP Query... RecSet = Con->Execute("SELECT Count(merge) AS Anzahl FROM OSTD.mlp_header", RecordsAffected, 1); Field = RecSet->Fields->GetItem("Anzahl"); varOutPut = Field->Value; RecSet->Close(); Con->Close(); return varOutPut; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 Ich glaube, dass VARIANT als Rückgabetyp nicht funktioniert. Mit einem VARIANT-Referenzparameter funktioniert es: Private Declare Function VarTest Lib "test_dll.dll" _ (ByRef v As Variant) As Long -------------------------------------------------- signed long _stdcall VarTest( VARIANT* pv ) { _variant_t v( "Huhu" ); VariantCopy( pv, &v ); return 0; }[/CODE] Es liegt vermutlich daran, dass VARIANT keinen funktionsfähigen Copykonstruktor besitzt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 21. Mai 2003 Autor Teilen Geschrieben 21. Mai 2003 Hmm ok du hast deine Function aber als Long definiert, wie mach ich das nun bei meiner function die als Variant definiert ist ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 21. Mai 2003 Autor Teilen Geschrieben 21. Mai 2003 Also _variant_t entspricht doch dem VB6 Variant, Texte und so übertragen geht. Aber ich habe Probleme damit dem _variant_t die sachen vom ADODB::FieldPtr Field zu übergeben :-( Weis da einer ne lösung für? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Mai 2003 Teilen Geschrieben 21. Mai 2003 Original geschrieben von CyberKiller Hmm ok du hast deine Function aber als Long definiert, wie mach ich das nun bei meiner function die als Variant definiert ist ? Du sollst sie eben nicht als VARIANT definieren. Das ist ja der Trick bei der Sache. Der VARIANT wird nicht über den Rückgabewert, sondern über einen Referenzparameter an VB zurückgegeben. Um das zu demonstrieren, habe ich das Beispiel doch geschrieben. Aber ich habe Probleme damit dem _variant_t die sachen vom ADODB::FieldPtr Field zu übergeben :-(_variant_t ist eine Wrapperklasse für VARIANT, damit kann VB nichts anfangen. Aber was meinst du jetzt mit "Probleme"? Bekommst du eine Fehlermeldung? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 22. Mai 2003 Autor Teilen Geschrieben 22. Mai 2003 ne aber in der Variable sind am Ende nur schrott Daten, obwohl die DB sinvolle Daten zurück gibt. Also wird es wohl ein Problem mit mit der convertierung sein, nur wie bekomme ich nun meine Daten in die Variable? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Mai 2003 Teilen Geschrieben 22. Mai 2003 Hast du das mit dem Referenzparameter mal ausprobiert? Bei mir hat das mit Zahlen und Strings funktioniert. Und dein SQL-Statement sollte ja eigentlich für das Feld "Anzahl" eine Zahl liefern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
eXoCooLd Geschrieben 22. Mai 2003 Autor Teilen Geschrieben 22. Mai 2003 ich habe der variable mal einen festen text zugewissen, des geht wunderbar. mit zahlen geht es auch nur mit der übergabe von diesem ADODB Feld geht es leider nicht. Aber ich habe jetzt die lösung, es lag wirklich am ADODB Feld. Wenn man die Daten vom ADODB Feld an eine _variant_t Variable übergeben will mus man einfach nur GetValue() benutzen anstelle von nur Value varOutPut = Field->GetValue(); Ma sehen ob ich damit auch arrays ubergeben kann :-) Also dann Danke für deine Hilfe Klotzkopp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.