Oppure

Loading
25/02/07 12:43
Valentinox
Sapete come si può svolgere la funzione del comando regsvr 32 in delphi?
aaa
26/02/07 0:16
pierotofy
Usa la funzione ShellExecute definita nella unit Windows.
Il mio blog: piero.dev
26/02/07 8:45
Valentinox
In genere utilizzo la funzione ShellExecute per inviare e-mail o aprire un url in questo modo

ShellExecute(Form1.Handle, 'open', PChar(Url), nil, nil, SW_SHOWNORMAL);


Come dovrei cambiarlo per eseguire ad esempio il comando:

regsvr32 forum.dll delphi.dll pierotofy.dll

aaa
27/02/07 20:13
Valentinox
Sono riuscito ad eseguire il comando regsvr32 nome.dll inserendo una procedura nel programma che mi permette di eseguire comandi dos e salvarne l'output in un oggetto TMemo (che non so cosa sia -.-')

Di funzionare funziona, infatti dopo che l'azione viene eseguita viene fuori un messaggio del tipo: dllRegisterServer in nome.dll riuscito. Ma come premo ok sulla finestra col messaggio mi accorgo che il programma non risponde più...

Sapete come posso evitare questo malfunzionamento finale?

Vi posto il codice della procedura...

COn questo la richiamo:
LanciaComandoDosInMemo('regsvr32 MSXML3.DLL',Memo1);


Questa invece è la procedura vera e propria:
procedure LanciaComandoDosInMemo (ComandoDos: String; AMemo:TMemo);
const
    BufferDiLettura = 2400;
var
    AttrSicurezza : TSecurityAttributes;
    CodaDiLettura, CodaDiScrittura : THandle;
    Inizio : TStartUpInfo;
    InfoDelProcesso : TProcessInformation;
    Buffer : Pchar;
    ByteLetti : DWord;
    AppAttiva : DWord;
begin
    with AttrSicurezza do
    begin
        nlength := SizeOf(TSecurityAttributes);
        binherithandle := true;
        lpsecuritydescriptor := nil;
    end;
    if Createpipe (CodaDiLettura, CodaDiScrittura, @AttrSicurezza, 0) then
    begin
        Buffer := AllocMem(65536); // alloca memoria per 64k
        FillChar(Inizio, Sizeof(Inizio),#0);
        Inizio.cb := SizeOf(Inizio);
        Inizio.hStdOutput := CodaDiScrittura;
        Inizio.hStdInput := CodaDiLettura;
        Inizio.dwFlags := STARTF_usesTDHANDLES + STARTF_usesHOWWINDOW;
        Inizio.wShowWindow := SW_HIDE;
        if CreateProcess(nil, PChar(ComandoDos),@AttrSicurezza,@AttrSicurezza,true,
        NORMAL_PRIORITY_CLASS, nil,nil,Inizio,InfoDelProcesso)
        then
        begin
            repeat
            AppAttiva := WaitForSingleObject(InfoDelProcesso.hProcess,100);
            Application.ProcessMessages;
            until (AppAttiva <> WAIT_TIMEOUT);
            Repeat
            ByteLetti := 0;
            ReadFile(CodaDiLettura,Buffer[0], BufferDiLettura,ByteLetti,nil);
            Buffer[ByteLetti]:= #0;
            OemToAnsi(Buffer,Buffer);
            AMemo.Text := AMemo.text + String(Buffer);
            until (ByteLetti < BufferDiLettura);
        end;
        FreeMem(Buffer); // libero la memoria
        CloseHandle(InfoDelProcesso.hProcess);
        CloseHandle(InfoDelProcesso.hThread);
        CloseHandle(CodaDiLettura);
        CloseHandle(CodaDiScrittura);
    end;
end;
aaa