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

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.

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...