DLL- og ActiveX-kontroller fra en Delphi-applikasjon

Et populært innslag i Delphi er prosjektdistribusjonen av en applikasjon med en kjørbar fil (exe). Imidlertid, hvis DLL- eller ActiveX-kontrollene i prosjektet ditt ikke er registrert på brukernes maskiner, vil en "EOleSysError" vises som svar på å kjøre exe-filen. Bruk kommandolinjeverktøyet regsvr32.exe for å unngå dette.

RegSvr32.exe kommando

Manuelt ved bruk av regsvr32.exe (Windows. Start - Run) vil registrere og avregistrere selvregistrerbare DLL- og ActiveX-kontroller på et system. Regsvr32.exe instruerer systemet til å prøve å laste komponenten og kalle sin DLLSelfRegister-funksjon. Hvis dette forsøket er vellykket, viser Regsvr32.exe en dialog som indikerer suksess.

RegSvr32.exe har følgende kommandolinjealternativer:

Regsvr32 [/ u] [/ s] [/ n] [/ i [: cmdline]] dllname. / s - Stille; vis ingen meldingsbokser. / u - Avregistrer server. / i - Ring DllInstall som gir en valgfri [cmdline]; når det brukes med / u-samtaler, vil du avinstallere. / n - ikke ring DllRegisterServer; dette alternativet må brukes med / i 
instagram viewer

Anrop regsvr32.exe Innenfor Delphi-koden

Hvis du vil ringe regsvr32-verktøyet innen Delphi-koden, bruker du “RegisterOCX” -funksjonen for å utføre en fil og venter på at utførelsen er ferdig.

Slik kan "RegisterOCX" -prosedyren se ut:

fremgangsmåte RegisterOCX; type
TRegFunc = funksjon: HResult; STDCALL; Var
ARegFunc: TRegFunc; aHandle: THandle; ocxPath: string; begynneprøve
ocxPath: = ExtractFilePath (applikasjon. ExeName) + 'Flash.ocx'; aHandle: = LoadLibrary (PChar (ocxPath)); hvis aHandle 0 deretterbegynne
ARegFunc: = GetProcAddress (aHandle, 'DllRegisterServer'); hvis Tildelt (ARegFunc) deretterbegynne
ExecAndWait ('regsvr32', '/ s' + ocxPath); slutt; FreeLibrary (aHandle); slutt; unntatt
ShowMessage (Format ('Kan ikke registrere% s', [ocxPath])); slutt; slutt;

Merk: ocxPath variabelen peker til 'Flash.ocx' Macromedia OCX.

For å kunne registrere seg selv, må en OCX implementere DllRegisterServer-funksjonen for å opprette registeroppføringer for alle klassene i kontrollen. Ikke bekymre deg for DllRegisterServer-funksjonen, bare pass på at den er der. For enkelhets skyld antas det at OCX er lokalisert i samme mappe som der applikasjonen er.

ExecAndWait-linjen i koden over kaller regsvr32-verktøyet ved å sende "/ s" -bryteren sammen med hele banen til OCX. Funksjonen er ExecAndWait.

bruker shellapi;... funksjon ExecAndWait (konst ExecuteFile, ParamString: string): boolsk; Var
SEInfo: TShellExecuteInfo; ExitCode: DWORD; begynne
FillChar (SEInfo, SizeOf (SEInfo), 0); SEInfo.cbSize: = SizeOf (TShellExecuteInfo); med SEInfo begynner
fMask: = SEE_MASK_NOCLOSEPROCESS; Wnd: = Søknad. Håndtak; lpFile: = PChar (ExecuteFile); lpParameters: = PChar (ParamString); nShow: = SW_HIDE; end; hvis ShellExecuteEx (@SEInfo) deretterbegynnegjenta
Applikasjon. ProcessMessages; GetExitCodeProcess (SEInfo.hProcess, ExitCode); før (ExitCode STILL_ACTIVE) eller applikasjon. Avsluttet; Resultat: = true; sluttellers Resultat: = false; slutt;

ExecAndWait-funksjonen bruker ShellExecuteEx API-anropet for å utføre en fil på et system. For flere eksempler på hvordan du kjører en fil fra Delphi, sjekk ut hvordan du gjør det kjør og kjør applikasjoner og filer fra Delphi-kode.

Flash.ocx Inside Delphi Exe

Hvis det er behov for å registrere en ActiveX-kontroll på brukerens maskin, må du sørge for at brukeren har OCX programmet krever ved å plassere hele ActiveX (eller DLL) i applikasjonens exe som en ressurs. Når OCX er lagret inne i exe, er det enkelt å trekke ut, lagre på disk og ringe RegisterOCX-prosedyren.