Toon posts:

[C++] SafeArray - troubles

Pagina: 1
Acties:

Verwijderd

Topicstarter
Here we are again ;)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  try
  {
    SAFEARRAYBOUND psa = { beest_array.size(), 0 };

    if (hres = SafeArrayRedim( (*tabel), &psa ) ) throw hres;
    if (hres = SafeArrayLock ( (*tabel) ) ) throw hres;

    for (int i = 0; i < beest_array.size(); i++)
    {
      ((ParseType_t*)(*tabel)->pvData)[i] = parsetype_array[i];
    }
    // hier is beest_array gevulled :)
    if (hres = SafeArrayUnlock ( (*tabel) ) ) throw hres;
  }
  catch (...)
  {
    return 0;
  }


psa = { 38, 0 } (LBound = 0, #elementen = 38)
Maar bij:
C++:
1
    if (hres = SafeArrayRedim( (*tabel), &psa ) ) throw hres;

loopt het al verkeerd.

Ow ja, de functie is gedefineerd als:
C++:
1
2
#define Function    int __declspec(dllexport) CALLBACK
Function VulTabelFromWebPage(const String& WebPage, SAFEARRAY **tabel)


Eventjes zeggen wat ik zie bij de "locals"
code:
1
2
3
4
5
6
7
8
9
10
*tabel = 0x00000000
 +- cDims -> error
 +- fFeatures -> error
 +- cbElements -> error
 +- cLocks -> error
 +- pvData -> error
 ++rgsabound = 0x00000010
  +[0]
   +- cElements -> error
   +- lLbound -> error


Mijn doelstelling:
een persoon geeft in VB een tabel mee:
bvb:
Visual Basic:
1
2
3
4
5
6
Dim Att() as ParseType_t
If VulTabelFromWebPage( tmpWeb, Att) = 0 Then
  Msgbox "Foutje!"
Else
  Msgbox "UBound(Att) = " & UBound(Att)
End If


deze webpagina word onderzocht in C++ en daaruit word die tabel opgevuld. De opgevulde tabel word weer naar VB gestuurd voor daar verder verwerkt te worden.

Opmerkingen:
ParseType_t is in zowel VB zowel C++ exact hetzelfde gedefined (en zelfde # bytes etc etc)
parsetype_array (c++) is een vector<ParseType_t>

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat gaat er nou fout?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Dat vraag ik mij dus ook af :-)
die throwed hres ...

maw ik denk dat die die SafeArrayRedim niet deftig kan uitvoeren. Maar ik vind nergens een deftig voorbeeldje van hoe het nu WEL moet gedaan worden.

Het grote probleem is dat al deze voorbeeldjes een nieuwe array maken, wijl ik aan het werken ben met een reeds bestaande, en dewelke dus niet mag ge'leaked' worden...

Wat zeker zou gebeuren als ik de pointers gewoon verplaats.


BTW .oisyn :) heb jij alles al gelezen? Ik dacht het nog wel zo goed mogelijk uitgelegd te hebben? :)

*edit*
Waar ik denk dat het probleem zit is dat hij probeert:
C++:
1
SafeArrayRedim( NULL, { 38, 0 } );

te doen...

Wat ik zou VERWACHTEN is dat die dan zelf geheugen alloceert en mij in (*tabel) de pointer geeft naar wat geheugen er is gereserveerd.

[ Voor 21% gewijzigd door Verwijderd op 06-03-2003 11:50 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 06 March 2003 @ 11:44:
BTW .oisyn :) heb jij alles al gelezen? Ik dacht het nog wel zo goed mogelijk uitgelegd te hebben? :)


je zei alleen maar waar het fout ging, niet precies wat er nou fout ging
verder ken ik SafeArray () en al die COM dingen niet

.edit: wat is de error die je krijgt?

[ Voor 6% gewijzigd door .oisyn op 06-03-2003 11:49 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik weet niet wat al die array dingen doen, maar... er staat "psa" wat denk ik staat voor "pointer safe arraybound". En dan geef je aan SafeArrayRedim dit als argument mee "&psa", het address van een pointer dus. Dat lijkt me niet de bedoeling. Haal die ampersand eens weg? (verder heb ik geen idee wat die functies doen, maar gewoon beredeneerd uit common-sense)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar: dat is het probleem niet, SafeArrayRedim () wilt 2 parameters (beide pointers), en psa is een SAFEARRAYBOUND structure (geen pointer daarnaartoe)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Zoijar:
als ik die psa wegneem:
\webpageparse.cpp(185) : error C2664: 'SafeArrayRedim' : cannot convert parameter 2 from 'struct tagSAFEARRAYBOUND' to 'struct tagSAFEARRAYBOUND *'

Dus het is effectief wel een & die ik moet meegeven. Waarschijnlijk mijn fout van verkeerde naamgeving, sorry.



.oisyn:
geen, ik zit in een try catch hé.
Maar als ik die hres bekijk die ik doorkrijg. De waarde = -2147024809 [hexa= 80070057]

Mmmm, eens even zien op MSDN wat dat betekend.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

je moet natuurlijk wel een geldige SAFEARRAY meegeven, en niet NULL
Maak er eens een aan met SafeArrayCreate () (zoals ik al zei, ik heb er geen verstand van, dit heb ik snel even uit de MSDN gevist :))

.edit: en ik had het uiteraard over de waarde van hres idd, maar aangezien table NULL is zal deze wel E_INVALIDARG zijn

