Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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;

Geschrieben
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 );

Geschrieben

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;

}

Geschrieben

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.

Geschrieben

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?

Geschrieben
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?
Geschrieben

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?

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...