![]() |
Nicht installierte ActiveX-DLL in Delphi7 verwenden
Ich versuche auf ein ActiveX Objekt zuzugreifen, welches nicht im System registriert ist. Zur Zeit experimentiere ich mit einer DLL (dsofile.dll von Microsoft), aber zukünftig könnten auch OCX betroffen sein. Hintergrund ist einfach der, daß ich ActiveX-Controls verwenden möchte, die nicht installiert werden sollen, um den Installationsaufwand auf bloßes Kopieren zu beschränken...
Bisher hab ich probiert vorzugehen wie bei einer gewöhnlichen DLL. Sprich ich habe eine TLB aus der DLL erzeugt, aber bei der ActiveX-DLL ist alles über GUIDs geregelt, es gibt keine Referenz auf die DLL an sich. Mit LoadLibrary komm ich da auch nicht weit. Denn in der TLB werden interfaces und dispinterfaces deklariert, die über die GUID in der Registry nach der DLL suchen. -.- Wie biege ich nun alles so hin, daß ich zum Beispiel mit so einer Struktur zurechtkomme:
Delphi-Quellcode:
Danke im Voraus,
.
. . MyDLLHandle := LoadLibrary('dsofile.dll'); if MyDLLHandle <> 0 then begin try FInitDLL := nil; FInitDLL := GetProcAddress(MyDLLHandle, 'InitDLL'); . . . Sherlock |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Zitat:
Der Aufwand, die Registrierung von ActiveX DLLs zu umgehen steht in keinem Verhältnis zu den Schwierigkeiten, die du dir einhandelst. Ich möchte hier nicht zu hart urteilen, aber es ist 'ne Schnappsidee. Stattdessen würde ich mich auf das vereinfachte Registrieren konzentrieren. Es gibt 2 Möglichkeiten: 1.) beim Programmstart die DLL selbst registrieren DLL mit LoadLibrary laden und dann DllRegisterServer aufrufen. 2.) Einem Installer mitteilen, dass er die DLLs automatisch registrieren soll. Dazu muss die DLL eine Versioninfo Resource haben. Innerhalb der Versioninfo muss ein Key mit dem Wert OLESelfRegister (Inhalt dazu ist leer) stehen. Sobald der Installer diesen Key entdeckt registriert er die DLL automatisch. |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Es gibt die möglichkeit der "SidebySide" Registrierung (AFAIK ab 2000 oder XP) womit man ActiveX-Control userspezifisch Registriern kann und damit auch ohne Admin-Rechte auskommt.
|
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Ihr habt ja Recht... nur soll ich eine Applikation schreiben, die mit nicht registrierten ActiveXen auskommen soll, da der Auftraggeber es so will. Die Begründung hab ich mir aus seinen Aussagen dazu zusammengereimt. Also registrieren ist leider nicht.
Besteht die Möglichkeit die ActiveX Komponente zum Programmstart zu registrieren und am Ende wieder zu entregistrieren? Somit könnte ich die prophezeiten Schwiergkeiten umgehen, oder? Sherlock |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Zitat:
Zitat:
|
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Gut, dann muß sich der Auftraggeber damit abfinden, daß man so Schweinkram nicht macht.
:) Vielen Dank, Jungs. Sherlock |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Sry 4 Doppelpost und auch für mein Insistieren....aaaaber hier mal ein c++ Codeschnipsel, wie die es bisher gemacht haben, das sollte doch auch in Delphi gehen. Grund: Benutzerrichtlinien in Domänen können angeblich auch SidebySide verbieten. Weshalb es so gelöst werden soll. -.-
Code:
Ein trauriger Sherlock
HRESULT CNxOCXControlSite::CreateInstanceLic( CNxOCXControl* pWndCtrl, REFCLSID clsid, LPUNKNOWN pUnkOuter, DWORD dwClsCtx, REFIID iid, LPVOID* ppv, BSTR bstrLicKey )
{ //-- Do you specified the correct ocx-Control Library in CNxOCXControl::CreateControl ? ASSERT( pWndCtrl!=NULL && pWndCtrl->m_hInstLibrary!=NULL ); if ( pWndCtrl==NULL || pWndCtrl->m_hInstLibrary==NULL ) return CO_E_ERRORINDLL; DLLGETCLASSOBJECTFUNC pDllGetClassObject = (DLLGETCLASSOBJECTFUNC)::GetProcAddress( pWndCtrl->m_hInstLibrary, _T("DllGetClassObject") ); if ( pDllGetClassObject==NULL ) return CO_E_ERRORINDLL; HRESULT hr; if ( bstrLicKey == NULL ) { LPCLASSFACTORY pClassFactory = NULL; hr = pDllGetClassObject( clsid, IID_IClassFactory, (void**)&pClassFactory ); if ( SUCCEEDED(hr) ) { hr = pClassFactory->CreateInstance(pUnkOuter, iid, ppv); pClassFactory->Release(); } } else { LPCLASSFACTORY2 pClassFactory = NULL; hr = pDllGetClassObject( clsid, IID_IClassFactory2, (void**)&pClassFactory ); if ( SUCCEEDED(hr) ) { hr = pClassFactory->CreateInstanceLic(pUnkOuter, NULL, iid, bstrLicKey, ppv ); pClassFactory->Release(); } } return hr; } |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Hi Sherlock,
Vielleicht kommt meine Reaktion zu spät, aber falls es Dich noch interessiert hier die Lösung deines Problems. Für unsere eigene AX Komponente benutze ich eine temporäre Online-Registrierung um das regsvr32 getue zu umgehen. Das ganze sieht wie folgt aus:
Delphi-Quellcode:
Dann geht alles, als ob es mit regsvr32 Registriert währe...
function DllOnlineRegister(const CLSID, IID: TGUID;out dwCookie:longint):HRESULT; stdcall;
var pFact: IClassFactory; begin result := DllGetClassObject(CLSID, IID, pFact); if bool(pFact) then result := CoRegisterClassObject(CLSID, pFact, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, dwCookie); end; function DllOnlineUnregister(const dwCookie:longint):HRESULT; stdcall; begin // Unregister the object initialized with CoRegisterClassObject result := CoRevokeClassObject(dwCookie); end; Die beiden Prozeduren füge ich der OCX Signatur zu und rufe Sie dann aus der Applikation folgendermassen auf: type TFormWhatever = class(..) private fdwClsCookie: longint; . . . end; TFormWhatever.FormCreate(..) begin if (DllOnlineRegister(CLASS_ActiveXForm, IClassFactory, fdwClsCookie) = S_OK) then begin fTable := TActiveXForm.Create(self); fTable.Parent := self; fTable.Align := alClient; end; //oder //CoCreateInstance(CLASS_ActiveXForm, nil, // CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IOleObject, // FOleObject); //FOleObject.Parent := self; end; TFormWhatever.FormDestroy(..) begin // Unregister the object initialized with CoRegisterClassObject if bool(fdwClsCookie) then ROTable_Interface.DllOnlineUnRegister(fdwClsCookie); end; Greetings O. [edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit] |
Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden
Danke Skasch,
das könnte wirklich helfen, wenn es nur um eigenen ActiveXe ginge, aber leider sollen auch fremde (zB. gekaufte) auf diese Art verwendet werden können. Und die kann ich ja nicht um die nötigen Routinen ergänzen. :( Edit: Hier aber mal wirklich eine gute Lösung: ![]() Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz