AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Nicht installierte ActiveX-DLL in Delphi7 verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht installierte ActiveX-DLL in Delphi7 verwenden

Ein Thema von Sherlock · begonnen am 26. Feb 2007 · letzter Beitrag vom 16. Apr 2007
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#1

Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 12:52
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:
.
.
.
  MyDLLHandle := LoadLibrary('dsofile.dll');
  if MyDLLHandle <> 0 then
  begin
    try
      FInitDLL := nil;
      FInitDLL := GetProcAddress(MyDLLHandle, 'InitDLL');
.
.
.
Danke im Voraus,

Sherlock
Oliver
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 13:53
Zitat von Sherlock:
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...
Ich halte diese Idee um Arbeit zu sparen für sehr schlecht.
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 14:06
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 14:14
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 14:27
Zitat von Sherlock:
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.
Also hat der Auftraggeber 0 Ahnung von ActiveX und du sollst etwas unmögliches registrieren?

Zitat von Sherlock:
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?
Jein. Nur mit "SidebySide"-Registrierung und unter den unterstützten Betriebssystemen. Wenns NT ist hast du keine Möglichkeiten. Und vor allem was machst Du wenn deine Anwendung abstürzt? Dann ist nichts mehr mit entregistrieren.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 26. Feb 2007, 14:52
Gut, dann muß sich der Auftraggeber damit abfinden, daß man so Schweinkram nicht macht.



Vielen Dank, Jungs.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 27. Feb 2007, 14:45
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:
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;
}
Ein trauriger Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Skasch
Skasch

Registriert seit: 14. Nov 2005
4 Beiträge
 
#8

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 16. Mär 2007, 12:08
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:
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;
Dann geht alles, als ob es mit regsvr32 Registriert währe...

Greetings

O.

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Nicht installierte ActiveX-DLL in Delphi7 verwenden

  Alt 16. Apr 2007, 08:14
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:
http://msdn.microsoft.com/msdnmag/is...M/default.aspx

Sherlock
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz