Seite 1 von 1

DLL/OCX (De)Registrieren

Verfasst: 13.01.2009 18:44
von cxAlex
Hier ein kleiner Code-Snippet mit dem man eine DLL/OCX in Windows registrieren/deregistrieren kann, wie es z.B. auch regsvr32.exe macht, wobei optinonal ein Timeout für die maximale Registrierungs-dauer angeben werden kann. Das Beispiel hab ich aus einem Pascal Snippet übersetzt, wenn ichs wieder finde werde ich den Link auch hier posten.

Viel Spaß damit:

Code: Alles auswählen

; Registriert eine DLL/OCX Datei.
; (wie regsvr32)
; Eingangswerte:
;   File     = die zu registrierende Datei
;   Register =    0 : deregistrieren
;              <> 0 : registrieren
;   Timeout  = Timeout in ms

; Rückgabewerte.
;   -1 = Konnte Library nicht öffnen
;   -2 = DLL-Einsprungpunkt nicht gefunden.
;   -3 = Timeout Überschritten
;    1 = alles OK!

EnableExplicit

CoInitialize_(0) ; Benötigt

Procedure Register(File.s, Register, Timeout)
  Protected tLib, RtVar, Func.s
  Protected tThread, tTime, tEntry
  tLib = OpenLibrary(#PB_Any, File)
  RtVar = -1
  If IsLibrary(tLib)
    RtVar = -2
    If Register
      Func = "DllRegisterServer"
    Else
      Func = "DllUnregisterServer"
    EndIf
    tEntry = GetFunction(tLib, Func)
    If tEntry
      tThread = CreateThread(tEntry, 0)
      tTime = ElapsedMilliseconds()
      Repeat
        If Not IsThread(tThread)
          RtVar = 1
          Break
        Else
          Delay(2)
        EndIf
      Until ElapsedMilliseconds()-tTime> = TimeOut
      If IsThread(tThread)
        RtVar = -3
        KillThread(tThread)
      EndIf
    EndIf
    CloseLibrary(tLib)
  EndIf
  ProcedureReturn RtVar
EndProcedure

DisableExplicit

Verfasst: 13.01.2009 19:06
von ts-soft

Code: Alles auswählen

CoInitialize_(0)
fehlt. Weiß auch nicht warum das so umständlich ist. Wofür ist der Thread
und das Timeout? Ich habs bisher immer normal genutzt, wie es auch im
CodeArchiv oder in COMate gemacht wird.

Verfasst: 13.01.2009 19:21
von cxAlex
ts-soft hat geschrieben:

Code: Alles auswählen

CoInitialize_(0)
fehlt. Weiß auch nicht warum das so umständlich ist. Wofür ist der Thread
und das Timeout? Ich habs bisher immer normal genutzt, wie es auch im
CodeArchiv oder in COMate gemacht wird.
>CoInitialize_(0)

Für was das?

Der Thread ist dafür da das man eine DLL/OCX die sich beim registrieren aufhängt o.ä. nach dem Timeout abschießt und nicht das ganze Programm mitgerissen wird. Ich geh nicht davon aus das die DLL/OCX die ich registriere perfekt programmiert ist.

Edit:
> COMate
> CodeArchiv
Ich denke du verstehst das falsch. Damit spricht man die DLL/OCX nicht an sondern registriert sie Global am System. Installer z.B. machen sowas. Gib mal im CMD regsvr32.exe ein dan siehst du was der Source macht.

Verfasst: 13.01.2009 19:40
von ts-soft
cxAlex hat geschrieben: Ich denke du verstehst das falsch. Damit spricht man die DLL/OCX nicht an sondern registriert sie Global am System. Installer z.B. machen sowas. Gib mal im CMD regsvr32.exe ein dan siehst du was der Source macht.
Ich weiß, komm ja nicht aus dumpfdorf. Hab ich schon gemacht, als Du noch
Windeln getragen hast. Wenns registrieren nicht klappt, gibts einen Wert
<> #S_OK zurück, thread und timeout sind unnötig und quatsch.
Um OleServer global zu registrieren ist auch ein CoInitialize_(0) nötig,
jedenfalls in Sprachen wo dies nicht automatisch ausgeführt wird, wie z.B.
NichtOOP Sprachen wie PureBasic.

In PureDisphelper findeste Du eine Include, die dasselbe macht, ohne
unnötige Threads und Timeouts und funktioniert seid Jahren.

Verfasst: 13.01.2009 19:48
von cxAlex
> Wenns registrieren nicht klappt, gibts einen Wert <> #S_OK zurück, thread und timeout sind unnötig und quatsch.

Nicht wenn sich die Registrierungs-Procedure in der OCX aufhängt, dann steht dein ganzes Programm.

> Um OleServer global zu registrieren ist auch ein CoInitialize_(0) nötig, jedenfalls in Sprachen wo dies nicht automatisch ausgeführt wird, wie z.B. NichtOOP Sprachen wie PureBasic.

Wusste ich nicht, werd ich oben einfügen.

Verfasst: 13.01.2009 19:54
von ts-soft
> Nicht wenn sich die Registrierungs-Procedure in der OCX aufhängt, dann steht dein ganzes Programm.
Naja, dann wirste das wohl für alle DLL-Funktionen einfügen müssen, die Du
verwendest :roll:

Verfasst: 13.01.2009 20:42
von cxAlex
ts-soft hat geschrieben:> Nicht wenn sich die Registrierungs-Procedure in der OCX aufhängt, dann steht dein ganzes Programm.
Naja, dann wirste das wohl für alle DLL-Funktionen einfügen müssen, die Du
verwendest :roll:
Das mit dem Thread hab ich aus dem Pascal - Source, und da wurde es auch so erklärt. Natürlich kann du die Funktion auch einfach so callen.