Toon posts:

[C++ / VB6] Waarde van VT_BYREF

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

ik heb een class (ATL), met enkele functies. Deze is geschreven in C++. De functie waar het om gaat heeft alleen optionele parameters, daarom zijn deze dus van het type VARIANT.
In de eerste parameter verwacht ik een string indien deze meegegeven is. Om de applicatie te testen heb ik 2 testapplicaties, een hta (vbscript) en een executable (vb6).
In de hta roep ik mijn functie als volgt aan (na het creeeren van het object e.d.)
VBScript:
1
sUrl = oApp.getUrl( txtCustomer.value )


Dit gaat zonder problemen. Maar mijn VB6 testapp heeft wat meer problemen.

Visual Basic 6:
1
strUrl = oApp.getUrl(strCustomer)


Het probleem is als volgt, ik heb in mijn getUrl functie een stuk geschreven om een VARIANT om te zetten naar een BSTR. Daarbij kijk ik naar het varianttype (variant.vt). Op het moment dat ik de functie aanroep vanuit VB6 is het variant type: 16392
Echter, als ik in de header file kijk (WTypes.h) is er geen variant type met de waarde 16392, het enige dat in de buurt komt is een VT_BYREF, deze is namelijk precies 16384, een verschil van 8.... nu kan ik ook wel gaan checken op de types + 8, maar dat is vies om te doen, en ik wil graag een verklaring voor het verschil, iemand enig idee?

De functie die een VARIANT omzet naar een BSTR:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BSTR CApplication::pGetBstrFromVariant( VARIANT vtValue )
{
    BSTR    pBstr = 0;
    VARIANT vtTemp;

    VariantInit( &vtTemp );

    switch ( vtValue.vt ) // bij aanroep vanuit VB6 is dit dus vreemd genoeg 16392
    {
    case VT_BSTR:
        pBstr = vtValue.bstrVal;
        break;
    case VT_VARIANT | VT_BYREF:
        VariantCopy( &vtTemp, vtValue.pvarVal );
        pBstr = vtTemp.bstrVal;
        break;
    }

    return pBstr;
}

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Het verschil is simpel: VT_BYREF is een modifier. Je kunt een int32 byref meegeven, maar ook een int16 of een BSTR. Je moet dus niet kijken naar +8 maar naar +16384.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op donderdag 22 maart 2007 @ 10:39:
Het verschil is simpel: VT_BYREF is een modifier. Je kunt een int32 byref meegeven, maar ook een int16 of een BSTR. Je moet dus niet kijken naar +8 maar naar +16384.
Ja daar komen wij dus nu ook net achter, maar hoe kan ik de variant nu converteren naar een BSTR?
Het probleem is nu dus dat ik elke keer een access violation krijg

[ Voor 8% gewijzigd door Verwijderd op 22-03-2007 11:23 ]


Verwijderd

Topicstarter
Volgens msdn:
A reference to a string was passed. A BSTR* that points to a BSTR is in pbstrVal. The referenced pointer must be obtained or freed by the BSTR functions.
Eeuh, en hoe doen we dat?
C++:
1
pBstr = SysAllocString(*(vtValue.pbstrVal));


Probleem opgelost :-)

[ Voor 18% gewijzigd door Verwijderd op 22-03-2007 11:48 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Verwijderd schreef op donderdag 22 maart 2007 @ 11:18:
[...]

Ja daar komen wij dus nu ook net achter, maar hoe kan ik de variant nu converteren naar een BSTR?
Het probleem is nu dus dat ik elke keer een access violation krijg
Kijk eens naar de _variant_t en _bstr_t classes in comutil.h, daarin wordt volgens mij hetzelfde gedaan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.