2017-08-26 4 views
0

Ich muss ein Programm schreiben, das einige COM-Objekte verwendet, auf die aus dem Python-Comtypes-Paket zugegriffen wird. Ich verwende die clsid und/oder progid, um sie zu erstellen und zu verwenden. Diese Objekte werden von Drittanbietern bereitgestellt und normalerweise mit einem normalen Installationsprogramm (setup.exe oder msi-Datei) installiert. Nehmen wir an, dass diese DLL-Dateien eine Lizenz haben, die es mir ermöglicht, sie zusammen mit meinem Programm zu versenden. Ist es möglich, diese DLL-Dateien in den Speicher zu laden und sie von einer portablen App zu verwenden, ohne sie tatsächlich zu registrieren? Oder kann ich sie alternativ aus meinem Programm registrieren?Wie bündeln COM-DLLs in eine portable App?

Eine verwandte Frage ist dies: wie die Kette der DLL-Dateien, die zum Erstellen eines bestimmten COM-Objekts benötigt werden, zu bestimmen? (Anders als Versuch und Irrtum.)

Hintergrund: in Wirklichkeit gibt es mehrere Bibliotheken und das Hauptproblem ist, dass ich nicht möchte, dass die Benutzer 4 verschiedene Installer ausführen, bevor sie das eigentliche Programm starten können. Das wäre für einen durchschnittlichen Benutzer zu schwierig.

Antwort

2

Sie stellen eine Menge Fragen hier. Es gibt viele Möglichkeiten, um das zu erreichen, was Sie erreichen wollen, und es ist schwer, so viele Fragen zu beantworten. Wenn Sie spezielle Fragen haben, wie Sie eine bestimmte Sache machen können, starten Sie bitte neue Beiträge für diese.

Das gesagt, ich werde versuchen, Ihnen einige Informationen zu geben, um Ihnen zu helfen herauszufinden, was Sie tun müssen/wollen.

Können Sie eine COM-DLL verwenden, ohne sie zu registrieren?

