2010-03-22 15 views
1

Existe-t-il un moyen de lier un fichier .exe existant avec d'autres fichiers source C++ lors de la compilation? Ce que je suis en train de faire est de compresser et décompresser certains fichiers dans mon programme console en utilisant LZMA (7zip) SDK mais malheureusement c'est très difficile à utiliser pour un débutant.Incorporation d'un fichier exe existant dans un autre programme

Il existe une version en ligne de commande de LZMA appelée 7za.exe et je me demande si je peux l'intégrer d'une manière ou d'une autre dans mon programme et l'utiliser comme une fonction. Il peut être facilement utilisé avec la fonction system() (qui semble être une chose très dangereuse à utiliser) mais si j'envoie mon programme à quelqu'un qui n'a pas 7za.exe dans le bon dossier, cela ne fonctionnera pas.

Je suis tombé sur la fonction CreateProcess() dans les fichiers d'en-tête windows.h, mais il semble que ce soit ce que system() fait d'une manière plus appropriée et plus avancée. Je ne sais pas si elle peut effectivement lien le fichier exe comme un fichier objet lors de la compilation

+0

Si vous demandez à propos de la liaison à l'aide d'un éditeur de liens tel que MS link.exe ou GND's ld, alors non, il ne peut pas. et cela n'a rien à voir avec C++. –

+1

Vous étiez sur la bonne voie en utilisant un SDK compressé. N'utilisez pas d'exe externe pour cela. S'il vous plaît poster les problèmes que vous rencontrez en utilisant 7zip. – kervin

Répondre

3

CreateProcess() est un appel API Windows pour démarrer un processus, exactement comme cela ressemble, comme un enfant de votre programme que vous peut contrôler en sachant que c'est HANDLE. system() exécute une commande système. C'est autant que vous le savez et j'évite personnellement de l'utiliser à tout prix - pas moins parce que ce n'est pas portable (la fonction existe sur Windows et Linux mais pas sur la commande).

Il est possible d'ajouter les données à la fin d'une image EXE - c'est ainsi que fonctionnent les programmes d'installation. Jetez un oeil à ce microsoft support article, qui vous donne bizarrement du code basique mais vous devriez pouvoir le transformer en C++ trivialement. Voici un article sur creating a self-extractor qui pourrait être plus approprié. Les deux devraient vous permettre d'intégrer des fichiers dans l'exe.

Je ne vous recommande pas d'extraire 7za et l'appeler de System() ou CreateProcess() - Je vous recommande d'apprendre le SDK. C'est difficile, mais vous apprendrez beaucoup de le faire. Enfin, comme vous devrez modifier un fichier exe existant, vous ne pourrez pas le faire au moment de la compilation. Vous aurez besoin que le code ajoute quoi que ce soit à sa propre image ou à une autre image.

Plus de détails sur addressing data ajouté à un exe.

1

Ok, essayez ceci ...

  1. Ecrire un utilitaire de ligne de commande qui est simplement une copie d'un fichier à la fin d'une autre. Vous pouvez le faire avec des E/S de fichier Windows ou des commandes shell.
  2. Effectuez une étape de post-compilation qui exécute cet utilitaire. Votre programme liera entièrement la manière habituelle, et votre utilitaire ajoutera simplement des octets du second exe à l'exe cible.

C'est l'étape de liaison. Maintenant, l'accès à l'exe est différent. Essentiellement, l'algorithme est le suivant:

  1. Ouvrez le fichier EXE à incorporer dans un éditeur binaire de niveau octet (msdev.exe fera l'affaire). Prenez note des 30 ou 40 premiers octets comme un marqueur unique pour le début du fichier.
  2. Écrivez une fonction qui ouvre le fichier composé créé ci-dessus et recherche le fichier incorporé en recherchant le marqueur unique.
  3. Une fois le début du fichier incorporé trouvé, copiez les octets de ce fichier dans un deuxième fichier en utilisant les E/S de fichier.
  4. Exécutez le nouveau fichier en utilisant system() ou API similaire.

Si vous distribuez le travail de quelqu'un d'autre de cette façon, veuillez obtenir la licence correcte. C'est généralement une violation du droit d'auteur de jeter le binaire de quelqu'un d'autre dans le vôtre - il y a des exceptions, bien sûr.