Registrera DLL- och ActiveX-kontroller från ett Delphi-program

En populär funktion hos Delphi är projektdistributionen av en applikation med en körbar fil (exe). Men om DLL- eller ActiveX-kontrollerna i ditt projekt inte är registrerade på användarens maskiner, kommer en "EOleSysError" att visas som svar på att köra exe-filen. Använd kommandoradsverktyget regsvr32.exe för att undvika detta.

RegSvr32.exe-kommando

Manuellt med regsvr32.exe (Windows.Start - Run) kommer att registrera och avregistrera självregistrerbara DLL- och ActiveX-kontroller på ett system. Regsvr32.exe instruerar systemet att försöka ladda komponenten och anropa sin DLLSelfRegister-funktion. Om detta försök lyckas visar Regsvr32.exe en dialogruta som visar framgång.

RegSvr32.exe har följande kommandoradsalternativ: 

Regsvr32 [/ u] [/ s] [/ n] [/ i [: cmdline]] dllname / s - Tyst; visa inga meddelandelådor / u - Avregistrera server / i - Ring DllInstallera överför den till ett valfritt [cmdline]; när det används med / u-samtal dll avinstallera / n - ring inte DllRegisterServer; detta alternativ måste användas med / i 

Ring upp Regsvr32.exe Inom Delphi-koden

För att ringa regsvr32-verktyget inom Delphi-koden använder du funktionen "RegisterOCX" för att köra en fil och vänta på att körningen ska slutföras.

Så här kan "RegisterOCX" -förfarandet se ut:

procedur RegisterOCX; typ TRegFunc = fungera : HResult; stdcall; var ARegFunc: TRegFunc; aHandle: THandle; ocxPath: sträng; Börja Prova ocxPath: = ExtractFilePath (Application.ExeName) + 'Flash.ocx'; aHandle: = LoadLibrary (PChar (ocxPath)); om aHandle 0 sedan Börja ARegFunc: = GetProcAddress (aHandle, 'DllRegisterServer'); om Delad (ARegFunc) sedan Börja ExecAndWait ('regsvr32', '/ s' + ocxPath); slutet; FreeLibrary (aHandle); slutet; bortsett från ShowMessage (Format ('Kan inte registrera% s', [ocxPath])); slutet; slutet;

Notera ocxPath variabel pekar på 'Flash.ocx' Macromedia OCX.

För att kunna registrera sig själv måste en OCX implementera funktionen DllRegisterServer för att skapa registerposter för alla klasser i kontrollen. Oroa dig inte för DllRegisterServer-funktionen, bara se till att den är där. För enkelhetens skull antas det att OCX finns i samma mapp som där applikationen är.

ExecAndWait-linjen i koden ovan kallar regsvr32-verktyget genom att skicka "/ s" -omkopplaren tillsammans med hela sökvägen till OCX. Funktionen är ExecAndWait.

användningar shellapi; ... fungera ExecAndWait (const ExecuteFile, ParamString: sträng): booleska; var SEInfo: TShellExecuteInfo; ExitCode: DWORD; Börja FillChar (SEInfo, SizeOf (SEInfo), 0); SEInfo.cbSize: = SizeOf (TShellExecuteInfo); med SEInfo börjar fMask: = SEE_MASK_NOCLOSEPROCESS; Wnd: = Application.Handle; lpFile: = PChar (ExecuteFile); lpParametrar: = PChar (ParamString); nShow: = SW_HIDE; end; om ShellExecuteEx (@SEInfo) sedan Börja upprepa Application.ProcessMessages; GetExitCodeProcess (SEInfo.hProcess, ExitCode); fram tills (ExitCode STILL_ACTIVE) eller Application.Termined; Resultera: = true; slutet annan Resultera: = false; slutet;

ExecAndWait-funktionen använder ShellExecuteEx API-samtal för att köra en fil på ett system. För fler exempel på hur du kör någon fil från Delphi, kolla in hur du kör och kör applikationer och filer från Delphi-kod.

Flash.ocx inuti Delphi Exe

Om det finns ett behov av att registrera en ActiveX-kontroll på användarens maskin ska du se till att användaren har den OCX som programmet kräver genom att placera hela ActiveX (eller DLL) i applikationens exe som en resurs. När OCX lagras inuti exen är det enkelt att extrahera, spara till disk och ringa RegisterOCX-proceduren.