Toon posts:

[vb] ActiveX dll laden, zonder geregistreren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb even een klein vraagje :)

Is er een manier om een ActiveX dll te laden, zonder dat ie geregistreerd staat (mbv Regsvr32)

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 08-09 20:35

CyberSnooP

^^^^ schrijft --->

Nee.

|_____vakje______|


Verwijderd

Topicstarter
Op donderdag 25 oktober 2001 12:40 schreef CyberSnooP het volgende:
Nee.
Owkeej :)

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 17-09 08:12

Crazy D

I think we should take a look.

Nee, hoewel je de boel misschien zou kunnen faken, door late binding te gebruiken om er zeker van te zijn dat er bij het starten van het programma geen enkele controle id of de dll geregt is. Proberen een createobject te doen, als dat mislukt, dll registreren (op www.codeguru.com/vb is code te vinden die _zonder_ regsvr32.exe (dus volledig met VB en API calls) dll's kan registreren). Vervolgens kun je 'm gewoon gebruiken in je programma. En bij het afsluiten van je programma de dll weer even unreggen.
Niet getest, maar ik denk dat het moet kunnen werken.

Deze code bedoel ik:
How to Register / UnRegister ActiveX Components through Code

Exact expert nodig?


Verwijderd

Als je de coclass en interface clsid's die je wilt hebben uit die dll van te voren al weet is het wel te doen, echter onmogelijk vanuit VB die alle lowlevel com(ActiveX) prut hide voor de nietsvermoedende VB programmeur, in C moet wel te doen zijn.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 16:48

johnwoo

3S-GTE

Nog niet geprobeerd, maar volgens mij moet het wel (zelfs dynamisch) te doen zijn met de LoadLibrary of LoadLibraryEx API functies...

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


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 17-09 08:12

Crazy D

I think we should take a look.

Op donderdag 25 oktober 2001 13:18 schreef Yarvieh het volgende:
Als je de coclass en interface clsid's die je wilt hebben uit die dll van te voren al weet is het wel te doen, echter onmogelijk vanuit VB die alle lowlevel com(ActiveX) prut hide voor de nietsvermoedende VB programmeur, in C moet wel te doen zijn.
Ik neem aan dat ie z'n eigen dll of zo ff wil kunnen gebruiken. Dat is geen enkel probleem. Idd een "vreemde dll" gebruiken wordt wat lastig. Hoewel, never say never ;) Ik kan me herinneren nog weleens wat code gezien te hebben waarmee je je eigen object browser kon bouwen... in VB dus ;)

Exact expert nodig?


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Op donderdag 25 oktober 2001 13:34 schreef johnwoo het volgende:
Nog niet geprobeerd, maar volgens mij moet het wel (zelfs dynamisch) te doen zijn met de LoadLibrary of LoadLibraryEx API functies...
Ten eerste zijn die voor Code-Only dll's bedoeld (geloof ik), ten tweede, wat wil je er dan mee doen? Normaal gesproken doe je daarna een GetProcAdress() om een pointer naar een functie te krijgen. Leuk dat je die hebt, maar in VB kun je daar precies helemaal NIETS mee.

Zoiets handigs (en gevaarlijks) als functions pointers moet je niet in de handen van een VB "programmeur" geven, dan gebeuren de ergste rampen (aldus MS, maar het zou toch wel erg handig zijn).

Think about it: Als je vanuit VB zulke dingen net zo makkelijk kon doen als vanuit C++, dan zouden ze VC++ niet meer verkopen.

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


Verwijderd

Op donderdag 25 oktober 2001 14:22 schreef Crazy_D het volgende:
Hoewel, never say never ;) Ik kan me herinneren nog weleens wat code gezien te hebben waarmee je je eigen object browser kon bouwen... in VB dus ;)
Correct de library om typelibrary's te browsen heeft ms ook netjes verpakt in een com (activeX) component (TLBINF32.DLL) of er officiele documentatie van is weet ik echter niet, maar er is opzekers documentatie van. Maar ik ben er zeker van dat je het niet voor elkaar krijgt een loadlibrary te doen van je dll, z'n CreateInstance aan te roepen en daar nog es een QueryInterface overheen weet te fietsen zodat je de interface krijgt in vb die je wil hebben :Y)
Op donderdag 25 oktober 2001 14:23 schreef Gerco het volgende:
[..]
Think about it: Als je vanuit VB zulke dingen net zo makkelijk kon doen als vanuit C++, dan zouden ze VC++ niet meer verkopen.
Think about it.. als ze het *WEL* hadden gedaan had de instap drempel van VB een stuk hoger gelegen en hadden we nu een stuk minder van die lui in de industrie gehad die vooral op verjaardagen en partijtjes melden dat ze "zo handig met computers zijn"..... *zucht* ...*zwijmel*...het had allemaal zo mooi kunnen zijn.... damn you MS!

Verwijderd

Topicstarter
Okeej, bedankt allemaal, ik probeer wel wat uit :+ en als het niet lukt, dan reggen ze hem maar :P

Verwijderd

Zoals gemeld, zonder te registreren kan dit (zelfs in C) niet.
Maar het registreren is in VB heel makkelijk *D
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function RegisterServer(hWnd As Long, DllServerPath As String, bRegister As Boolean)
On Error Resume Next
Dim lb As Long, pa As Long

    lb = LoadLibrary(DllServerPath)
    If bRegister Then
      pa = GetProcAddress(lb, "DllRegisterServer")
    Else
      pa = GetProcAddress(lb, "DllUnregisterServer")
    End If
    RegisterServer = (CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = &H0)
    FreeLibrary lb

End Function

Ehh, dit is natuurlijk zonder enige foutafhandeling, maar je begrijpt het idee... De declaraties van de functies vind je terug in je API-viewer.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Op donderdag 25 oktober 2001 21:48 schreef Debbus het volgende:
RegisterServer = (CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = &H0)
CallWindowProc() ???? Als ik het goed heb is die voor het aanroepen van (jaja) Window Procedures! Niet willekeurige functies in een Dll!

De prototypes van DllRegisterServer en DllUnregisterServer zijn:
code:
1
2
STDAPI DllRegisterServer(void);
STDAPI DllUnregisterServer(void);

Die van een windowproc is:
code:
1
2
3
4
LRESULT CALLBACK MainWndProc(  HWND hWnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam)

Het kan aan mij liggen, maar die zijn niet bepaald compatible. Je zet allemaal zooi op de stack die voor de vreselijkste rampen kan zorgen in bepaalde omstandigheden, lijkt me niet zo slim.

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


Verwijderd

Doen jullie nu zo moeilijk of is het volgende gewoon handig:
code:
1
Shell "regsvr32.exe COMponent.dll"

Het enige probleem met Shell is dat ie niet wacht todat de registratie klaar is, maar daar weet vast iemand wat op.
Pagina: 1