Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL über API registrieren (https://www.delphipraxis.net/150649-dll-ueber-api-registrieren.html)

Alois 22. Apr 2010 20:25


DLL über API registrieren
 
Man kann ja per Hand über Windows regsvr32.exe oder mit Hilfe einer API Funktion eine DLL im System registrieren.

siehe auch das Tutorial von Michael Puff: http://www.michael-puff.de/Developer...Tutorials/COM/

Wenn ich das per Hand mache bleibt die DLL solange registriert (regsvr32 COM_Test.dll) bis ich sie wieder mit Unregister (regsvr32 \u COM_Test.dll) aus dem System entferne.
Ich möchte das nun über mein Programm erledigen d.h. beim Programmstart die DLL registrieren und beim Programmende die DLL un-registrieren.

Was aber passiert bei einem Programmabsturz in der die API-Unregsiter-Funktion nicht ausgeführt wurde?
Bleibt die Registrierung im System erhalten?
Was geschieht wenn ich eine DLL registriere die vorher schon registriert war? Geht das überhaupt... oder ist es gar problematisch ein und dieselbe DLL mehrfach zu registrieren?

Ich weiss es sind viele Fragen aber ich hoffe einer von euch kann mir hier weiterhelfen.
Vielen Dank im vorraus für eure Hilfe.

Gruss Alois ;)

Luckie 22. Apr 2010 21:19

Re: DLL über API registrieren
 
Zitat:

Zitat von Alois
Was aber passiert bei einem Programmabsturz in der die API-Unregsiter-Funktion nicht ausgeführt wurde?
Bleibt die Registrierung im System erhalten?

Einfach mal nachdenken. Sie wird registriert, aber wegen eines Programmabsturzes nicht mehr deregistriert. In was für einem Zusatnd befindet sich sich dann wohl?

Zitat:

Was geschieht wenn ich eine DLL registriere die vorher schon registriert war? Geht das überhaupt... oder ist es gar problematisch ein und dieselbe DLL mehrfach zu registrieren?
Probiere es aus.

himitsu 22. Apr 2010 21:22

Re: DLL über API registrieren
 
Und falls sich keine Registrieren-API finden ließe, dann könnte man immernoch MSDN-Library durchsuchenShellExecute oder MSDN-Library durchsuchenCreateProcess verwenden. :stupid:

Astat 23. Apr 2010 13:52

Re: DLL über API registrieren
 
Zitat:

Zitat von Alois
Ich möchte das nun über mein Programm erledigen d.h. beim Programmstart die DLL registrieren und beim Programmende die DLL un-registrieren.

Hallo Alois, anbei mein "Allesregistrierer".

