Toon posts:

[vb]C(++) DLL gebruiken in VB

Pagina: 1
Acties:

Verwijderd

Topicstarter
Kerst..mooie dagen om te proggen :P
Maar het wil niet echt

Het volgende moet er gaan gebeuren:

In C++ een DLL schrijven..en die vervolgens met VB gaan bebruiken.

Nou ben ik er al een beetje achter dat ik dan alleen C type functies mag exporteren..

Maar als ik de DLL in VB wil gebruiken, krijg ik de melding dat er geen references aan de DLL kunnen worden toegevoegd :?

Help :'(

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Hmm ken wel iemand die dat een keer gedaan heeft.
Ik neem aan dat je een COM DLL wilt maken?
Dan moet je in ieder geval met ATL objecten aan de gang gaan in C++

It’s nice to be important but it’s more important to be nice


Verwijderd

Als je gewoon C functies exporteerd vanuit je DLL kan je ze dmv van dit soort constructies importeren in vb.
code:
1
2
Private Declare Function MyFunction Lib "Mydll" _ 
(ByVal param1 as long, byval param2 as long) as long

Als je een COM/ActiveX/OLE2 (+- same things, different names) dll hebt gemaakt kan je die dmv van het references menutje gebruiken (mits je de typelib mee gelinkt heb natuurlijk)

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Check deze link eens:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_atl_using_the_atl_com_appwizard.asp

Hier staat uitgelegd hoe je via een wizard een simpele ATL/COM DLL maken die je dus ook via VB met references kan gebruiken.

It’s nice to be important but it’s more important to be nice


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-09 22:39
Aantal punten om op te letten:

- Het exporteren van functies lukte mij niet zonder het aanmaken van een export file (.def bestand). Het verhaal wat in msdn staat over 'declspec dllexport' werkte niet.

- Alle functies moeten _stdcall calling convention hebben. Dit is wat basic gebruikt namelijk.

voorbeeldje:

dll.h:
code:
1
int _stdcall foo(LPSTR a,LPSTR b);

dll.cpp:
code:
1
2
3
4
int _stdcall foo(LPSTR a,LPSTR b)
{
    return 0;
}

dll.def:
code:
1
2
3
LIBRARY "foo"
EXPORTS
foo @1

En dan in een vb module:
code:
1
Declare Function foo Lib "foo" (ByVal a As String, ByVal b As String) As Integer

Succes ermee zou ik zeggen :)

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
Mijn dank is groot..en mijn kerstdagen waren goed :D

Het WERKT!

:z

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-09 22:39
Mooi zo ! :)

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.


  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 09-08 22:22
Op dinsdag 25 december 2001 12:22 schreef farlane een hele boel:
...
Om ff terug te vallen op die _dllexport. Ik heb hier ook een hele lange tijd mee zitten klooien maar ik kreeg het echt niet werkend. Echt vreemd, overal in de MSDN library staat er wel iets over als je zoekt naar DLL's. Maar om een of andere reden werkt het gewoon niet. Net of ze iets vergeten zijn te implementeren in de compiler :P

Iig werkt de .def prima.

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


Verwijderd

Yep is lekker gemakkelijk. Ik heb dat ander wel aan het werk gekregen (dllexport) maar dan ging hij de exported functie name veranderen bv
foo werd dan foo42348786445@@456 of zoiets
en dan moest je in vb dan ook die naam gebruiken

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 27 december 2001 20:30 schreef drZymo het volgende:

[..]

Om ff terug te vallen op die _dllexport. Ik heb hier ook een hele lange tijd mee zitten klooien maar ik kreeg het echt niet werkend. Echt vreemd, overal in de MSDN library staat er wel iets over als je zoekt naar DLL's. Maar om een of andere reden werkt het gewoon niet. Net of ze iets vergeten zijn te implementeren in de compiler :P

Iig werkt de .def prima.
Nee idd, dat had ik hier ook... Later realiseerde ik me dat het misschien was omdat het C++ functies waren ipv C functies (door namemangling krijgen ze dus niet de normale functienaam), hoewel ik dit nooit geprobeerd heb...

declspec werkt wel als je gewoon met C/C++ werkt (dus een C/C++ dll waarin je export en een C/C++ proggie waarmee je die functies import)

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.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op donderdag 27 december 2001 20:40 schreef GrAviTy het volgende:
Yep is lekker gemakkelijk. Ik heb dat ander wel aan het werk gekregen (dllexport) maar dan ging hij de exported functie name veranderen bv
foo werd dan foo42348786445@@456 of zoiets
en dan moest je in vb dan ook die naam gebruiken
Dat klopt, de gemaakte functie naam bevat wat extra info over de parameter grootte. Is wat extra error checking.

Je kan het met een .def file oplossen of met:
code:
1
#pragma comment(linker, "export:Functie=_Functie@8")

Makkelijkst is om de .def methode te gebruiken, anders moet je zelf de @ functie namen bepalen. VC++ zoekt zelf uit welke functie er bijhoort indien je een .def file gebruikt..

VB gebruikt simpele functie namen. Daardoor wou dus je DLL niet werken met VB. In de DLL stond een functie met de naam: blaat@8 (ofzo) terwijl VB gewoon blaat verwachte.

Verwijderd

Zie ook http://support.microsoft.com/default.aspx?scid=kb;EN-US;q143258 en http://support.microsoft.com/default.aspx?scid=kb;EN-US;q189133 en zie daar hoe je een typelibrary kunt maken van je DLL's en constanten. Dat programmeert best wel relaxed. En ja het werkt ook voor niet ActiveX-dll's.
Pagina: 1