11. juni 2001 - 14:38Der er
23 kommentarer og 1 løsning
Registrere OCX Filer
Hejsa, jeg har et program som jeg skal ha til at registrere nogen OCX filer, navnene på disse filer ligger på en textfil på en webserver, nu er spørgsmålet så hvordan kan det laves? Altså det skal være sådan at programmet skal læse tekstfilen, og så når den kommer til en fil der hedder OCX til efternavn så skal den selv registre den..
Jamen så skal du jo bare checke version før du kalder regsrv, eller den slammede måde, kalde regsrv32 først og ved fejl kalde regsrv og først ved fejl der rapportere fejl.
Der ligger en demo i: $(DELPHI)\\Demos\\Activex\\Tregsvr, som vist nok kan registrere ocx-filer. Du skal nok fjerne {$APPTYPE CONSOLE} og lave den om til gui-app, sådeet!
Alternativt kan du jo hver gang du støder på en .ocx-fil bare loade typelib\'et og derefter registrere det. Brug de funktioner, der ligger i ActiveX-unitet. Jeg mener de hedder noget med RegisterTypeLib m.v.
damn! det tog en halv time. men så skulle resultatet også være noget nær det perfekte!!!
cut>>>
uses ActiveX;
function RegisterOCXFiles(Dir: String; DoRegister: Boolean = True; ShowStatus: Boolean = False; ShowErrors: Boolean = True; IncludeSubDirs: Boolean = False): Boolean; var ProcName: String; procedure em(msg: string); begin if ShowErrors then showmessage(\'Error: \'+msg); RegisterOCXFiles := false; end; procedure sm(msg: string); begin if ShowStatus then showmessage(\'Status: \'+msg); end; procedure RegisterOCX(FileName: String); type TRegProc = function : HResult; stdcall; var RegProc: TRegProc; var LibHandle: THandle; begin LibHandle := LoadLibrary(PChar(FileName)); if LibHandle = 0 then raise Exception.CreateFmt(\'Couldn\'\'t load ocx:\'#13\'%s\', [FileName]); try @RegProc := GetProcAddress(LibHandle, PChar(ProcName)); if @RegProc = Nil then EM(Format(\'Can\'\'t find procedure %s in file\'#13\'%s\', [ProcName, FileName])); if RegProc <> 0 then EM(Format(\'Can\'\'t load procedure %s in file\'#13\'%s\', [ProcName, FileName])); SM(\'Succesfully registered ocx-file:\'#13+filename); finally FreeLibrary(LibHandle); end; end; function DirectoryExists(const Name: string): Boolean; var Code: Integer; begin Code := GetFileAttributes(PChar(Name)); Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); end; procedure ScanDir(Dir: String; IncludeSubDirs: Boolean); var sr: tsearchrec; var e: integer; begin e := FindFirst(IncludeTrailingBackSlash(Dir)+\'*.ocx\', faAnyFile, sr); while e=0 do begin if sr.Attr and faDirectory <> 0 then begin if IncludeSubDirs then ScanDir(IncludeTrailingBackSlash(Dir)+Sr.Name, True); e := findnext(sr); continue; end; RegisterOCX(IncludeTrailingBackSlash(Dir)+sr.name); e := findnext(sr); end; end; const ed = \'*.*\'; begin result := true; if DoRegister then ProcName := \'DllRegisterServer\' else ProcName := \'DllUnRegisterServer\'; if FileExists(Dir) then RegisterOCX(Dir) else begin if Copy(Dir, Length(Dir)-LEngth(Ed)+1, Length(Ed))=Ed then Dir := Copy(Dir, 1, Length(Dir)-LEngth(ed)); if DirectoryExists(Dir) then ScanDir(Dir, IncludeSubDirs) else EM(Format(\'Directory %s doesn\'\'t exist!\', [dir])); end; end;
<<cut
Værs\'go !! Denne funktion kan nu kaldes på mange måder, afhængig af hvad du har brug for...
Fx success := registerocxfiles(\'c:\\ocxfilbib\\*.*\', true, false, true, true); - ville registrere alle ocx-filer i c:\\ocxfilbib og underbiblioteker, ville ikke vise statusmeddelelser, men ville vise fejlmeddelelser. registerocxfiles(\'c:\\ocxfilbib\'); - ville gøre det samme registerocxfiles(\'c:\\ocxfilbib\', false) - ville afregistrere alle ocx-filer i c:\\ocxfilbib. registerocxfiles(\'c:\\ocxfilbib\\hejsa.ocx\') - ville registrere filen c:\\ocxfilbib\\hejsa.ocx
Hm det var faktisk ikke lige det jeg var efter.! Ideen var jo at den skulle læse en txt fil og hvergang den stødte på en fil med *.ocx så skulle den selv registre den..
function RegisterOCXFilesFromFile(FS: TFileStream; DoRegister: Boolean = True; ShowStatus: Boolean = False; ShowErrors: Boolean = True): Boolean; overload; const PNames: array[false..true] of string = (\'DllUnRegisterServer\',\'DllRegisterServer\'); var ProcName: String; procedure em(msg: string); begin if ShowErrors then showmessage(\'Error: \'+msg); RegisterOCXFilesFromFile := false; end; procedure sm(msg: string); begin if ShowStatus then showmessage(\'Status: \'+msg); end; procedure RegisterOCX(FileName: String); type TRegProc = function : HResult; stdcall; var RegProc: TRegProc; var LibHandle: THandle; begin LibHandle := LoadLibrary(PChar(FileName)); if LibHandle = 0 then raise Exception.CreateFmt(\'Couldn\'\'t load ocx:\'#13\'%s\', [FileName]); try @RegProc := GetProcAddress(LibHandle, PChar(ProcName)); if @RegProc = Nil then EM(Format(\'Can\'\'t find procedure %s in file\'#13\'%s\', [ProcName, FileName])); if RegProc <> 0 then EM(Format(\'Can\'\'t load procedure %s in file\'#13\'%s\', [ProcName, FileName])); SM(\'Succesfully registered ocx-file:\'#13+filename); finally FreeLibrary(LibHandle); end; end; var ss: tstringlist; var i: integer; begin result := true; ProcName := PNames[DoRegister]; ss := tstringlist.create; ss.loadfromstream(FS); for i:=0 to ss.count-1 do if lowercase(ExtractFileExt(ss[i]))=\'.ocx\' then RegisterOCX(expandfilename(ss[i])); ss.free; end;
function RegisterOCXFilesFromFile(FileName: String; DoRegister: Boolean = True; ShowStatus: Boolean = False; ShowErrors: Boolean = True): Boolean; overload; var fs: tfilestream; begin result := false; try fs := tfilestream.create(FileName, fmOpenRead or fmShareDenyWrite); except showmessagefmt(\'Couldn\'\'t open file %s\', [filename]); exit; end; try result := RegisterOCXFilesFromFile(fs, DoRegister, ShowStatus, ShowErrors); finally fs.free; end; end;
<<cut
Den skal kaldes ligesom før, blot med filnavnet på listen i første parameter, i stedet for et bibliotek...
Fx RegisterOCXFilesFromFile(\'c:\\list.txt\', True, True); vil registrere alle ocx-filer, der er listet i c:\\list.txt, og vise statusmeddelelser.
c:\\list.txt kunne se sådan ud: cut >> c:\\dir\\to\\ocx\\files\\hejsa.ocx c:\\et\\andet\\dir\\til\\noget\\andet\\hejsa.exe c:\\dir\\to\\en\\anden\\ocx\\fil\\kukkuk.ocx
Hm det ser godt ud :) Men kan du ikke droppe alle de msgboxe? Så den bare gør det silent! Og den skal læse filen fra en http server, se evt: http://www.eksperten.dk/spm/79101
nu havde jeg jo skrevet funktionen så den som standard kun viste message-boxe når der var fejl. I mit eksempel ovenover skrev jeg True i parametren ShowStatus, blot for at teste at det virkede. Du kan jo bare skrive sådan: RegisterOCXFilesFromFile(\'c:\\list.txt\', True);
Hvis du heller ikke vil have msgboxe ved fejl så skriv RegisterOCXFilesFromFile(\'c:\\list.txt\', True, False, False);
Hvor svært kan det være ?? *gg*
Nu siger du den skal læse filen fra en webserver. Men skal den også downloade ocx-filerne?? For ellers giver det jo ikke rigtig mening... Eller hvad??
Men hvis den skal læse filen fra en webserver, så forbinder du jo bare en http-client til din webserver !!!
Den downloader en liste-fil fra en webserver (fiktiv) og registrerer alle de filer der er.
Hvis du kan brokke dig mere nu må du se at få puttet nogle flere point i puljen !!!
.-) cms
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.