DLL- och ActiveX-kontroller från en Delphi-applikation

Ett populärt inslag i 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 i 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 servern. / i - Ring DllInstall som ger en valfri [cmdline]; när det används med / u-samtal dll avinstallera. / n - ring inte DllRegisterServer; detta alternativ måste användas med / i 
instagram viewer

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örjaProva
ocxPath: = ExtractFilePath (applikation. ExeName) + 'Flash.ocx'; aHandle: = LoadLibrary (PChar (ocxPath)); om aHandle 0 sedanBörja
ARegFunc: = GetProcAddress (aHandle, 'DllRegisterServer'); om Tilldelad (ARegFunc) sedanBörja
ExecAndWait ('regsvr32', '/ s' + ocxPath); slutet; FreeLibrary (aHandle); slutet; bortsett från
ShowMessage (Format ('Det går inte att 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: = Applikation. Hantera; lpFile: = PChar (ExecuteFile); lpParametrar: = PChar (ParamString); nShow: = SW_HIDE; end; om ShellExecuteEx (@SEInfo) sedanBörjaupprepa
Ansökan. ProcessMessages; GetExitCodeProcess (SEInfo.hProcess, ExitCode); fram tills (ExitCode STILL_ACTIVE) eller applikation. terminerad; Resultera: = true; slutetannan 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 gör 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, se till att användaren har OCX som programmet kräver genom att placera hela ActiveX (eller DLL) i programmets exe som en resurs. När OCX lagras inuti exen är det enkelt att extrahera, spara på disken och ringa RegisterOCX-proceduren.