[ Voor 25% gewijzigd door .oisyn op 06-03-2003 11:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ja, maar dat is nu net exact het probleem. Dat gaat werken...
Maar dan heb ik 1/ de meegegeven tabel (als die al opgevuld is, is die != NULL). 2/ mijn juist nieuw gemaakte tabel (SACreate).

Dan op het einde van de functie stel ik 2 = 1 om die aan VB terug te geven (pointer van 1 is bye bye & geheugen is niet vrijgegeven right?)...

*edit*
E_INVALIDARG 80070057 One or more arguments are not valid error.
Jups, je had gelijk dus...

[ Voor 14% gewijzigd door Verwijderd op 06-03-2003 11:56 . Reden: E_INVALIDARG ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op 06 March 2003 @ 11:53:
Zoijar:
als ik die psa wegneem:
\Dus het is effectief wel een & die ik moet meegeven. Waarschijnlijk mijn fout van verkeerde naamgeving, sorry.
Ja je hebt gelijk die was wel goed, alleen de naam van het beestje was fout dan ;) Ik heb geen idee dan...misschien iets met van 0-9 lopen en dan size 10 retourneren, terwijl dat anere een upperbound wilt van maximaal 9? Anders weet ik het niet.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 06 maart 2003 @ 11:55:
Ja, maar dat is nu net exact het probleem. Dat gaat werken...
Maar dan heb ik 1/ de meegegeven tabel (als die al opgevuld is, is die != NULL). 2/ mijn juist nieuw gemaakte tabel (SACreate).

Dan op het einde van de functie stel ik 2 = 1 om die aan VB terug te geven (pointer van 1 is bye bye & geheugen is niet vrijgegeven right?)...


ik snap je niet helemaal, wat wil je nu precies doen?
.edit: oh ok, ik heb even naar die VB code gekeken, en ik denk dat ik het nu wel weet.

Je moet even checken of *tabel NULL is. Zo ja: nieuwe aanmaken met SACreate, zo nee: redimmen met SARedim

[ Voor 17% gewijzigd door .oisyn op 06-03-2003 12:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb in VB:
Dim Parse() as ParseType_t

En ik heb in C++:
Function VulTabelFromWebPage(const String& WebPage, SAFEARRAY **tabel)

Die Parse() word ByRef meegegeven (dus ik moet die kunnen wijzigen, right?)

Maar ik wil deze functie ofc ook kunnen gebruiken als bvb VulTabelFromWebPage(..) al doorlopen is geweest ( en Parse() dus al is opgevuld geweest ).

Wat ik dus wil bereiken is:
1/ ik geef webpage naar C++
2/ ik geef array naar C++
3/ ik verwacht opvulling van array in C++ (done)
4/ ik verwacht dat als ik na deze functieoproep (in VB dus trug) dat Parse() opgevuld is.


*edit*
Ik had er ook juist aan gedacht... Ga straks eens proberen met die functie 2x te doorlopen, zien wat ik er de 2e keer inkrijg.

[ Voor 23% gewijzigd door Verwijderd op 06-03-2003 12:45 . Reden: antwoord @ .oisyn ]


Verwijderd

Topicstarter
ok, nu iets simpeler geprobeerd:
C++:
1
2
3
4
5
6
short __declspec(dllexport) CALLBACK ArrayExample(LPSAFEARRAY FAR *ArrayData)
{
    short *temp;
    temp = (short*)(*ArrayData)->pvData;
    return(temp[0]);
}


Visual Basic:
1
2
3
4
5
6
Private Declare Function ArrayExample Lib "Parse.dll" (ByRef Tabel() As Integer) As Integer
Dim att2(0 To 1) As Integer
att2(0) = 123
att2(1) = 165
  
  MsgBox ArrayExample(att2())


Die geeft dus effectief een msgbox met '123' erin...
En ik krijg effectief ook een pointer != NULL door in C++ (hetwelk niet zo is).

Wat ik juist ook geprobeerd heb:
C++:
1
2
3
4
5
6
7
8
    if ( (*tabel) != NULL )
    {
      if (hres = SafeArrayRedim( (*tabel), &saBounds ) ) throw hres;
    }
    else
    {
      (*tabel) = SafeArrayCreate( VT_UNKNOWN, saBounds.cElements, &saBounds );
    }


maar op zowel de enen weg, als op den andere geeft die *tabel == NULL
Kzal dan eens verder zien hoe dat zit. Want ik vind het raar dat met die "short"-tabel (short = Integer in VB) wel werkt, maar met mijn "ParseType_t"-tabel niet...

[ Voor 12% gewijzigd door Verwijderd op 06-03-2003 12:58 . Reden: declaratie van VB erbij gezet ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 06 March 2003 @ 12:57:
Die geeft dus effectief een msgbox met '123' erin...
En ik krijg effectief ook een pointer != NULL door in C++ (hetwelk niet zo is).


logisch toch? De array heeft nu 2 elementen. In je openingspost was het slechts een definitie van een array, maar die had nog geen elementen (en was derhalve dus ook null (Nothing in VB))
maar op zowel de enen weg, als op den andere geeft die *tabel == NULL
Kzal dan eens verder zien hoe dat zit. Want ik vind het raar dat met die "short"-tabel (short = Integer in VB) wel werkt, maar met mijn "ParseType_t"-tabel niet...
wat bedoel je met "de enen weg" en "den andere weg"? Probeer het eens aan te roepen met een array die je al geredim'd heb in vb?

edit:
Gliempo de sukkel :P

[ Voor 89% gewijzigd door .oisyn op 06-03-2003 14:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ene weg = short-route
andere weg = ParseType_t-route

*edit*
(*tabel) -> 0x0013aac0

nu heb ik in VB: >> Redim ParseTab(0 to 38) << gedaan

Dus als ik nog helder kan nadenken wat ik nu moet doen is:
1. Zien of die NULL is (Nothing in VB) -> SACreate
2. Niet NULL? -> SARedim
3. Opvullen
4. Gelijkstellen aan binnenkomende pointer.

Dan kom ik aan het volgende probleem... SACreate. Maar daar ga ik eerst voor rondneuzen op google voor ik kom vragen stellen :)

[ Voor 67% gewijzigd door Verwijderd op 06-03-2003 13:14 ]


Verwijderd

Topicstarter
Hmmm, vrij veel informatie gevonden en ik heb nu begrepen dat ik SafeArrayEx(VT_RECORD, 1, (*tabel), ....) moet gebruiken.

Nu ben ik aan het zoeken hoe ik die .... moet gebruiken. Of is er iemand die mij wat uitleg kan verschaffen hoe ik dit hier moet doen in Visual C++?

Om die laatste vraag te verduidelijken: welke stappen moet ik volgen in VC++ om zo een eigen struct- UDT op te bouwen? En dit te integreren met mijn project (en desnoods ook met VB als dat nodig moest zijn).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 06 March 2003 @ 13:08:
[edit]<a href="javascript:toggle ()">Gliempo de sukkel</a> :P
<script language="javascript"> function toggle (){var s = document.getElementById ('hiddentext').style;if (s.display == "inline")s.display = "none"; else s.display = "inline"; }</script><span id="hiddentext" style="display:none">oysin kan niet quoten :+
gliempo je bent een aars :P
Waarom quote je dan ook die code? Da's overbodig man!
Okee joh jij je zin
Goeso, altijd luisteren naar de full-mod he ;)
fullmods zuigen! litemods rule! Front Anti Fullmods!!! :P
<H3> Dat anti-authoritaire gedrag van jou oysin, mag helemaal niet van de baas! </H3>
<h2>STFU, LuSER!</h2>
<h1>GAAN WE HAPPEN NAAR DE BAAS???</h1>
Okee.... iemand verveelde zich erger dan ik :)

Professionele website nodig?

Pagina: 1