none
Isolated COM Problem RRS feed

  • Frage

  • Hi,

    ich versuche gerade mein ActiveX Objekt (dll) mit einem Setup  bereitzustellen. Dazu möchte ich, dass die Installation ohne Administrator-Rechte möglich ist. Nach einigem Herum-googlen meine ich, dass Isolated COM dafür gemacht wurde (bitte korrigiert mich hier, falls das nicht stimmt). Jedoch fehlen mir dazu noch Teile um zu verstehen wie das funktioniert. Meine derzeitigen Projekteigenschaften sehen wie folgt aus:

    - Manifest Tool
      - General
        - Suppress Startup Banner: Yes
        - Verbose Output: Yes
      - Input and Output
        - Embed Manifest: Yes
        - Generate Catalog Files: No
        - Enable DPI Awareness: No
      - Isolated COM
        - Type Library File: "path to my library .tlb file"
        - Registrar Script File: "path to my .rgs file"
        - Component Filename: MyApp.dll 
    - Linker
      - General
        - Register Output: No
        - Per-user Redirection: Yes
      - Manifest File
        - Generate Manifest: Yes
        - Allow Isolation: Yes
        - Enable User-account-control: No
        - UAC execution level: asInvoker
        - UAC Bypass UI Protection: No

    Meine (selbst gemachte) *.rgs Datei sieht wie folgt aus:

    HKEY_CURRENT_USER
    {
      'Software'
      {
        'Mircosoft'
        {
          'Windows'
          {
            'CurrentVersion'
            {
              'Ext'
              {
                'Stats'
                {
                  '{227C53AE-4140-4FE0-9F7A-D4B028D48B51}'
                  {
                    'iexplore'
                    {
                      'AllowedDomains'
                      {
                        '*'
                      }
                      val 'Count' = d '2'
                      val 'Flags' = d '4'
                      val 'Type' = d '1'
                      val 'Time' = b 'D807010002000F00120031001C004E03'
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    Das sind die Registry Einträge die ich normalerweise bei der Installation setzen würde um das ActiveX Objekt auf Websites ausführen zu können. Was fehlt mir jetzt noch bzw.: das manifest file wird ja wie ich das verstehe automatisch beim Build eingebunden in die dll. Jetzt fehlt mir aber irgendwie die Verbindung was ich noch tun muss um das zum laufen zu bringen, bzw. wie es funktionieren würde.

    Vielen Dank für jede Hilfe! :)

    Mario M

    • Typ geändert Falarys Dienstag, 1. März 2011 15:19 Isolated COM ist möglicherweise nicht nötig für das Erreichen des Ziels.
    • Typ geändert Robert BreitenhoferModerator Mittwoch, 9. März 2011 11:15 Frage
    Dienstag, 22. Februar 2011 10:43

Antworten

  • Isolated COM geht nur für eigene Applikationen; oder nur eingeschrängt für externe Applikationen die kein eingebettes Manifest haben.

    Für IE also nicht anwendbar.


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 23. Februar 2011 07:39
  • > Der Vorgang der anscheinend Admin-Rechte benötigt ist das "DllRegisterServer " der dll. Dies macht auch erst möglich dass Internet Explorer die dll lädt. So wie ich das jetzt sehe, liegt genau bei diesem "DllRegisterServer " der kritische Punkt: Wie kann die gleiche Funktionalität wie bei DllRegisterServer bereitgestellt werden oder DllRegisterServer so "geändert" werden, dass keine Admin Rechte benötigt werden? Da komme ich irgendwie nicht wirklich weiter...

    Aber wenn Du die Registry Einträge erzeugt hast benötigst Du DllRegisterServer doch gar nicht mehr!

    Ich verstehe nicht warum Du das doppelt machst...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 23. Februar 2011 11:20
    Moderator
  • Tut mir Leid für die kleine Verspätung meiner Antwort.

    Das Isolated COM brauche ich tatsächlich nicht. Habe herausgefunden, dass zusätzlich zu den Internet Explorer Rechten die ich bereits geschrieben habe auch ein Eintrag unter HKCU\Software\Classes\Wow6432Node\CLSID\ gemacht werden muss, in dem man den Key InprocServer mit dem Pfad der dll angibt. Dadurch kann das Objekt gefunden werden und wird angezeigt.

    Vielen Dank für eure Hilfe! Ohne wäre ich wahrscheinlich nie auf einen grünen Zweig gekommen mit diesem Isolated COM (das ich ja jetzt gar nicht benötige)! :)

    Dienstag, 1. März 2011 12:06

Alle Antworten

  • 1. Geht das IMHO nur, wenn die EXE, die dieses Moduel benutzt ein Assembly Manifest hat! <dependency>  <dependentAssembly> <assemblyIdentity name="..." ...  </dependentAssembly> </dependency>
    2. Dein Assembly muss selbst wieder ein Manifest haben in dem der Name des Modules <file name="..."> und die entsprechenden COM Klassen drin stehen    <comClass clsid="{DA...-....}" threadingModel="Apartment" progid="..." /> etc.

    Ich mache das selbst und schreibe die Manifeste per Hand.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 22. Februar 2011 11:07
    Moderator
  • Danke für deine schnelle Antwort! :)

    1. Geht das IMHO nur, wenn die EXE, die dieses Moduel benutzt ein Assembly Manifest hat! <dependency>  <dependentAssembly> <assemblyIdentity name="..." ...  </dependentAssembly> </dependency>

    Die EXE die das Modul benutzt wäre in diesem Fall denke ich der Internet Explorer. Die dll soll in einer Website über den <object> tag und der CLSID der dll geladen werden. Dazu lege ich in der Registry normalerweise folgenden Key an:

    Software\Microsoft\Windows\CurrentVersion\Ext\Stats\{UUID}\iexplore

    Wobei {UUID} die CLSID der dll control ist.

    Ist es dann überhaupt möglich über Isolated COM zu erreichen, dass ich ich keine Administrator-Rechte bei der Installation/Registrierung der dll benötige? (Für die Nutzung im Internet Explorer). Und falls nicht, gibt es noch andere Möglichkeiten das zu erreichen?

    Dienstag, 22. Februar 2011 13:20
  • Das ist eine andere Anwendung als ich es mache und benötige.

    Lies die mal das durch. Hier geht es eher um das Deplayoing:
    http://msdn.microsoft.com/en-us/library/ms165432(VS.80).aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 22. Februar 2011 14:47
    Moderator
  • Hi, danke für den link!

    So wie ich das verstehe wird dabei aber nur von einer selbst implementierten Applikation gesprochen, die dann ein eigenes COM Objekt in den "References" hinzufügt. Aber ich bräuchte das glaube ich für Internet Explorer, da dieser, wenn er das <object> Tag sieht, das COM Objekt laden soll.

    Mittwoch, 23. Februar 2011 07:35
  • Isolated COM geht nur für eigene Applikationen; oder nur eingeschrängt für externe Applikationen die kein eingebettes Manifest haben.

    Für IE also nicht anwendbar.


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 23. Februar 2011 07:39
  • Hm, dann muss irgendwie ein anderer Weg existieren um Internet Explorer Addons (dlls) ohne Administrator Rechte installieren zu können. Andere Anwendungen tun dies ja auch, und ich finde irgendwie nicht heraus, wie das gemacht wird :(
    Mittwoch, 23. Februar 2011 08:31
  • Vermutlich unter HKCU und nicht HKLM...


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 23. Februar 2011 10:15
  • Ich schreibe jetzt in meinem Setup.msi beim Ausführen in die Registry unter HKCU rein, dass Internet Explorer das Objekt laden darf. So wie ich das verstanden habe, ist das genau das was ich oben im *.rgs File mache. (das ich jetzt nicht mehr verwende, aber das sind die Keys die WIX setzt).

    Der Vorgang der anscheinend Admin-Rechte benötigt ist das "DllRegisterServer " der dll. Dies macht auch erst möglich dass Internet Explorer die dll lädt. So wie ich das jetzt sehe, liegt genau bei diesem "DllRegisterServer " der kritische Punkt: Wie kann die gleiche Funktionalität wie bei DllRegisterServer bereitgestellt werden oder DllRegisterServer so "geändert" werden, dass keine Admin Rechte benötigt werden? Da komme ich irgendwie nicht wirklich weiter...

    Mittwoch, 23. Februar 2011 11:01
  • > Der Vorgang der anscheinend Admin-Rechte benötigt ist das "DllRegisterServer " der dll. Dies macht auch erst möglich dass Internet Explorer die dll lädt. So wie ich das jetzt sehe, liegt genau bei diesem "DllRegisterServer " der kritische Punkt: Wie kann die gleiche Funktionalität wie bei DllRegisterServer bereitgestellt werden oder DllRegisterServer so "geändert" werden, dass keine Admin Rechte benötigt werden? Da komme ich irgendwie nicht wirklich weiter...

    Aber wenn Du die Registry Einträge erzeugt hast benötigst Du DllRegisterServer doch gar nicht mehr!

    Ich verstehe nicht warum Du das doppelt machst...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 23. Februar 2011 11:20
    Moderator
  • Oh, dann mache ich anscheinend nicht alle benötigten Registry Einträge. Ich schau nochmal durch die Registry was ich finde was erzeugt wird von DllRegisterServer.
    Mittwoch, 23. Februar 2011 12:06
  • Tut mir Leid für die kleine Verspätung meiner Antwort.

    Das Isolated COM brauche ich tatsächlich nicht. Habe herausgefunden, dass zusätzlich zu den Internet Explorer Rechten die ich bereits geschrieben habe auch ein Eintrag unter HKCU\Software\Classes\Wow6432Node\CLSID\ gemacht werden muss, in dem man den Key InprocServer mit dem Pfad der dll angibt. Dadurch kann das Objekt gefunden werden und wird angezeigt.

    Vielen Dank für eure Hilfe! Ohne wäre ich wahrscheinlich nie auf einen grünen Zweig gekommen mit diesem Isolated COM (das ich ja jetzt gar nicht benötige)! :)

    Dienstag, 1. März 2011 12:06
  • Hm, wie es scheint kann ich wenn das Objekt unter HKCU registriert wird keine Methoden des Objekts über Javascript aufrufen. Bei Benutzung von regsvr32.exe jedoch schon (selbe Webseite mit selben Javascript Code)...
    Dienstag, 1. März 2011 14:44
  • Hi,

    habe mich noch etwas mit Registry Einträgen gespielt und bei anderen Plugins recherchiert bzw. ihre Einträge in der Registry versucht zu finden. Nun funktioniert auch das Aufrufen von Methoden des ActiveX Objekts mit Javascript. Ausschlaggebend war denke ich ein zusätzlicher Eintrag im Key "HKCU\Software\Mircosoft\Internet Explorer\InternetRegistry\REGISTRY\USERS\SID\Software\". Zusätzlich habe ich auch noch einen Eintrag meiner dll unter "HKCU\Software\Classes\" und "HKCU\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\" mit der CLSID meiner dll gemacht. Ich weiß also nicht sicher ob beides unbedingt benötigt wird.

    lg

    Mario M

    Mittwoch, 2. März 2011 10:33