Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Auto Inicialização x Auto Copia!


Visitante

Pergunta

Salve!

Bom estou deselvonvelndo um programa aqui para efeito de estudo!

Mas no mesmo precisso criar uma Função onde o mesmo necessita ser Iniciado automaticamente Junto com Windons!

Mas existe um Porem!

Esse Arquivo precissa ser copiado para uma pasta diferente assim que executado pela primeira vez ou conseqüentemente!

Tenho esse codigo, onde achei na net...

Porem ainda sou novo no delphi, Gostária de uma explicação mais detalhada, para saber se ele atende o meu pedido!

Outra observação é se esse codigo vai dentro do componente TRegistry...

var
  reg: TRegistry;
begin
  CopyFile(Pchar(Application.ExeName),Pchar('C:\Arquivos de programas\Windows Media Player\PROGRAMA.exe'), FALSE);
  reg := TRegistry.Create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
  reg.WriteString('MSN Messenger', 'C:\Arquivos de programas\Windows Media Player\PROGRAMA.exe');
  reg.CloseKey;
  reg.Free;
end;

Outra duvida que tenho é se onde esta PROGRAMA.EXE é onde vai o nome do programa criado por mim, ou posso passar um novo nome para ele na copia...

Precisso que esse programa seje copiado para uma pasta qualquer, e que o programa quando inicializado pelo Windons, seje o programa que foi copiado e não o Original que fez sua auto copia para outra pasta qualquer...

É possivel Fazer isso?

Obs: Esse Meu Programa Não é Malicioso, apenas é para efeito de estudos mesmo!

Desde Já Agradeço...

Abraços..

Editado por NoNaMexD
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Estou quase lá!

Faço uma Função de Verificar se o Arquivo Executavel já Existe!

Se não Existe, eu Jogo uma Copia Para o Destino, Como se fosse um Bekap do arquivo!

procedure TForm1.FormShow(Sender: TObject);
begin
if FileExists('c:\TESTE\Project1.exe') then
  ShowMessage('O arquivo existe')
else

  //ShowMessage('O arquivo não existe')

CopyFile('Origem','Destino',True);


end;
Porem Tenho Uma Duvida Na Hora de Auto-Copiar o Arquivo! Gostária de Puxar Sua Origen, automaticamente, pois não sei onde o Usuário Ira Salvar quando baixar o sistema... Consegui a Função de Pegar o Atual Diretório do Arquivo, Porem ainda não consigo passar as Variaveis para a função! Gostária que Fica-se mais ou menos Assim!
procedure TForm1.FormShow(Sender: TObject);
begin
Var
Origen: ExtractFilePath(Application.ExeName) 
Destino: C:\TESTE

if FileExists('c:\TESTE\Project1.exe') then 


{Observem que na função acima estou passando Project1.exe, mas e se o usuário trocar o nome do arquivo? Como posso Puxar o Atual Nome Do aquivo? Para poder passar para a função IF como na Função da Origen do Diretório Onde se encontra o Programa?}


  ShowMessage('O arquivo existe')

else

  //ShowMessage('O arquivo não existe')

CopyFile('Origem','Destino', False); 

//Na função Acima Gostária que fosse a "Origen Variavel" e o "Destino Variavel" + Nome do Programa... Tipo 

{CopyFile('Origem_Var + nome_atual_do_programa ',' Destino_Var + Nome_Atual_do_programa ', False);  }


end;

Como devo Proceder?

Já tentei de varia Maneiras, mas não Obtive Êxito!!

Agora já esta com meio caminho andado, fica mais facil de me ajudarem....

Abraços...

Desde Já Agradeço!

Link para o comentário
Compartilhar em outros sites

  • 0

Resolvido!

Irei Postar o Codigo caso alguém Precise!

Irei Colocar uma Explicação para Iniciantes!

No Uses Esclareça -> Registry

Bom No evento FormCreat Usei a seguinte função!

procedure TForm1.FormCreate(Sender: TObject);
{
-------------------------------------------------------
Créditos do desenvolvimento da Função: NoNaMexD
Por Favor Mantenha os Créditos da Função, Pois Tive Muita dor de Cabeça Para
Desenvolve-la, por se tratar de uma Função que pode ser Usada para Programas
Maliciosos e Mal Intencionados!
Por Favor Use essa Função Para efeito de Estudos, e não para Criar arquivos Maliciosos que possam prejudicar alguém!
Agradecimentos: Google, www.ScriptBrasil.com.br
By: NoNaMexD

------------------------------------------------------
}



var
  Nome, Origem, Destino: string; // Nessa Linha Esclareço as VariaVeis e digo que são do Tipo String!
   reg: TRegistry; // Uso Tregistry para que Funcione a Função do Registro Para Inicializar Junto Com o Windows!
begin
Nome:=  ExtractFileName(ParamStr(0)); // Crio a Variavel Nome, Para Saber o Nome Atual do Programa, Caso o Usuário Mude o Nome do Executavel!
Origem := ExtractFilePath(Application.ExeName) + ExtractFileName(ParamStr(0)); // Crio a Variavel Origen Para Saber O Endereço + Seu Atual Nome!
Destino:=  'C:\WINDOWS\system32\' + Nome; // Crio o Destino ou Seja onde Sua Auto-Copia ira ser Salva!

