[VB6] OLE <-> dll?

Pagina: 1
Acties:

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Ik heb al gezien dat er meerdere topics op GoT zijn over het gebruik van DLL's in VB zonder ze te hoeven registreren en ook dat dat niet mogelijk is, maar wat ik heb begrepen (uit de VB6 help) kun je via OLE ook communiceren met DLL's. Heb de hele middag op internet naar iets bruikbaars gezocht maar helaas zonder resulaat. Weet iemand misschien hoe dat moet en wil hij/zij me een stapje op weg helpen?

Het enige dat ik weet is dat je een OLE control nodig hebt. Verder weet ik niet hoe je zelf die DLL zou moeten maken en hoe je er mee zou moeten communiceren.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
DLL's zijn er van verschillende smaken. Als je wilt communiceren met een standaard Windows DLL (dus geen COM DLL) zou je de functies die je wilt gebruiken eerst moeten declaren a la:
Visual Basic:
1
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Mja, maar DLL's waarvan je de functions op die manier declared zijn toch niet te maken in VB6?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Je kunt met VB ActiveX dll's maken die nadat ze geregistreerd zijn in je references dialoog opduiken. ( Samen met nog 65535 andere dll's )

Als je iet in VB wilt proggen, kun je bijvoorbeeld ATL dll's in C++ maken die hetzelfde doen.

ActiveX controls zijn ook een manier om dit te doen, maar die hebben vaak een UI element.

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.


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
farlane schreef op 03 november 2003 @ 20:46:
Je kunt met VB ActiveX dll's maken die nadat ze geregistreerd zijn in je references dialoog opduiken. ( Samen met nog 65535 andere dll's )
Klopt, maar VB zal het control bij het compileren altijd registreren en dat is nou net niet wat de TS wil.

Google groups is je vriend. Volgens mij is die 1e link wel interessant.
http://groups.google.com/...ed+dll&btnG=Google+zoeken

[ Voor 4% gewijzigd door pjonk op 03-11-2003 20:53 . Reden: typo ]

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
mja :)
Deze reply gaat minder vriendelijk klinken dan'ie bedoeld is, ik waardeer jullie hulp wel maar eigenlijk vertellen jullie niets nieuws.
Ik wil hem, als het even kan, niet registreren, want dat gekut met references heb ik helemaal gehad. Dat komt omdat die installer die bij vb zit niet altijd even goed functioneerd. En verder activeX controls... mja, dat is misschien een idee. Maar die moeten ook geregistreerd worden, of niet?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Waarschijnlijk had je mijn post hierboven nog niet gezien, maar je hebt nog steeds geen antwoord gegeven op mijn vraag:
Wil je met een COM/OLE/ActiveX DLL communiceren of met een standaard Windows DLL?

In VB6 kun je naar mijn weten alleen ActiveX DLL's maken.
In de Google groups ben ik best wel wat relevante threads tegengekomen. Onder andere ook deze post:
Loading unregistered Dll and Ocx COM servers is dealt with in detail in
Chapter 7 in my book. You need to call LoadLibrary/GetProcAddress on
DllGetClassObject to get a class factory, then call CreateInstance on the
class factory to get at a COM object.
Dit is allemaal wat geavanceerder programmeerwerk, maar je zou je eens in de bovengenoemde API functies moeten gaan verdiepen.
Overigens heb ik zelf geen ervaring met het aanroepen van ongeregistreerde COM DLL's vanuit VB 6.

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
JonkieXL schreef op 03 november 2003 @ 21:03:
Waarschijnlijk had je mijn post hierboven nog niet gezien, maar je hebt nog steeds geen antwoord gegeven op mijn vraag:
Wil je met een COM/OLE/ActiveX DLL communiceren of met een standaard Windows DLL?
Nog niet gezien, sorry... Zo ff die link bekijken :)
Nouja, om heel eerlijk te zijn weet ik niet precies wat de verschillen tussen die 4 zijn, maar ik weet dat ik het liefste een DLL zou gebruiken op de manier waarop je ook de win32 api's gebruikt, dus dat je met 'declare function X lib "my.dll"' de functions toegankelijk maakt voor je programma, maar ik heb al zoveel gelezen dat ik begrijp dat dat niet mogelijk is met alleen VB6.

Dus ik ben verder gaan zoeken en ontdekte dat je met het OLE-control dat standaard door VB toegankelijk gemaakt wordt, ook kan communiceren met externe libraries (dus ook DLL's, neem ik aan?). Vandaar dat mij vraag over OLE ging, maar misschien heb ik het wel helemaal bij het verkeerde eind.

In elk geval nu eerst even je google-link bekijken, dank je.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Sorry nog voor de verwarring, maar COM/OLE/ActiveX DLL zijn synoniemen voor een door Microsoft verzonnen standaard voor een DLL architectuur.

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Nou, een heel leuke link maar dat ging er niet dieper op in hoe je die DLL's nou moet maken. Dat was tenslotte ook een deel van de vraag.

Wacht ik ondertussen op meer antwoord en ga ik verder met het internet afschuimen.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
JonkieXL schreef op 03 november 2003 @ 21:18:
Sorry nog voor de verwarring, maar COM/OLE/ActiveX DLL zijn synoniemen voor een door Microsoft verzonnen standaard voor een DLL architectuur.
Dat zijn drie woorden voor een en dezelfde enkele architectuur?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je hoeft ook geen reference te zetten, maar je moet zet wel reggen.
Wat ik meestal doe is met een .bat-je de dll's reggen (met regsvr32), maar in mijn code gebruik ik late-binding. Dat wil zeggen dat je iets dimt "as object" en daar vervolgens met CreateObject het juiste component in gooit.

Ik denk dat ik wel begrijp waarom je die reference niet wil zetten: version-hell (sub-part van dll-hell ;) ). Op deze manier kun je je dll's los "upgraden" zonder er last van te hebben in je app.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
RobIII schreef op 03 november 2003 @ 21:35:
Je hoeft ook geen reference te zetten, maar je moet zet wel reggen.
Wat ik meestal doe is met een .bat-je de dll's reggen (met regsvr32), maar in mijn code gebruik ik late-binding. Dat wil zeggen dat je iets dimt "as object" en daar vervolgens met CreateObject het juiste component in gooit.

