DLL/OCX (De)Registrieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

DLL/OCX (De)Registrieren

Beitrag 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
Zuletzt geändert von cxAlex am 13.01.2009 19:49, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten