سؤال

هل هناك طريقة لربط ملف .exe الموجود مع ملفات مصدر C ++ الأخرى أثناء التجميع؟ ما أحاول فعله فعليًا هو ضغط وإزالة ضغط بعض الملفات في برنامج وحدة التحكم الخاصة بي باستخدام LZMA (7ZIP) SDK ، لكن للأسف ، من الصعب للغاية استخدامه للمبتدئين.

يوجد إصدار سطر الأوامر من LZMA يسمى 7ZA.exe وأتساءل عما إذا كان بإمكاني تضمينه بطريقة أو بأخرى في برنامجي واستخدامه كدالة. يمكن استخدامها بسهولة مع وظيفة System () (والتي يبدو أنها أمر خطير للغاية لاستخدامه) ولكن بعد ذلك إذا أرسلت برنامجي إلى شخص ليس لديه 7Za.exe في المجلد الصحيح ، فلن يعمل.

لقد صادفت وظيفة CreateProcess () في ملفات Windows.H ، لكن يبدو أنها تحقق ما يفعله النظام () بطريقة أكثر ملاءمة ومتقدمة. لا أعرف ما إذا كان يمكن أن يكون في الواقع حلقة الوصل ملف exe مثل ملف كائن أثناء التجميع

هل كانت مفيدة؟

المحلول

CreateProcess() هي مكالمة API Windows لبدء عملية ، تمامًا كما يبدو ، كطفل لبرنامجك يمكنك التحكم فيه من خلال معرفة ذلك HANDLE. system() ينفذ أمر النظام. هذا بقدر ما ستعرفه من أي وقت مضى وأنا شخصياً أتجنب استخدامه بأي ثمن - ليس أقله لأنه غير محمول (توجد الوظيفة على Windows و Linux لكن الأمر لن).

من الممكن إلحاق البيانات بنهاية صورة EXE - هذه هي الطريقة التي يعمل بها المثبتون. الق نظرة على هذا مقالة دعم Microsoft, ، وهو ما يمنحك بشكل غريب رمزًا في الأساس ولكن يجب أن تكون قادرًا على تحويله إلى C ++ بشكل تافه. هذا مقال عن خلق استخراج ذاتي والتي قد تكون أكثر ملاءمة. كلاهما يجب أن يسمح لك بتضمين الملفات في EXE.

لا أوصيك بالاستخراج 7za ودعاها من System() أو CreateProcess() - أوصيك بتعلم SDK. إنه أمر صعب ، لكنك ستتعلم الكثير من القيام بذلك.

أخيرًا ، نظرًا لأنك ستضطر إلى تعديل ملف EXE موجود ، فلن تتمكن من القيام بذلك في وقت الترجمة. ستحتاج إلى أن يكون الرمز يضيف كل ما إلى صورته أو صورة أخرى.

مزيد من التفاصيل على معالجة البيانات إلحاق بـ exe.

نصائح أخرى

حسنًا ، جرب هذا ...

  1. اكتب أداة سطر الأوامر التي تنسخ ملفًا إلى نهاية ملف آخر فقط. يمكنك القيام بذلك باستخدام أوامر i/o أو shell ملفات Windows.
  2. قم بخطوة ما بعد البناء تدير هذه الأداة. سيقوم برنامجك بربط الطريقة المعتادة بالكامل ، وبعد ذلك ستقوم فائدةك فقط بإلحاق بايت من EXE الثاني إلى EXE الهدف.

هذه هي الخطوة الربطية. الآن الوصول إلى وقت التشغيل إلى EXE شيء مختلف. في الأساس ، الخوارزمية هي:

  1. افتح exe ليتم تضمينها في محرر ثنائي على مستوى البايت (سوف يقوم msdev.exe). لاحظ أول 30 أو 40 بايت كعلامة فريدة لبداية الملف.
  2. اكتب وظيفة تفتح ملف المركب الذي تم إنشاؤه أعلاه ويبحث عن الملف المضمّن من خلال البحث عن العلامة الفريدة.
  3. بمجرد العثور على بداية الملف المضمّن ، انسخ بايت هذا الملف إلى ملف جديد ثانٍ باستخدام ملف I/O.
  4. قم بتنفيذ الملف الجديد باستخدام System () أو API مماثل.

إذا قمت بتوزيع عمل شخص آخر بهذه الطريقة ، فيرجى تصحيح الترخيص. عمومًا هو انتهاك حقوق الطبع والنشر لرمي ثنائي شخص آخر إلى ثنائي-هناك استثناءات ، بالطبع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top