Avatar billede darkside Nybegynder
11. juni 2001 - 14:38 Der 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..
Avatar billede ziron Nybegynder
11. juni 2001 - 14:48 #1
var det ikke det som at du fik svar på sidste gang???

/ZIRON
Avatar billede darkside Nybegynder
11. juni 2001 - 14:51 #2
Niks, det fik jeg aldrig et svar på hvordan det kunne gøres...
Avatar billede ziron Nybegynder
11. juni 2001 - 14:55 #3
okay det mente jeg ellers bare... har ,ikke tid lige nu skal læse til X-samen, kedeligt men kigger når jeg har tid....

/ZIRON
Avatar billede martinlind Nybegynder
11. juni 2001 - 15:39 #4
skal du ikke bare køre regsrv32 <OCX-ctrl>
Avatar billede darkside Nybegynder
11. juni 2001 - 16:40 #5
Jo men det skal gøres automatisk, nr et ville være hvis den gør som i mit spørgsmål
Avatar billede martinlind Nybegynder
11. juni 2001 - 17:42 #6
ShellExecute(\'regsrv32.exe\',\'OXC-CTRL\',....);

/Martin
Avatar billede darkside Nybegynder
11. juni 2001 - 17:44 #7
Hm den kan jo ikke bruges, proget skal kunne køre å¨både win95/98/Me & NT/2000/XP
Avatar billede martinlind Nybegynder
11. juni 2001 - 18:10 #8
Hvorfor ikk\', findes regsrv da ikke i alle ver.


/Martin
Avatar billede darkside Nybegynder
11. juni 2001 - 18:12 #9
Ja men de hedder jo ikke det samme!
i 95/98/Me hedder den bare regsvr.exe og i NT/2000/XP hedder den regsrv32.exe
Avatar billede martinlind Nybegynder
11. juni 2001 - 18:41 #10
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.

/Martin
Avatar billede cms Nybegynder
11. juni 2001 - 19:47 #11
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.

/cms
Avatar billede darkside Nybegynder
11. juni 2001 - 21:51 #12
Hm jeg er faktisk efter et eks på hvordan det kan gøres.
Avatar billede cms Nybegynder
12. juni 2001 - 14:16 #13
arbejder på det...
tager lige et par øjeblikke...
Avatar billede cms Nybegynder
12. juni 2001 - 14:50 #14
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

Avatar billede cms Nybegynder
12. juni 2001 - 14:51 #15
det ser lidt rodet ud her, men kopier det ind i delphi, så er det lidt mere overskueligt.
Avatar billede cms Nybegynder
12. juni 2001 - 14:52 #16
til din information er den vitale kode hentet fra ovennævnte demo.
Avatar billede cms Nybegynder
13. juni 2001 - 12:51 #17
vous etez où ?
Avatar billede darkside Nybegynder
13. juni 2001 - 17:08 #18
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..
Avatar billede cms Nybegynder
14. juni 2001 - 10:54 #19
okay, jeg havde bare mistet tråden... et øjeblik....
Avatar billede cms Nybegynder
14. juni 2001 - 11:39 #20
okay, så er den her...

cut>>

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

Så ville hejsa og kukkuk blive registreret

OK??
Avatar billede martinlind Nybegynder
14. juni 2001 - 11:43 #21
Tratteta, dørene går op og ind kommer den røde løber med et SØLVFAD.......

*GGGG*
Avatar billede cms Nybegynder
14. juni 2001 - 15:24 #22
*grineflip*
Avatar billede darkside Nybegynder
14. juni 2001 - 15:33 #23
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
Avatar billede cms Nybegynder
15. juni 2001 - 16:41 #24
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 !!!

Jeg har lavet et eksempel, der bruger indy-packagen fra www.nevrona.com/indy
Se
www.innovision.it/eksperten/ocx/ocx.zip

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester