Toon posts:

[C++] Arrys van UDTs tussen VB & C++ uitwisselen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Werkende code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct mMacro 
{ 
long x; 
long y; 
}; 

long _stdcall GetMacro(mMacro** ppMacro, mMacro* first) 
{
     mMacro* structure = new mMacro[10];
   //Populate structure[0], structure[1] etc.
     *ppMacro = structure;
     *first = temp[0];
   return 10;//size of array 
}


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Type mmacro
   x As Long
   y As Long
End Type

Private Declare Function GetMacro Lib "mydll.dll" (myMacro() As mMacro, first As mmacro) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

When you want to call GetMacro, write the following:

Dim myMacro() As mMacro
Dim temp() As mMacro
Dim first As mMacro
Dim lSize As Long

lSize = GetMacro(myMacro, first)
ReDim temp(lSize - 1)

Call CopyMemory(temp(0), first, lSize * len(first))



De vraag:
- In VB heb ik myMacro (Array van UDT)
- Die stuur ik naar de C++ Dll via de macro GetMacro.
- Daar doe ik bewerkingen op (met ao. new)
- Deze stuur ik trug naar VB via een pointer

1/ klopt deze denkwijze?

- terug in VB doe ik een CopyMemory van first naar de tabel temp()

2/
hoe wordt de data in temp() nu eigenlijk gedestroyed? Want wat ik zeker niet wil zijn geheugenlekken.

3/
Is de tabel opvullen in C++ sneller dan de array opvullen in VB (array = 68 bytes, inclusief verschillende pointers naar strings). De strings moeten geparsed worden uit een (dynamisch) bestand.


PS: whoami. Is dit nu een goede vraag of niet? Eigenlijk is dit juist zelfde als ik vorige keer gevraagd heb zenne...

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

1) ja
2) nee
3) waarschijnlijk wel, maar dat kun je zelf natuurlijk ook testen

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
Hoe moet ik deze tabel temp() dan destroyen?

(VB) temp = Nothing ??
Of is deze '=' gewoon (C++) temp = NULL, zonder een (zoals bij SafeArrays in C++) "Release()" van elk element in de tabel?

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

je moet gewoon een C++ functie maken die het geheugen vrijgeeft met delete[], en die aanroepen.

Overigens vraag ik me af of het uberhaupt gaat werken, je kunt imho niet gewoon een VB array assignen aan een C++ array, aangezien er dan geen lengte-informatie meekomt die VB nodig heeft

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 denk dat SafeArray wel een constructor heeft die een array als parameter heeft.

Kan jij btw iets van IDL? Want ik heb gelezen dat ik het op die manier zeker kan doen (nl. tabel van UDTs meegeven naar C++, daar aanpassen & dan teruggeven naar VB). Maar daarvoor is IDL nodig. Maar daar is dus zo weinig (bruikbare) informatie over te vinden op het net...

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

staat wel info over in de MSDN. Het is een taal om COM objecten mee te beschrijven

verder heb ik geen verstand van COM overigens :)

[ Voor 25% gewijzigd door .oisyn op 10-03-2003 11:42 ]

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 ook niet... En dan is het nogal moeilijk om die (overigens niet-altijd-werkende) voorbeelden van MSDN te lezen :x

Kzal nog maar wat gaan knoeien ;)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32

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.


Verwijderd

Topicstarter
I know, I know... Fillen is geen probleem... Zeker niet als je een al gemaakte tabel meegeeft (dus in VB: Dim D(3) as UDT).
Het grote probleem zit hem er in dat je
1/ Redim
2/ Create

Dus als je in VB:
Dim D() as UDT doet, stuurt die een NULL-pointer naar C++
Daar moet je dan die SafeArray createn. En daar ligt exact het probleem in...

Ik heb er al een pakje opzoekingswerk naar verricht, maar er schijnt dus echt geen simpele manier te zijn om dit aan te pakken. De enigste, iet of wat werkende manier is via "ATL COM". En dit is een zeer omslachtige manier om aan je doel te geraken!!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
Bekijk COleSafeArray uit de MFC eens. Die heeft o.a. een Create en Redim.

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.

Pagina: 1