Was macht regsvr32?

7

Müssen regsvr32Sie die Datei zuerst in Ihren system32Ordner verschieben , um eine DLL-Datei auf einem Windows-Server zu registrieren, oder erfolgt dies tatsächlich automatisch, sobald Sie den regsvr32Befehl aufrufen ?

Kann ich eine DLL-Datei nach der Registrierung einfach löschen, wenn ich sie einfach auf meinem Desktop ablege und dort registriere? Was würde nach dem Entfernen passieren?

Mit anderen Worten, wie funktioniert der regsvr tatsächlich?

bvdb
quelle
1
Ich frage mich, was die Frage tatsächlich provoziert.
Bill_Stewart
@ Bill_Stewart gute Frage. Meine Antwort wurde aktualisiert und grenzt an eine Beschreibung des StackOverflow-Kalibers. Ich bin jedoch eher ein Entwickler in der Bereitstellung privater Clouds als ein IT-Spezialist.
Matthew Wetmore
Die Frage scheint einige Missverständnisse aufzudecken. Daher mein Kommentar.
Bill_Stewart
@ Bill_Stewart Letzte Woche hatte ich einen Kollegen am Telefon, der mich nach einer Fehlermeldung fragte. Es wurde aufgrund einer fehlenden DLL-Datei verursacht. Also schickte ich ihm die Datei und bat ihn, sie zu registrieren. Also, was hat er getan? - er hat es einfach reingelegt c:\tempund dort registriert. (Er erklärte mir später, dass er nicht die Windows-Berechtigungen hatte, um es aus seinem system32-Ordner zu registrieren). - Es hat sein Problem gelöst, aber ich hatte ein schlechtes Gefühl dabei. Leider hatte ich nicht genügend technisches Wissen, um dies zu beweisen. Dank der Antworten unten verstehe ich es jetzt endlich. Vielleicht sogar genug, um es zu korrigieren.
bvdb

Antworten:

5

Zusätzlich zu @Matthew Wetmores korrekter Antwort ist das Übliche, dass alle COM-Komponenten in dieser DLL registriert werden.

Insbesondere werden zwei Schlüssel (+ Unterschlüssel) in der Windows-Registrierung erstellt.

Betrachten Sie beispielsweise eine DLL:, dao360.dlldie mehrere COM-Objekte enthält. Für jeden ist der erste Schlüssel so etwas wie:

HKLM \ SOFTWARE \ Classes \ DAO.TableDef.36

Für das DAO Table Defintion-Objekt ist der Name des Schlüssels die ProgID des COM-Objekts, auf das sich Programmierer in ihrem Code beziehen würden.

Unter dem Schlüssel befindet sich normalerweise ein einzelner Schlüssel mit einem Standardwert:

HKLM \ SOFTWARE \ Classes \ DAO.TableDef.36 \ CLSID

in diesem Fall:

{00000103-0000-0010-8000-00AA006D2EA4}

Dies ist die Klassen-ID oder CLSID für das COM-Objekt. Sie gibt an, wo sich der zweite Schlüssel befindet:

HKLM \ SOFTWARE \ Classes \ CLSID {00000103-0000-0010-8000-00AA006D2EA4}

Dieser Schlüssel mit seinen Unterschlüsseln und Werten enthält zusätzliche Informationen zum COM-Objekt.

Ein zu beachtender Wert ist der Standardwert unter:

HKLM \ SOFTWARE \ Classes \ Wow6432Node \ CLSID {00000103-0000-0010-8000-00AA006D2EA4} \ InprocServer32

In unserem Beispiel hat es den Dateipfad der exe / dll, die das COM-Objekt hostet:

%CommonProgramFiles%\Microsoft Shared\DAO\dao360.dll

Dies ist der richtige Dateipfad, als regsvr32.exe zum Registrieren dieses COM-Objekts verwendet wurde. Wenn Sie die Datei manuell verschieben, funktioniert das COM-Objekt nicht mehr, da dieser Registrierungswert jetzt auf eine fehlende Datei verweist.

Bevor Sie regsvr32.exe für eine DLL verwenden, verschieben Sie sie an ihren endgültigen Speicherort und verschieben Sie die DLL nach der Registrierung nicht.

Peter Hahndorf
quelle
1
Sie haben Recht, dass dies normalerweise der Fall ist (+1), obwohl es nichts erfordert, was dies erfordert, oder verhindert, dass es etwas ganz anderes tut. Sie können eine entsprechend benannte Schnittstelle erstellen, die völlig beliebige Aufgaben ausführt. Ich habe sogenannte "Fixit" -Seiten gesehen, die dazu ermutigen, eine Ersatz-DLL herunterzuladen und zu registrieren, um einen häufigen Fehler zu beheben. Es gibt hier kaum einen Unterschied zum Herunterladen und Ausführen einer .EXE - sie kann tun, was sie will. Voraussichtlich endet dies nicht immer gut ...
Matthew Wetmore
10

RegSvr32 ruft eine exportierte Methode DllRegisterServer in der DLL auf. Was als nächstes konkret passiert, hängt von der Implementierung ab. Oft werden Registrierungsschlüssel für COM basierend auf dem Speicherort der Datei geschrieben. Die Registrierung sollte im Allgemeinen nicht als Installationsprogramm betrachtet werden, das weit darüber hinaus geht.

Sofern die App nicht spezifisch ist, kann sie von überall registriert werden, aber Sie sollten sie danach nicht mehr verschieben / entfernen. SysMon von SysInternal kann den Datei- und Registrierungszugriff überwachen, wenn Sie die Registrierung aufrufen, wenn Sie die Details wirklich sehen möchten - obwohl nichts den Code daran hindert, entweder nichts oder wirklich alles zu tun, was der Code tun kann, wie auf das Internet zuzugreifen, andere Dateien zu schreiben oder zu entfernen usw. . Registrieren Sie wie bei jeder ausführbaren Datei nur den Code, dem Sie vertrauen.

Es gibt auch DllInstall , mit regsvr32 /idem aufgerufen werden kann und das gemäß der regsvr32-Dokumentation als Installationsprogramm gedacht ist :

Regsvr32
Dieses Befehlszeilentool registriert DLL-Dateien als Befehlskomponenten in der Registrierung.
Syntax
regsvr32 [/ u] [/ s] [/ n] [/ i [: cmdline]] DLL-Name
Parameter
/ u : Hebt die Registrierung des Servers auf.
/ s : Gibt regsvr32 an, das unbeaufsichtigt ausgeführt werden soll und keine Meldungsfelder anzeigt.
/ n : Gibt an, dass DllRegisterServer nicht aufgerufen werden soll. Sie müssen diese Option mit / i verwenden.
/ i: cmdline : Ruft DllInstall auf und übergibt ihm eine optionale [cmdline]. Bei Verwendung mit / u wird dll uninstall aufgerufen.
DLL- Name: Gibt den Namen der DLL-Datei an, die registriert werden soll.
/? : Zeigt die Hilfe an der Eingabeaufforderung an.

Es gibt auch DllUnregisterServer , aber aus praktischer Erfahrung sind Implementierungen davon normalerweise von geringerer Qualität als die Registrierung.

Eines der Ziele des Windows Installer (MSI) war es, die Installation von diesem Code zu entkoppeln.

Matthew Wetmore
quelle