Ik denk dat ik wel begrijp waarom je die reference niet wil zetten: version-hell (sub-part van dll-hell ;) ). Op deze manier kun je je dll's los "upgraden" zonder er last van te hebben in je app.
Juist, dat is precies de reden :)
Kun je me een voorbeeld geven van late-binding? Heb dr op internet ook al over gelezen maar wat het nou precies is, is me nog niet helemaal duidelijk.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Late binding:
Visual Basic:
1
2
3
4
Dim x as Object

Set x = CreateOject("Word.Application")
x.visible =true


Early binding hiervoor is een reference noodzakelijk!
Visual Basic:
1
2
Dim x as New Word.Application
x.visible =true


Ik had eigenlijk niet het idee dat het puur om de problematiek met references te doen had.

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Ok, maar voor late-binding heb je dus de naam van het product nodig zoals het geregistreerd staat (in jouw voorbeeld is dat dus Word, in mijn geval zou dat bijvoorbeeld MyDll worden). Hoe stel je dan voor die DLL die naam in, en hoe voorkom je dat een ander programma die naam steelt?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Een DLL moet een instancing class hebben. Indien je in VB een ActiveX DLL maakt zul je in deze DLL een class met instancing MultiUse moeten defineren.
In CreateObject maak je vervolgens het object aan via de naam die je aan de MultiUse Class gegeven hebt.

Uiteraard moet je class naam uniek zijn en het stelen zou je alleen kunnen voorkomen door je DLL naam officieel te laten registreren, maar ga er maar vanuit dat deze registratie een hoop centjes kost ;)

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


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Oke, daar kan ik inkomen. Dus functies enzo plaats je ook op die MultiUse class?
Maar stel nu dat ik die class MubaDLL noem, maar ik installeer daarna een programma waar ook zo'n dll bijzit en die toevallig ook MubaDLL heet... wat gebeurt er dan? Nja, kleine kans natuurlijk, maar *stel* :)

Mja ik weet het, ik ben aan het zeiken ofzo, maar ik wil zulk soort problemen gewoon voorkomen.

[ Voor 16% gewijzigd door muba op 03-11-2003 22:21 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Meestal maak ik een project (naam van Bedrijf hier) met daarin de benodigde classes (Persons, Users, Whatever).

Dan krijg je dus MyCompany.MyClass als DLL reference. Vet kleine kans dat die al in gebruik is. Als je vervolgens zorgt dat de DLL's in de App.path/Bin directory van je project staan kan het al helemaal geen kwaad meer. Wil je je dll in de system(32) directory gooien dan moet je idd een beetje uitkijken met de naam. Maar als 'ie op google niet voorkomt zit je safe denk ik zo :Y)

En wat JonkieXL zegt :? Beats me! Ik heb nog nooit gehoord dat je een "Class naam" moet laten registreren. Laat staan officieel registreren. Iemand enig idee waar dat kan? :? /Onzin dus ;)

[ Voor 28% gewijzigd door RobIII op 03-11-2003 22:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
RobIII schreef op 03 november 2003 @ 22:31:
Meestal maak ik een project (naam van Bedrijf hier) met daarin de benodigde classes (Persons, Users, Whatever).

Dan krijg je dus MyCompany.MyClass als DLL reference. Vet kleine kans dat die al in gebruik is. Als je vervolgens zorgt dat de DLL's in de App.path/Bin directory van je project staan kan het al helemaal geen kwaad meer. Wil je je dll in de system(32) directory gooien dan moet je idd een beetje uitkijken met de naam. Maar als 'ie op google niet voorkomt zit je safe denk ik zo :Y)

En wat JonkieXL zegt :? Beats me! Ik heb nog nooit gehoord dat je een "Class naam" moet laten registreren. Laat staan officieel registreren. Iemand enig idee waar dat kan? :? /Onzin dus ;)
Ok nu word ik toch weer een beetje in de war gebracht. Ik ben nog niet zover dat ik zelf iets heb uit kunnen proberen, misschien zou ik dat eerst eens moeten doen. Maar... MyCompany, dat is de naam van je .DLL bestand? En MyClass is dus de naam van die MultiUse class?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
ja dus :)
Dank jewel allemaal, ik denk dat ik hier aardig mee verder kan expirimenteren!

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MUBA schreef op 03 november 2003 @ 22:47:
ja dus :)
Dank jewel allemaal, ik denk dat ik hier aardig mee verder kan expirimenteren!
Je mag die DLL rustig bladiebla.dll noemen, dat maakt voor de reference geen p**p uit ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Nadeel van dynamic binding is wel dat er een performance penalty aan vast zit. Er moet runtime gecontroleerd worden welke objecten je aan het instancen bent.

Overigens heb ik met een of andere hack ook al eens een normale dll kunnen produceren met VB6. ( Het kan wel, de object files die de VB compiler produceert zijn normale object files. Ik meen me zelfs te herrineren dat de VB compiler erg veel op de C/C++ compiler lijkt die bij VC++ zit )

FF zoeke ....
Dammit ik kan het niet terugvinden ... :(

[ Voor 5% gewijzigd door farlane op 04-11-2003 09:34 ]

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