[C++/VB] Class uit C++ via DLL in VB

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Ik heb al voldoende voorbeelden gezien om functies uit een DLL aan te roepen in VB, maar is het ook mogelijk om een class in C++ te exporteren naar een DLL en deze te gebruiken in VB?
Want voor functies uit een DLL werkt het het best in VB om ook daar die functies opnieuw te declareren. Maar een class lijkt me beetje lastig op die manier (Visual Basic 6.0 iig).

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Nee.

'VB' kent het begrip class niet zoals dat wordt gebruikt in C++. Je kunt wel een COM object definieren in C++ en die gebruiken in VB. Dit is echter in C++ wel wat vervelend. (alhoewel ATL je wel helpt in Visual Studio)

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Maar werkt het dan niet om in de DLL een class volgens C++ gedefinieerd te hebben, en deze in VB als nieuw type variable te gebruiken?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

je kunt natuurlijk ook wrapper functies om je klasse heen maken, en een pointer naar een instantie in VB definieren als een Long

Een voorbeeldje:

In je C++ source file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Klasse
{
private:
    int blaat;

public:
    Klasse () : blaat (0)
    {
    }

    Klasse (int i) : blaat (i)
    {
    }

    void doeIets ()
    {
      // ...
    }
};



extern "C" {

Klasse * Klasse_new ()
{
    return new Klasse ();
}

Klasse * Klasse_new_int (int i)
{
    return new Klasse (i);
}

void Klasse_delete (Klasse * k)
{
    delete Klasse;
}

void Klasse_doeIets (Klasse * k)
{
    k->doeIets ();
}

}

en in VB dan gewoon de Klasse_* functies gebruiken:
code:
1
2
3
4
5
Dim k as Long

k = Klasse_new (5)
Klasse_doeIets k
Klasse_delete k

Hoewel COM wel mooier werkt (maar imho irritant om te implementeren in C++)... dan heb je ook gelijk 'garbage collection' dat de VB runtime voor je doet

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.


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
In .NET is dit dan wel mogelijk ...

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Op vrijdag 19 juli 2002 21:58 schreef -Avalanche- het volgende:
In .NET is dit dan wel mogelijk ...
Ja, maar in .NET is C++ geen C++ meer, en VB geen VB meer (bij wijze van spreken) ;).

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Oh ja, dan nog iets...
Ik maak ook nog gebruik van templates :D
Is dit ook mogelijk in VB met die wrapper functies?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Otis is right de enige manier om C++ en VB fatsoenlijk samen te laten werken is COM. 't is niet zo heel vervelend om die objecten in VC++ te maken echter COM heeft nogal 'n steile leer curve maar als je er eenmaal aan gewent bent is het quite good..

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
iemand goeie info site over COM?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Echt goede sites ken ik eigenlijk niet op codeproject.com kan je mischien wel wat oppikken maar ik wil je eigenlijk het volgende boek aan raden
code:
1
2
3
4
5
6
COM and COM+ Programming Primer, The, 1/e 
Alan Gordon

Copyright 2000, 796 pp.
Paper format
ISBN 0-13-085032-2

Begint heel basic met C++ het hoe en waarom uit te leggen en moved langzaam door naar ATL om je leven iets aangenamer te maken.

Verwijderd

Een ATL project maken, proxy stub code in aparte files, geen MFC, dan een nieuw ATL object inserten, nl een com object. Je krijgt een interface, daar je methods op definieren en implementeren. Compileren, en je kunt in VB je COM component registreren en gebruiken.

Op zich is het niet zo lastig, in de MSDN zit goede help hoe een COM component in C++ te bouwen in VC++6.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
* maar werken die class'en in het COM object dan in VB gewoon als nieuw type variabele?
* class.functie werkt dan ook?
* werken template class'en ook nog? class<int> i;

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Op dinsdag 23 juli 2002 17:23 schreef riezebosch het volgende:
* maar werken die class'en in het COM object dan in VB gewoon als nieuw type variabele?
* class.functie werkt dan ook?
* werken template class'en ook nog? class<int> i;
Class in C++ != class in VB.

Class in VB == COM object
en werkt dus niet met templates.

class.functie werkt gewoon. Ik heb bv eens een ipnr2hostname component gemaakt in C++, en die is gewoon in VB (of vbscript of whatever) te gebruiken, eerst reference in je project aanleggen naar de typelib, dan component aanmaken zoals je altijd al doet in VB via Dim var as [package.]comclassname

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Shit... Ik heb hele vette linkedlist met iterator gemaakt, op basis van templates. Wilde deze graag beschikbaar maken in VB :'(

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

VB heeft collections, zelden tot nooit heb je daar een linked list nodig.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 12:47

johnwoo

3S-GTE

Nog even over C++/VB compatibiliteit...
Als je je explorer goed in de gaten houdt tijdens het compilen van een redelijk groot VB project (bij kleintjes gaat het te snel) dan zul je zien dat VB in de projectfolder voor iedere module een objectfile aanmaakt.
Bij mijn weten wordt vervolgens voor het linken exact dezelfde linker gebruikt als die door VC++ wordt gebruikt.

Mijn idee: zou het niet mogelijk zijn die object files op te vissen (voordat VB ze weer verwijdert na het linken), en die vervolgens zelf te linken, samen met een eigen objectfile (gemaakt in C++, of ieder ander taaltje for that matter) ?

Voor klassen zou dit nog steeds geen oplossing zijn, maar het zou dan wel mogelijk zijn om in C gebakken functies te gebruiken in VB zonder de noodzaak van een externe reference.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Je hebt die referentie zowiezo nodig omdat die obj files geen type informatie bevatten.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 30-08 17:59

Gerco

Professional Newbie

Op woensdag 24 juli 2002 11:12 schreef johnwoo het volgende:
Mijn idee: zou het niet mogelijk zijn die object files op te vissen (voordat VB ze weer verwijdert na het linken), en die vervolgens zelf te linken, samen met een eigen objectfile (gemaakt in C++, of ieder ander taaltje for that matter) ?
Ja, dat is mogelijk. Op die manier kun je ook gewoon functies exporten in VB en zo een 'normale' DLL maken.

Ik ben ooit ergens een progje ofzo gevonden wat tussen de compiler en linker gaat zitten en zo die object files bewaart ofzo. Zoek eens op [url="http://www.pscode.com"]www.pscode.com[/url], volgens mij had ik het daar gevonden.

[edit]
Niet op pscode dus, maar hier: [url="http://lockfree.50megs.com/linker.html"]http://lockfree.50megs.com/linker.html[/url]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1