Pergunta

Existe uma maneira de vincular um arquivo .exe existente a outros arquivos de origem C ++ durante a compilação? O que estou realmente tentando fazer é compactar e descomprimir alguns arquivos no meu programa de console usando o SDK LZMA (7ZIP), mas infelizmente é muito difícil de usar para um novato.

Existe uma versão da linha de comando do LZMA chamada 7za.exe e estou me perguntando se posso incorporá -lo ao meu programa e usá -lo como uma função. Ele pode ser facilmente usado com a função System () (que parece ser uma coisa muito perigosa de usar), mas se eu enviar meu programa para alguém que não tiver 7za.exe na pasta certa, ele não funcionará.

Me deparei com a função createprocess () nos arquivos de cabeçalho Windows.h, mas parece alcançar o que o System () faz de uma maneira mais adequada e avançada. Eu não sei se pode realmente link o arquivo exe como um arquivo de objeto durante a compilação

Foi útil?

Solução

CreateProcess() é uma chamada da API do Windows para iniciar um processo, exatamente como parece, como criança do seu programa que você pode controlar sabendo que é HANDLE. system() Executa um comando do sistema. Isso é o quanto você jamais saberá e eu pessoalmente evito usá -lo a todo custo - principalmente porque não é portátil (a função existe no Windows e no Linux, mas o comando não).

É possível anexar os dados ao final de uma imagem exe - é assim que os instaladores funcionam. Veja isso Artigo de suporte da Microsoft, que bizarramente fornece código no BASIC, mas você poderá transformá -lo em C ++ trivialmente. Aqui está um artigo sobre criando um auto-extrato o que pode ser mais adequado. Ambos devem permitir que você incorpore arquivos no EXE.

Eu não recomendo você extrair 7za e chame de System() ou CreateProcess() - Eu recomendo que você aprenda o SDK. É difícil, mas você aprenderá muito por fazê -lo.

Por fim, como você precisará modificar um arquivo exe existente, você não poderá fazer isso em tempo de compilação. Você precisará que o código adicione qualquer coisa à sua própria imagem ou outra imagem.

Mais detalhes sobre abordando dados anexado a um exe.

Outras dicas

Ok, tente isso ...

  1. Escreva um utilitário de linha de comando que apenas copie um arquivo até o final de outro. Você pode fazer isso com os comandos de E/S do arquivo do Windows ou shell.
  2. Faça uma etapa pós-construção que execute esse utilitário. Seu programa vinculará completamente a maneira usual e, em seguida, seu utilitário apenas anexará bytes do segundo exe ao exe de destino.

Esse é o passo de ligação. Agora, o acesso ao tempo de execução ao EXE é uma coisa diferente. Essencialmente, o algoritmo é o seguinte:

  1. Abra o EXE a ser incorporado em um editor binário de nível de byte (MSDEV.EXE FAI). Tome nota dos primeiros 30 ou 40 bytes como um marcador exclusivo para o início do arquivo.
  2. Escreva uma função que abre o arquivo composto criado acima e pesquise o arquivo incorporado procurando o marcador exclusivo.
  3. Depois que o início do arquivo incorporado for encontrado, copie os bytes desse arquivo para um segundo novo arquivo usando a E/S do arquivo.
  4. Execute o novo arquivo usando o System () ou API semelhante.

Se você distribuir o trabalho de outra pessoa dessa maneira, obtenha o licenciamento correto. Geralmente, é uma violação de direitos autorais lançar o binário de outra pessoa-há exceções, é claro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top