AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL über API registrieren

Offene Frage von "Alois"
Ein Thema von Alois · begonnen am 22. Apr 2010 · letzter Beitrag vom 27. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#1

DLL über API registrieren

  Alt 22. Apr 2010, 21:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: DLL über API registrieren

  Alt 22. Apr 2010, 22:19
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#3

Re: DLL über API registrieren

  Alt 22. Apr 2010, 22:22
Und falls sich keine Registrieren-API finden ließe, dann könnte man immernoch MSDN-Library durchsuchenShellExecute oder MSDN-Library durchsuchenCreateProcess verwenden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

Re: DLL über API registrieren

  Alt 23. Apr 2010, 14:52
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.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#5

Re: DLL über API registrieren

  Alt 26. Apr 2010, 22:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: DLL über API registrieren

  Alt 27. Apr 2010, 10:19
Zitat von Alois:
b.) Die Registrierung des COM-Server funktioniert auch mit normalen Benutzerrechten.
Das wäre mir neu.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

Re: DLL über API registrieren

  Alt 27. Apr 2010, 10:21
Das war ja anscheinend auch keine Tatsachenfeststellung, sondern ein Wunsch
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#8

Re: DLL über API registrieren

  Alt 27. Apr 2010, 10:46
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: DLL über API registrieren

  Alt 27. Apr 2010, 11:11
Zitat von DeddyH:
Das war ja anscheinend auch keine Tatsachenfeststellung, sondern ein Wunsch
Ach so. Das muss man aber auch dazu sagen.

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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#10

Re: DLL über API registrieren

  Alt 27. Apr 2010, 16:24
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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:14 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