Als eigenständiges Programm desshalb, weil bei Ladefehler in der Externen Library, sonst auch das
Eigene Programm abstürzen würde. Ich verwende das Teil um aus einer Menge von Dateien, automatisch
diejenigen zu registrieren, die die Exportfunktion DllRegister Server zur Verfügung stellen.
Regsvr32, machen VC5 + VC8 DLL's, bei denen Depenencies nicht aufgelöst werden können, Probleme
(Absturz AV's VC Runtimemeldungen des Systems, usw.
Desshalb dieses Programm.

Verwendung:
laregsvr.exe c:\dlltoregister.dll DllRegisterServer

lg. Astat

Delphi-Quellcode:

program laregsvr;

  {$APPTYPE CONSOLE}

uses
  windows,
  ActiveX,
  SysUtils;

const
  EXIT_ENTRY_NOT_FOUND     = 4000;
  EXIT_FUNCTION_CALL_ERROR = 6000;
  EXIT_LOAD_LYBRARY_FAILED = 8000;
  EXIT_UNEXPECTED_EXCEPTION = 10000;

var
  _hDll: THandle = 0;

type
  TRegProc = function: HRESULT; stdcall;

function SecureSafeLoadLibrary(const Filename: String; ErrorMode: UINT): HMODULE;
var
  SaveErrorMode: UINT;
  SaveFPUControlWord: Word;
begin
  SaveErrorMode := SetErrorMode(ErrorMode);
  try
    asm FNSTCW SaveFPUControlWord end;
    try
      Result := LoadLibrary(PChar(Filename));
    finally
      asm
        FNCLEX
        FLDCW SaveFPUControlWord
      end;
    end;
  finally
    SetErrorMode(SaveErrorMode);
  end;
end;

procedure Finnalize(AExitCode: integer; ALibHandle: THandle; const AMsg: string);
begin
  if ALibHandle <> 0 then begin
    FreeLibrary(_hDll);
    _hDll := 0;
  end;
  CharToOEM(PChar(AMsg), PChar(AMsg));
  Writeln(AMsg);
  if AExitCode > 0 then
    Halt(AExitCode);
end;


procedure RegisterAxLib(const FileName: string; RegAction: string);
var
  RegProc: TRegProc;
  ret: integer;
begin
  try
    _hDll := SecureSafeLoadLibrary(FileName, SEM_FAILCRITICALERRORS or
      SEM_NOGPFAULTERRORBOX or SEM_NOALIGNMENTFAULTEXCEPT or
      SEM_NOOPENFILEERRORBOX);

    if _hDll <> 0 then begin
      RegProc := GetProcAddress(_hDll, PChar(RegAction));
      if @RegProc = nil then begin
        Finnalize(EXIT_ENTRY_NOT_FOUND, _hDll, 'ERROR: Entrypoint ' +
          RegAction + ' ] not found.' + #13#10 + '   ' +
              SysErrorMessage(GetLastError) + #13#10);
      end else begin
        ret := RegProc;
        if ret <> 0 then begin
          Finnalize(EXIT_FUNCTION_CALL_ERROR, _hDll, 'ERROR Call to [ ' +
            FileName + ' ] Failed ' + #13#10 + '   ' + 'Retcode: ' +
              IntToStr(ret) + #13#10 + SysErrorMessage(GetLastError) + #13#10);
        end;
      end;
    end else begin
      Finnalize(EXIT_LOAD_LYBRARY_FAILED, _hDll, 'ERROR LoadLibrary: ' +
        #13#10 + '   ' + SysErrorMessage(GetLastError) + #13#10);
    end;
  except
    on e:exception do begin
      Finnalize(EXIT_UNEXPECTED_EXCEPTION, _hDll, 'EXCEPTION: RegisterAxLib: ' +
        #13#10 + '   ' + SysErrorMessage(GetLastError) + #13#10 +
          e.message + #13#10);
    end;
  end;
end;

begin
  Coinitialize(nil);

  writeln('Set Current Directory: ' + #13#10 + '   ' +
      ExtractFilePath(ParamStr(1)));

  if not SetCurrentDirectory(PChar(ExtractFilePath(ParamStr(1)))) then begin
    writeln('ERROR: Set Current Directory: ' + #13#10 + '   ' +
        ExtractFilePath(ParamStr(1)));
  end;

  writeln('RegisterAxLib: ' + #13#10 + '   ' +
      ParamStr(1) + ' ' + ParamStr(2));

  RegisterAxLib(Trim(ParamStr(1)), Trim(ParamStr(2)));

  writeln('SUCCESS: RegisterAxLib: ' + #13#10 + '   ' +
      ParamStr(1) + ' ' + ParamStr(2) + #13#10);

  CoUninitialize;  
end.

Alois 26. Apr 2010 21:27

Re: DLL über API registrieren
 
Zitat:

Zitat von Luckie
Einfach mal nachdenken. Sie wird registriert, aber wegen eines Programmabsturzes nicht mehr deregistriert. In was für einem Zusatnd befindet sich sich dann wohl?

Sie bleibt registriert.

Nun habe ich aber das Problem das mein Programm zum registrieren des COM–Server mittels API–Funktionen Admin-Rechte benötigt.
Kann man das irgendwie beeinflussen?

a.) Es kommt eine Aufforderung das erhöhte Rechte notwendig sind.
b.) Die Registrierung des COM-Server funktioniert auch mit normalen Benutzerrechten.

Möglichkeit b.) wäre mir am liebsten.

Gruss Alois

Luckie 27. Apr 2010 09:19

Re: DLL über API registrieren
 
Zitat:

Zitat von Alois
b.) Die Registrierung des COM-Server funktioniert auch mit normalen Benutzerrechten.

Das wäre mir neu.

DeddyH 27. Apr 2010 09:21

Re: DLL über API registrieren
 
Das war ja anscheinend auch keine Tatsachenfeststellung, sondern ein Wunsch :zwinker:

Sherlock 27. Apr 2010 09:46

Re: DLL über API registrieren
 
Und wegen a) macht man sowas ja auch nicht, daß man ständig registiert und deregistriert. Wozu auch? Wenn Du einen COM-Server lieferst, liefer auch einen Installer, oder zumindest eine Batch-Datei, die die Installation durchführt.

Sherlock

Luckie 27. Apr 2010 10:11

Re: DLL über API registrieren
 
Zitat:

Zitat von DeddyH
Das war ja anscheinend auch keine Tatsachenfeststellung, sondern ein Wunsch :zwinker:

Ach so. Das muss man aber auch dazu sagen. :roll:

Zum registrieren eines COM-Servers werden immer Administratorenrechte benötigt. Diese kann man mit einem entsprechendem Manifest anfordern.

Gibt es einen Grund, warum du den COM-Server jedes mal registrieren und de-registrieren willst?

Alois 27. Apr 2010 15:24

Re: DLL über API registrieren
 
Zitat:

Zitat von Luckie
Zum registrieren eines COM-Servers werden immer Administratorenrechte benötigt. Diese kann man mit einem entsprechendem Manifest anfordern.

Mit dem Manifest hat es geklappt.

Frage nur zu meinem Verständnis:

Bisher habe ich versucht über eine API-Funktion den COM-Server zu registrieren.
Ob über API-Funktion oder von Hand "regsvr32 COM_Test.dll", jedesmal konnte ich in der Registrierung die erstellten Einträge unter HKEY_CLASSES_ROOT finden (Vorrausgesetzt man hatte Administrator-Rechte).

Wenn ich das Manifest verwende, muss ich die DLL nicht über den COM-Server registrieren (ich habe die "function RegisterServer" auskommentiert). Ich finde auch keine Einträge in der Registrierung.

Wird die DLL automatisch geladen? Wie funktioniert das?

Mein Manifest:
Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    version="2010.4.25.0"
    processorArchitecture="X86"
    name="Project1"
    type="Win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="sfFTPLib"
        version="1.5.0.0"
        language="*"
        processorArchitecture="x86"/>
    </dependentAssembly>
  </dependency>
</assembly>
Zitat:

Zitat von Luckie
Gibt es einen Grund, warum du den COM-Server jedes mal registrieren und de-registrieren willst?

Da es sich um eine Fremd-DLL handelt möchte ich nur sicherstellen, das immer mit einer aktuellen Version gearbeitet wird.
Durch Änderung der Version ändert sich evtl. auch die Schnittstelle.

Gruss Alois


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Seite 1 von 2  1 2      

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