Ja. Abhängig von den Anforderungen der COM-DLL und der von Ihnen verwendeten Plattform gibt es mehrere Möglichkeiten. Einige Optionen funktionieren jedoch nicht immer und andere Optionen sind sehr anspruchsvoll.

  • DllGetClassObject - In einigen Fällen, abhängig von dem COM-Objekt, das Sie zu laden sind versuchen, können Sie einfach die DLL laden, rufen Sie die DllGetClassObject Funktion direkt und verwenden Sie die zurück IClassFactory Ihr Objekt zu erstellen. Dies ist der einfachste Weg - wenn es funktioniert. Wenn die von Ihnen erstellte Klasse erfordert, dass die DLL registriert wird (vielleicht intern CoCreateInstance oder vielleicht Proxy-Unterstützung benötigt), wird dies nicht für Sie funktionieren. Um festzustellen, ob das funktioniert, ist es entweder Versuch und Irrtum, oder Sie müssen den Entwickler der COM-DLL fragen.
  • Registration-free COM - Dies ist, wie es in .NET getan wird. Ich bin mir nicht sicher, ob Sie in Python so etwas leicht machen können.
  • CoRegisterClassObject - Wenn Sie Ihre eigene Registrierung-freie COM-Implementierung erstellen, wird diese Funktion kritisch sein. Ich glaube, dass dies ein grundlegendes Implementierungsdetail für die registrierungsfreie COM von Microsoft ist. Beachten Sie jedoch, dass dies eine sehr herausfordernde Sache zu tun wäre, und es würde ein sehr gutes Verständnis von COM erfordern.
  • Können Sie eine COM-DLL aus Ihrem Programm registrieren?

    Ja. Es gibt ein paar Möglichkeiten. Hier stoßen Sie jedoch wahrscheinlich auf Sicherheitsprobleme. In der Regel registrieren sich COM-Komponenten in HKEY_LOCAL_MACHINE und Sie benötigen normalerweise Administratorrechte, um hier zu schreiben. Einige COM-Komponenten/Installer sind so konzipiert, dass sie sich in HKEY_CURRENT_USER registrieren, was die Sicherheitssache umgehen würde. Sie haben jedoch möglicherweise keine Kontrolle darüber, wo sich eine Komponente selbst registriert, und selbst wenn Sie dies tun, ist die Registrierung in HKEY_CURRENT_USER keine perfekte Lösung.

    • regsvr32.exe - Eine Option ist programmatisch regsvr32.exe auf der DLL aufzurufen.
    • DllRegisterServer oder DllInstall - Wenn eine COM DLL mit regsvr32.exe registriert werden kann, dann hat mindestens eine dieser Funktionen exportiert. Sie können die DLL manuell laden und diese Funktionen wie regsvr32.exe aufrufen. DllInstall ist weniger verbreitet als DllRegisterServer. Wenn DllInstall vorhanden ist, können Sie möglicherweise die Option HKEY_CURRENT_USER installieren. Wenn nicht, müssen Sie einfach tun, was auch immer DllRegisterServer tut, da es keine Optionen gibt, die Sie für diese Funktion bereitstellen können.
    • Schreiben Sie die Registrierungswerte selbst - Wenn Sie alle erforderlichen Registrierungseinstellungen herausfinden können, hält Sie nichts davon ab, sie manuell in die Registrierung einzutragen. Dies würde um das HKEY_LOCAL_MACHINE/HKEY_CURRENT_USER Problem gehen - Sie können sie schreiben, wo immer Sie möchten (aber HKEY_LOCAL_MACHINE benötigt immer noch wahrscheinlich Admin-Rechte).
    • regedit.exe - Eine andere Möglichkeit, die Registrierungswerte selbst zu schreiben, ist sie in einer .reg Datei zu speichern und regedit.exe aufzurufen, um sie zusammenzuführen.

    Wie bestimmen Sie die Abhängigkeiten einer DLL?

    Idealerweise weiß der Entwickler dieser DLL und kann es Ihnen sagen. Das ist die einzige Möglichkeit, die wirklich narrensicher ist.

  • Für COM-Abhängigkeiten kann es unmöglich sein, dies anders herauszufinden, als den Entwickler oder Trial-and-Error zu fragen. Das liegt daran, dass eine COM-Abhängigkeit existieren kann, weil ein Code in der DLL nur CoCreateInstance aufruft, um ein COM-Objekt eines Drittanbieters zu erstellen, und da dies nur im Quellcode ausgedrückt wird, gibt es keine Metadaten für die DLL Sie finden diese Abhängigkeiten.
  • Das obige gilt auch für alle dynamisch geladenen Abhängigkeiten. Wenn beispielsweise ein Code gerade LoadLibrary direkt aufruft, gibt es keine Möglichkeit, die Abhängigkeit von außen zu bestimmen. Für statisch geladene Abhängigkeiten können Sie Tools wie Dependency Walker verwenden. Beachten Sie, dass viele der Abhängigkeiten, die Sie sehen werden, Systemabhängigkeiten sind - Sie möchten z. B. user32.dll und kernel32.dll nicht einschließen, da diese mit Windows installiert sind.

Wie installieren Sie Abhängigkeiten von Drittanbietern?

Wenn Sie genau wissen, welche Dateien geschrieben werden sollen, wo sie zu schreiben sind und welche Registrierungseinstellungen (usw.) angewendet werden müssen, können Sie all dies selbst tun. Bei einigen Abhängigkeiten kann es einfacher sein, das Installationsprogramm eines Drittanbieters in Ihr Installationsprogramm aufzunehmen und es einfach im Hintergrund auszuführen. Viele Installationsprogramme unterstützen aus diesem Grund einen unbeaufsichtigten Modus. Ein gutes Beispiel hierfür ist die Visual C++ - Laufzeit (msvcrt * .dll) - viele Anwendungen benötigen diese Abhängigkeit, und viele Installationsprogramme enthalten nur das Installationsprogramm von Microsoft als Teil ihrer Distribution, und das primäre Installationsprogramm ruft die sekundären Installationsprogramme einfach auf.

Verwandte Themen