reg := TRegistry.Create; // Chamo a Funão Registry
reg.RootKey := HKEY_CURRENT_USER; // Esclareço O evento da Função!
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); // Faço o Registro do Programa
reg.WriteString('NoNaMexD', 'C:\WINDOWS\system32\' + Nome ); // Digo Onde Se encontra a Copia do Programa a ser aberto quando iniciar o Windons e NoNaMexD é o Nome dado ao Registro!
reg.CloseKey; //  Fecho o Registro!
reg.Free;



IF not(fileexists('C:\WINDOWS\system32\' + Nome )) then // Se o Programa Não Existir Crio a Auto-Copia dele, se Existir não Faço nada!

CopyFile(PChar(Origem), PChar(Destino), true) // Cria a Copia dele, Onde Origen é o Endereço onde o Programa se Encontra e, Destino Onde será Salva a Copia!
ELSE

//Aqui Não Aconteçe nada se o programa Já exitir, então o mesmo não precisa ser copiado novamente!

end;

Espero que possa vir ajudar alguém!!

Link para o comentário
Compartilhar em outros sites

  • 0

Muito bem. Que bom que você conseguiu. :)

Apenas uma dica quanto ao uso do path do sistema:

- Quando tentar endereçar as pastas do Windows, é conveniente utilizar as funções da API que retornam seus nomes visto que pode ocorrer de que não sigam o padrão. Lembre-se que a instalação do Windows, pode ter sido feita em outra pasta cujo nome não seja "windows". Por ex. , C:\WinNT, D:\Win98, ...

As funções são:

- GetWindowsDirectory, retorna diretório do Windows (ex. C:\Windows);

- GetSystemDirectory, retorna diretório da pasta de sistema do Windows (ex. C:\Windows\System ou C:\Windows\System32).

Uma correção:

- quando você estiver utilizando if...then...else e não tiver o que fazer no else, então você deve o omitir. Veja esta parte final do seu código (sem os comentários):

...
  IF not(fileexists('C:\WINDOWS\system32\' + Nome )) then
    CopyFile(PChar(Origem), PChar(Destino), true)
  ELSE
    //Aqui Não Aconteçe nada se o programa Já exitir, então o mesmo não precisa ser copiado novamente!
end;
Você não teve qualquer problema, porque este else está realmente "nulo" (é a última instrução antes do end final da procedure). Mas, vamos supor que você, ou alguém, queira fazer um upgrade neste seu código e resolva acrescentar ao final do código mais alguma instrução. Vamos supor (só um exemplo bobo):
...
  IF not(fileexists('C:\WINDOWS\system32\' + Nome )) then
    CopyFile(PChar(Origem), PChar(Destino), true)
  ELSE
    //Aqui Não Aconteçe nada se o programa Já exitir, então o mesmo não precisa ser copiado novamente!
  
  ShowMessage('Método Create executado até o fim');
end;
Você consegue perceber o que vai acontecer? Este ShowMessage que deveria ser sempre executado, na verdade, passará a fazer parte do else e, com isso, a mensagem aparecerá apenas quando o arquivo existir! Caso você julgue realmente importante colocar este else "nulo", então, coloque logo a seguir um ";" para que o compilador saiba que seu bloco (o do else) já acabou:
...
  IF not(fileexists('C:\WINDOWS\system32\' + Nome )) then
    CopyFile(PChar(Origem), PChar(Destino), true)
  ELSE
   ; //Aqui Não Aconteçe nada se o programa Já exitir, então o mesmo não precisa ser copiado novamente!
  
  ShowMessage('Método Create executado até o fim');
end;

uma sugestão:

- Tente observar exatamente o que cada coisa é/faz no código para que, eventualmente, quando você tentar explicar algo descritivamente (sem por o código), esteja falando de uma forma que expresse melhor o que você está pensando.

Por exemplo, quando você coloca a linha:

Nome:= ExtractFileName(ParamStr(0)); // Crio a Variavel Nome, Para Saber o Nome Atual do ...

é comenta dizendo "Crio a variável...", na verdade neste caso você não a está criando, mas sim inicializando (atribuindo um valor a ela - o resultado da função ExtractFileName).

quando coloca:

reg := TRegistry.Create; // Chamo a Funão Registry

Na verdade, você poderia dizer que está chamando o método Create (um constructor) da classe TRegistry ou então instanciando um objeto TRegistry.

neste outro caso:

reg.RootKey := HKEY_CURRENT_USER; // Esclareço O evento da Função!

HKEY_CURRENT_USER refere-se a uma chave do registro e não um evento e, neste caso, você estaria simplesmente selecionando a chave do registros onde iria fazer suas leituras e escritas.

São pequenos detalhes, mas que as vezes podem confundir alguém que ainda não esteja muito familiarizado com as classes/funções/..., motivo pelo qual, volta e meia falo sobre a importância do uso de termos o mais apropriados possíveis.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...