Frage

Eine Anwendung ich Arbeit vor kurzem begonnen haben, auf zwei DLL registrieren, „wegen ActiveX“.

Dies macht es schwierig, mehrere Version der Anwendung, die auf Ihrem Computer zu haben - sagt die installierte Produktversion und Debug und Release-Versionen der neuesten Entwicklungs Quellen.

Was sind die Alternativen zur Registrierung für ActiveX.

War es hilfreich?

Lösung

Wenn Ihre Anwendung die ActiveX-Objekte geladen wird, gibt es ein paar Optionen. Die erste Option, wenn Sie XP oder neuer verwenden, um ein Registration-Free COM mit einer Manifest-Datei zu verwenden, wie auf MSDN . Die Idee ist, COM (ActiveX) Komponenten in einer Manifest-Datei anstelle der Registrierung zu erklären. Also für MyApp.exe erstellen MyApp.exe.manifest mit dem folgenden (mit Ihrem DLL Dateinamen und CLSID):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="MyApp_ActiveX" version="1.0.0.1" 
        processorArchitecture="x86" publicKeyToken="0000000000000000" />

  <file name="MyActiveX.dll">
    <comClass clsid="{0000000-0000-0000-0000-000000000000}" threadingModel="Both" />
  </file>
</assembly>

Die andere Option als DougN erwähnt ist Ihre eigene CoCreateInstance () zu rollen, um das Objekt zu erstellen. Der folgende C ++ (plus ATL) Code sollte es tun (aus dem Gedächtnis gehen, den Code so überprüfen Sie):

typedef int (__stdcall *LPDLLGETCLASSOBJECT)(REFCLSID, REFIID, void**);

// LoadInterface() - Load COM Interface from DLL without using registry.
//
// USAGE:   
//   HMODULE hModule = 0;
//   CComPtr<IMyActiveX> pActiveX;
//   if(SUCCEEDED(LoadInterface("C:\\Debug\\MyActiveX.dll", CLSID_MyActiveX, IID_IMyActiveX, (void**)&pActiveX, &hModule)))
//   {
//      // TODO: use pActiveX
// 
//      // caller must call FreeLibrary(hModule) when done
//      pActiveX = 0;
//      FreeLibrary(hModule); 
//   }
//
HRESULT LoadInterface(LPCTSTR pDllPath, REFCLSID rClsid, REFIID riid, LPVOID* ppv, HMODULE *pModule)
{
    if(pModule == 0 || ppv == 0) return E_POINTER;
    HMODULE hModule = LoadLibrary(pDllPath);
    if(hModule == 0) return E_FAIL;

    HREUSLT hr = E_POINTER;
    CComPtr<IClassFactory> classFactory;
    LPDLLGETCLASSOBJECT pGetClassObject = (LPDLLGETCLASSOBJECT)GetProcAddress(hModule, "DllGetClassObject");
    if(pGetClassObject)
    {
        hr = pGetClassObject(rClsid, IID_IClassFactory, (void**)&classFactory);
        if(SUCCEEDED(hr))
        {
            hr = classFactory->CreateInstance(0, riid, (void**)ppv);
            if(SUCCEEDED(hr))
            {
                *pModule = hModule;
                return S_OK;
            }
        }
    }

    // unload library on error
    if(hModule)  
    {
        FreeLibrary(hModule);
    }
    return hr;
 }

Andere Tipps

Keine, die ich mir vorstellen kann. Das ist die ganze Logik hinter COM (also ActiveX).

Wenn Sie den Code steuern, die das ActiveX-Steuerelement lädt, und niemand sonst muss es laden, könnten Sie die Registrierung überspringen und manuell bearbeiten Ihre eigene CreateInstance aufruft: Loadlibrary, einen Zeiger auf das Factory-Objekt bekommen, und erstellen Sie direkt Instanzen.

Hat das an einem Projekt vor etwa 10 Jahren und es hat super funktioniert.

Wenn Sie jedoch kann das nicht tun (vielleicht steuern Sie den Code nicht aufrufen CreateInstance), dann nur zwei Batch-Dateien erstellen und sie auf Ihren Schreibtisch: Ein Debug zu registrieren, und eine in der Release-DLLs registrieren . Hin-und Herschalten wird dann recht einfach.

Sie können Version ActiveX-Steuerelemente mithilfe der ProgID .

Das glaube ich nicht die .bat Lösung unbedingt schrecklich. Die meisten einfachen ActiveX-Steuerelemente sind selbst Registrierung / Aufheben der Registrierung. Aber es schränkt Sie noch entweder eine Debug-Version oder eine Release-Version zu einem Zeitpunkt, nicht beide gleichzeitig ausgeführt wird.

Es ist ein großes Problem (es ist das Wesen des „DLL Hell“), und ein großer Teil des Grundes für die Popularität von .NET und Java.

Ich glaube, .NET Vorteil nimmt Side-by-Side-Sharing, ein Feature eingeführt mit Windows 2000 und Windows 98 SE. Ich glaube nicht, dass Sie .NET brauchen, es zu benutzen (Sie hat nicht gesagt, Sie COM-Interop taten).

Es gibt einen etwas längeren Artikel auf MSDN unter http://msdn.microsoft .com / en-us / library / ms811700.aspx , "die Implementierung von Side-by-Side gemeinsamer Nutzung von Komponenten in Anwendungen", die eine .local-Datei schlägt zu schaffen. Ich bin mir nicht ganz klar, wie das funktioniert, aber ich denke, das ist der richtige Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top