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

Tudo Dentro Do Exe


Paulo Nobre

Pergunta

Uma vez tentei procurar o arquivo wav(ou outro qualquer) dentro de um CD e não encontrei.

Este arquivo tocava ao mostrar a tela de incicialização do norton. Ele não estava em nenhuma parte do CD, que pudesse acessar.

A muito tempo atrás ouvi falar em arquivos de recursos e na possibilidade de embutir diversos arquivos dentro dele para que não fosse necessário ter que distribuir separadamente e até com isso "protegê-los" de cópias.

Tenho um programa que faz uso do registro abundantemente, ou seja, tudo é armazenado nele, desta forma não existe nenhum txt ou dat ou bd. Sendo assim a única coisa a ser distribuída é um exe.

Porém, gostaria de acrescentar sons e manter este padrão.

Não sei usar o procedimento acima, ou seja, embutir arquivos de som(wav) dentro de arquivos de recursos.

Alguém poderia me dar um exemplo detalhado de como fazer?

Não tenho a menor idéia disso. Uma vez li algo a respeito mas, não entendi.

Tenho a impressão, que seria muito útil não só para mim, que sou iniciante na programação, como para outras pessoas também.

Agradeço antecipadamente a atenção de quem se dispuser a ajudar.

Abraços

Link para o comentário
Compartilhar em outros sites

19 respostass a esta questão

Posts Recomendados

  • 0

Olá Paulo, siga o exemplo abaixo:

1 - Crie uma pasta no Local desejado. Exemplo 'C:\WAV Res'.

2 - Copie todos os arquivos que deseja inserir em seu executavel.

3 - Crie um arquivo de texto(.txt) nessa pasta. Exemplo 'WavRes.txt'.

4 - No Arquivo texto: será informado um nome qualquer que será usando como referencia; o tipo de arquivo (WAVFILE, MP3FILE, ZIPFILE, etc...); e por ultimo o nome do arquivo real com a extensão. Exemplo: MUSICA01.WAV.

Exemplo geral( VMUSICA WAVFILE MUSICA01.WAV ) .

5 - Compile o arquivo de texto usando o Brcc32.exe(no diretório Delphi\Bin) por linha de comando. De preferencia crie na pasta um atalho para o Brcc32, depois dê um clique com o botão esquerdo do mouse sobre o arquivo de atalho e clique em 'Propriedades', no campo objeto depois do "C:\...\Delphi\Bin\brcc32.exe" dê um espaço e digite entre aspas duplas o nome do arquivo de texto que você criou com o caminho completo. Exemplo: "C:\Wav Res\WavRes.txt".

Pronto para compilar o arquivo dê um clique duplo no atalho.

6 - O Brcc32 vai gerar um arquivo de recursos com o mesmo nome do arquivo de texto. Exemplo 'Wav.RES'.

7 - Copie este arquivo para a pasta onde está o projeto.

8 - Agora no Delphi abra o projeto que você deseja inserir o arquivo de recursos, click no menu Projects | View Source e digite {$R Wav.RES}.

9 - Pronto agora é só Compilar o projeto e os arquivos vão estar dentro do aplicativo.

Como usar os arquivos?

Abaixo está o procedimento que vamos usar para extrair o arquivo Musica01.wav e grava-lo no disco.

procedure Form1.Button1Click(Sender: TObject);

var

  Arq: TResourceStream;

begin

  Arq:= TResourceStream.Create(HInstance, 'VMUSICA', 'WAVFILE');

  try

    Arq.SaveToFile('Musica01.wav');

  finally

    Arq.Free;

  end;

end;

-------------------------

Abs. Progr'amador. wink.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, Progr'amador

Testei da seguinte maneira: no código que você colocou para o botão, inseri com a função snd uma chamada ao arquivo de som, claro que colocando MMsystem no uses.

Qual foi o resultado: ele extraiu o arquivo de som do exe para a mesma pasta onde está o executável e em seguida executou o arquivo de som. Podemos dizer que cumpriu a sua missão.

Porém, acho que por desconhecimento meu, fiquei meio decepcionado, pois achei que o arquivo de som seria executado sem aparecer. Entendeu?

A pasta apenas tinha o meu executável e quando cliquei no botão para executar o som ele foi executado, porém, aparecendo o arquivo de som na pasta.

Existe uma maneira de executar este som sem que ele apareça?

Ou seja, sem que ele seja gerado na pasta do executável, já que ele se encontra embutido no exe.

Será que isso é loucura minha?

Agradeço a você ou a quem puder ajudar!!

Link para o comentário
Compartilhar em outros sites

  • 0

Alguém já testou ou tentou fazer o que estou querendo fazer?

Não sei fazer, mas penso que poderia, pois se for colocado num CD de instalação o programa não iria poder abrir os arquivos de música dentro do CD, certo?

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Estou usando a snd.

PS:No meu post anterior, quando disse que não poderia abrir o arquivo de música o que quis dizer foi não poderia criar o arquivo dentro do cd, como acontece com o código fornecido anteriormente.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Aí vai o código...

procedure TfrmPrincipal.mnuApresentacaoClick(Sender: TObject);

Var

Caminho: String;

Arq: TResourceStream;

begin

Arq:= tResourceStream.Create(HInstance,'NOTIFY','WAVFILE');

try

Arq.SaveToFile('NOTIFY.wav');

Caminho:= ExtractFilePath(Application.ExeName)+'NOTIFY.wav';

SndPlaySound(pChar(Caminho),SND_ASYNC);

finally

Arq.Free;

end;

frmPrincipal.Show;

end;

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, do jeito que está, você extrai o .wav e depois executa a partir do local salvo.

Tente extrair do .exe diretamente p/ memória:

procedure TfrmPrincipal.mnuApresentacaoClick(Sender: TObject);
var h1,h2:THandle; pSom:PChar;
begin
  h1   := FindResource(HInstance, 'Notify', 'WavFile');
  h2   := LoadResource(HInstance, h1);
  pSom := LockResource(h2);
  sndPlaySound(pSom, Snd_Async or Snd_Memory);
  UnlockResource(h2);
end;

Link para o comentário
Compartilhar em outros sites

  • 0

O seu código, s3c, como sempre, funcionou perfeitamente.

Agora, veja se você pode me esclarecer o seguinte:

Qualquer coisa pode ser "armazenada", desta forma?

No arquivo texto que foi usado para gerar o arquivo de recurso foi colocado numa linha:

Notify,WavFile, Notify.wav.

Se quisesse colocar um arquivo texto seria a mesma coisa?

Seria o que no lugar de wavFile? Ficaria

Texto, textFile,Texto.txt?

A chamada seria h1 := FindResource(HInstance, 'texto', 'TextFile');

Haveria alguma modificação no código que você passou?

Docs também poderiam?

Exes também?

Se a pergunta para exes parece sem sentido, explico.

Existem programas que chamam subprogramas de dentro de uma pasta onde se encontra o programa principal. Se pudessemos colocar os sub dentro do exe principal eles não estariam disponíveis para uma simples cópia.

Obrigado mais uma vez s3c.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá gelara!

s3c, eu tentei usar o seu código pra tocar um mp3, num sei se ta correto mas deu erro (Undeclared identifier: sndPlaySound), tem que declarar alguma coisa no uses?

procedure Form1.Button1Click(Sender: TObject);

var h1,h2:THandle; pSom:PChar;

begin

   h1   := FindResource(HInstance, 'Detalhes', 'Mp3File');

   h2   := LoadResource(HInstance, h1);

   pSom := LockResource(h2);

   sndPlaySound(pSom, Snd_Async or Snd_Memory);

   UnlockResource(h2);

end;

Abs. Progr'amador. wink.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Olá gelara!

s3c, eu tentei usar o seu código pra tocar um mp3, num sei se ta correto mas deu erro (Undeclared identifier: sndPlaySound), tem que declarar alguma coisa no uses?

procedure Form1.Button1Click(Sender: TObject);

var h1,h2:THandle; pSom:PChar;

begin

   h1   := FindResource(HInstance, 'Detalhes', 'Mp3File');

   h2   := LoadResource(HInstance, h1);

   pSom := LockResource(h2);

   sndPlaySound(pSom, Snd_Async or Snd_Memory);

   UnlockResource(h2);

end;

Abs. Progr'amador. wink.gif

esse erro já resolvi

no uses: MMSystem

Só que só toca se for WAV???

tem como tocar MP3?

Abs. Progr'amador.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, acredito que qualquer arquivo possa ser transferido p/ um .res; mas não entendí muito bem porque utilizar Find, Load e Lock Resource em um .txt ou .doc ou .exe. Essas tres funcções trabalham c/ a memória:

FindResource localiza e retorna um Handle de resource (HRSRC)

LoadResource carrega o recurso na memória e retorna um Handle de memória (HGLOBAL)

LockResource retorna um ponteiro de memória alocada referente HGLOBAL.

Com isto você tem o recurso carregado e um ponteiro p/ ele retornado pelo LoadResource. Como sndPlaySound possui um parâmetro p/ tocar diretamente da memória(Snd_Memory), então foram utilizadas essas funções, mas p/ outros arquivos vai depender da finalidade de uso e se houver funções que os manipule em memória.

Olá Progr'amador, não posso garantir mas acho que sndPlaySound não toca mp3.

Se você tiver MP3s em .res, tente extraí-los pelo TResourceStream.SaveToFile e depois utilize o TMediaPlayer que está na unit MPlayer.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c, talvez seja idiota o motivo, mas seria o de se ter apenas praticamente como arquivo para distribuir um exe.

Por exemplo: se você vai distribuir um demo com o tradicional código que chama o arquivo bat, que destroi o executavel na segunda vez (ou terceira ou...) de uso, se vários outros arquivos(exes, wav etc...) estão embutidos, ao destruir o exe principal todos serão destruídos também.

Por exemplo estou desenvolvendo um programa chamado Professor de Matemática, que entre outras coisas possui 27 sub programas do tipo, resolve equação do segundo grau, algoritmo de briot-ruffini, calcula números primos etc..

Quando o programa é instalado todos estes sub programas ficam na pasta onde o exe principal está instalado, ou seja, são executáveies independentes a mercê de uma pirataria.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, se entendí bem sua necessidade, você quer embutir esses sub-executáveis num único .exe principal através de um .res.

Bom, se for isto eu não conheço maneira de executar esses sub-programas a partir do .res sem ter que extraí-los p/ o disco. Como a questão do Progr'amador, se fosse meu caso, partiria logo p/ o TResourceStream.SaveToFile e depois os executaria pelo ShellExecute.

Quanto a questão da pirataria, não me preocuparia em deixá-los no disco. Na hora de sua execução, checaria uma chave no regedit gerenciada pelo exe principal e se não existisse ou vencido o prazo, eles não funcionariam mais.

Link para o comentário
Compartilhar em outros sites

  • 0
Olá Progr'amador, não posso garantir mas acho que sndPlaySound não toca mp3.

Se você tiver MP3s em .res, tente extraí-los pelo TResourceStream.SaveToFile e depois utilize o TMediaPlayer que está na unit MPlayer.

Olá s3c. vlw!!!

mas era assim mesmo que eu estava fazendo, só que queria ver a possibilidade de tocar de dentro do exe assim como o wav,

de qualquer forma, VLW!!! wink.gif

Abs. Progr'mador. smile.gif

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,3k
×
×
  • Criar Novo...