Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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;

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

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;

}

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.

Hmm ok du hast deine Function aber als Long definiert, wie mach ich das nun bei meiner function die als Variant definiert ist ?

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?

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?

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?

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 Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.