![]() |
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: ![]() 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 ;) |
Re: DLL über API registrieren
Zitat:
Zitat:
|
Re: DLL über API registrieren
Und falls sich keine Registrieren-API finden ließe, dann könnte man immernoch
![]() ![]() |
Re: DLL über API registrieren
Zitat:
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. |
Re: DLL über API registrieren
Zitat:
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 |
Re: DLL über API registrieren
Zitat:
|
Re: DLL über API registrieren
Das war ja anscheinend auch keine Tatsachenfeststellung, sondern ein Wunsch :zwinker:
|
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 |
Re: DLL über API registrieren
Zitat:
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? |
Re: DLL über API registrieren
Zitat:
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:
Durch Änderung der Version ändert sich evtl. auch die Schnittstelle. Gruss Alois |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 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