الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دمج ملف ضمن الملف التنفيذي للبرنامج واستعادته

مغلق
بدأه MiCcSoft في 20 يونيو 2007 · 5 رد · 1,427 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أخي وجدت طريقة أخرى وهي عن طريق قراءة بايتات الملف التنفيذي والملف المطلوب وضعه ودمجهما

ثم كتابتهما إلى ملف أخر

والقراءة قراءة الملف من مثلا البايت 34464 إلى نهاية الملف فيكون لدينا الملف الموضوع داخل الملف التنفيذي لكن يوجد مشكلة بسيطة

وهذا الكود :

Public Class Form1
	Structure FileS
		Dim FileName As String
		Dim FileByte() As Byte
	End Structure
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


	End Sub
	Public Sub WriteToExe(ByVal DesFileName As String, ByVal SouFileName As String)
		'هذا الكود ليس له دخل أبدا بالبرنامج 
		'كود لإضافة ملف إلى ملف تنفيذي
		Dim S As String = DesFileName
		Dim B() As Byte = My.Computer.FileSystem.ReadAllBytes(S)
		Dim F As New FileS
		F.FileByte = B
		F.FileName = S
		Dim Free As Integer = FreeFile()
		FileOpen(Free, SouFileName, OpenMode.Binary)
		Seek(Free, FileLen(SouFileName))
		FilePut(Free, F)
		FileClose()
	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim Real() As Byte ' مصفوفة لبايتات الملف الأصلي مهمة 
		Dim FileBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(DesFileName.Text) ' مصفوفة أخرى لبايتات الملف الأصلي
		Dim ProgBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(Application.ExecutablePath) 'مصفوفة لبايتات الملف التنفيذ
		'غرض الكود هو جميع المصفوفتين بحيث الملف الملف 
		'للملف التنفيذي يكون في الأخر والملف التنفيذي في المقدمة
		Real = ProgBytes
		Array.Resize(ProgBytes, ProgBytes.Length + FileBytes.Length)
		Dim ByteT As Byte
		Dim B As Integer = -1
		For Each ByteT In FileBytes
			ProgBytes(B + Real.Length) = ByteT
			B += 1
		Next
		'كتابة الملف الجديد
		Dim S As New SaveFileDialog
		S.Filter = " Exe Files (*.exe)|*.exe"
		If S.ShowDialog = Windows.Forms.DialogResult.OK Then
			My.Computer.FileSystem.WriteAllBytes(S.FileName, ProgBytes, True)
		End If
		Real.Resize(Real, 0)
		FileBytes.Resize(FileBytes, 0)
		ProgBytes.Resize(ProgBytes, 0)
	End Sub

	Private Sub BroBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BroBtn.Click
		Dim S As New OpenFileDialog
		S.Filter = "All Files (*.*)|*.*"
		If S.ShowDialog = Windows.Forms.DialogResult.OK Then
			DesFileName.Text = S.FileName
		End If
	End Sub
	Private Sub SaveToBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToBtn.Click
		Dim S As New SaveFileDialog
		'القراءة وهنا المشكلة تكمن 
		'يمكن قراءة الملف نظاميا من الملف التنفيذي 
		'لكننا دمجنا الملفين مع بعض ولم أعد أستطيع 
		'معرفة من أين أبدأ بقراءة الملف الثاني 
		'لذا قم بحفظ حجم الملف التنفيذي قبل أي تعديل 
		'في أي مكان 
		'داخل الملف التنفيذي - ملف نصي - ملف إعدادات ......
		'الرقم 32768 هو عدد بايتات الملف التنفيذي
		Dim By() As Byte = My.Computer.FileSystem.ReadAllBytes(Application.ExecutablePath)
		Dim i As Integer
		Dim R(By.Length - 32768) As Byte
		Dim t As Integer = 0
		For i = 32768 To By.Length
			R(t) = By(i - 1)
			t += 1
		Next
		If S.ShowDialog = Windows.Forms.DialogResult.OK Then
			My.Computer.FileSystem.WriteAllBytes(S.FileName, R, True)
		End If
	End Sub
End Class

طبعا يجب كنت أن أعدل كود الكتابة قليلا في المتغير Real لأنه ليس له لزمة لكن لم أجد الوقت

وهذا المثال

Add_File_To_Exe.rar

#2

أخ MiCcSoft جاري تجربة فكرتك وأرجو أن تكون ناجحة على كل حال تابع محاولاتك وأخبرنا بالنتيجة وأرجو أن يبقى الملف التنفيذي يعمل جيدا بعد عملية الدمج الخاصة بك على كل حال التجربة ستحكم

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

فكرة جيدة مبدئيا ولكنها بحاجة إلى تطوير وإليكم بعض الأفكار:

1- ماهي طريقة الحفظ المثلى التي يجب أن نستخدمها لتخزين حجم الملف التنفيذي الأساسي

2- كيف نستطيع أن نستبدل الملف التنفيذي الحالي للمشروع بالملف التنفيذي الجديد وبدون أن يشعر مستخدم البرنامج أننا قمنا بذلك

3 - حذف الملف المدمج إن لم نعد بحاجته وإعادة الملف التنفيذي الأصلي

طبعا أرجو من الجميع المساهمة وذلك لتحقيق الفائدة للجميع

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 01:39

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

لقد طورت البرنامج لدرجة كبيرة :

1- يستطيع وضع الكثير من الملفات داخل الملف التنفيذي و استخراجها

2 - حذف أي ملف منه

وأستعطت حفظ حجم الملف الأصلي في نهاية الملف بطريقة فعالة

الكود :

Imports System.Reflection
Public Class MainFrm
	Structure AllFiles
		Dim AllFileTypes() As FileType
	End Structure
	Structure FileType
		Dim FileName As String
		Dim FileBytes() As Byte
	End Structure
	Structure FileS
		Dim Siz As Integer
	End Structure
	Dim OpenedFileName As String
	Dim MainExedat() As Byte
	Private Sub CreateExeFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreateExeFile.Click
		If FileList.Items.Count = 0 Then
			MsgBox("لم تضع أي ملف لكتابته إلى الملف التنفيذي", MsgBoxStyle.Exclamation)
			Exit Sub
		End If
		'هنا بايتات الملف التنفيذي 
		Dim MExe() As Byte
		MExe = My.Computer.FileSystem.ReadAllBytes(Application.ExecutablePath)

		'هنا يتم قراءة الملفات
		'وملئها في ل Structure
		Dim FileCol(FileList.Items.Count - 1) As FileType
		Dim FileTypeT As New FileType
		Dim St As String
		Dim Co As Integer = 0
		For Each St In FileList.Items
			FileTypeT.FileName = IO.Path.GetFileName(St)
			FileTypeT.FileBytes = My.Computer.FileSystem.ReadAllBytes(St)
			FileCol(Co) = FileTypeT
			Co += 1
		Next
		'هنا تحضير البيانات النهائية للكتابة
		Dim DataToWrite As New AllFiles
		DataToWrite.AllFileTypes = FileCol
		'صنع مربع حفظ ملف 
		Dim SaDia As New SaveFileDialog
		SaDia.Filter = "Exe Files (*.exe)|*.exe"
		If SaDia.ShowDialog = Windows.Forms.DialogResult.OK Then
			CreateExe(SaDia.FileName, DataToWrite, MExe)
		Else
			MsgBox("لم تقم بتحديد ملف ! ", MsgBoxStyle.Critical)
		End If
	End Sub
	Public Sub CreateExe(ByVal FileName As String, ByVal Dat As AllFiles, ByVal MainExe() As Byte)
		'وضع رقم للملف الجديد
		Dim T As Integer = FreeFile()
		'كتابة بايتات الملف التنفيذي إلى الملف الهدف
		'لأنه يجب أن يكون في المقدمة
		My.Computer.FileSystem.WriteAllBytes(FileName, MainExe, True)
		'الأن يجب علينا حفظ حجم الملف الأصلي 
		Dim F As New FileS
		F.Siz = FileLen(Application.ExecutablePath)
		'بدء عملية الكتابة
		FileOpen(T, FileName, OpenMode.Binary)
		'تغيير مؤشر الكتابة إلى أخر بايت في الملف الأصلي 
		'لتفادي الكتابة فوق ملف التنفيذ
		Seek(T, FileLen(Application.ExecutablePath))
		'كتابة جميع الملفات
		FilePut(T, Dat)
		'كتابة حجم الملف
		FilePut(T, F)
		FileClose()
	End Sub
	Private Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


	End Sub

	Private Sub AddBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddBtn.Click
		Dim S As New OpenFileDialog
		S.Filter = "All Files (*.*)|*.*"
		S.Multiselect = True
		If S.ShowDialog = Windows.Forms.DialogResult.OK Then
			Dim St As String
			For Each St In S.FileNames
				FileList.Items.Add(St)
			Next
		End If
	End Sub

	Private Sub DelBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DelBtn.Click
		If FileList.SelectedIndex > 0 Then
			FileList.Items.Remove(FileList.SelectedItem)
		End If
	End Sub

	Private Sub OPenBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OPenBtn.Click
		'تجهيز مربع فتح حواري 
		Dim Opdia As New OpenFileDialog
		Opdia.Filter = "Exe Files (*.exe)|*.exe"
		If Opdia.ShowDialog = Windows.Forms.DialogResult.OK Then
			Dim AllDat As AllFiles
			Dim i As Integer = FreeFile()
			Dim Orig As Integer = GetOrginalFileSize(Opdia.FileName)
			FileOpen(i, Opdia.FileName, OpenMode.Binary)
			Seek(i, Orig)
			FileGet(i, AllDat)
			FileClose(i)
			Dim Fy As FileType
			For Each Fy In AllDat.AllFileTypes
				ExFileList.Items.Add(Fy.FileName)
				OpenedFileName = Opdia.FileName
				ExtractBtn.Enabled = True
				DelFileBtn.Enabled = True
			Next
		End If
	End Sub
	Public Function GetOrginalFileSize(ByVal FileName As String)
		Try
			Dim Leng As Long
			Leng = My.Computer.FileSystem.ReadAllBytes(FileName).Length
			Dim Free As Integer = FreeFile()
			Dim F As FileS
			FileOpen(Free, FileName, OpenMode.Binary)
			Seek(Free, Leng - 3)
			FileGet(Free, F)
			FileClose(Free)
			Return F.Siz
		Catch ex As Exception
			MsgBox(ex.Message)
			Return Nothing
		End Try
	End Function

	Private Sub ExtractBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExtractBtn.Click
		Dim DirT As New FolderBrowserDialog
		If DirT.ShowDialog = Windows.Forms.DialogResult.OK Then
			Dim AllDat As AllFiles
			Dim i As Integer = FreeFile()
			Dim Orig As Integer = GetOrginalFileSize(OpenedFileName)
			FileOpen(i, OpenedFileName, OpenMode.Binary)
			Seek(i, Orig)
			FileGet(i, AllDat)
			FileClose(i)
			Dim Fy As FileType
			For Each Fy In AllDat.AllFileTypes
				My.Computer.FileSystem.WriteAllBytes(DirT.SelectedPath & "\" & Fy.FileName, Fy.FileBytes, False)
			Next
		End If
	End Sub
	Public Function GetMainExedat(ByVal FileName As String) As Byte()
		Try
			Dim i As Integer
			Dim T As Integer = GetOrginalFileSize(FileName)
			Dim FileBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(FileName)
			Dim RetValue(T) As Byte
			For i = 1 To T
				RetValue(i - 1) = FileBytes(i - 1)
			Next
			Return RetValue
		Catch ex As Exception
			Return Nothing
		End Try
	End Function
	Private Sub DelFileBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DelFileBtn.Click
		If ExFileList.SelectedItem = Nothing Then
			MsgBox("الرجاء تحديد ملف", MsgBoxStyle.Critical)
		Else
			Dim AllDat As AllFiles
			Dim i As Integer = FreeFile()
			Dim Orig As Integer = GetOrginalFileSize(OpenedFileName)
			FileOpen(i, OpenedFileName, OpenMode.Binary)
			Seek(i, Orig)
			FileGet(i, AllDat)
			FileClose(i)
			Dim Cou As Integer = 0
			Dim NewArr(AllDat.AllFileTypes.Length - 2) As FileType
			Dim Fy As FileType
			For Each Fy In AllDat.AllFileTypes
				If Fy.FileName = ExFileList.SelectedItem.ToString Then
				Else
					NewArr(Cou) = Fy
					Cou += 1
				End If
			Next

			Dim Dat As New AllFiles
			Dat.AllFileTypes = NewArr
			ExFileList.Items.Remove(ExFileList.SelectedItem)
			CreateExe(OpenedFileName, Dat, GetMainExedat(OpenedFileName))
		End If
	End Sub
End Class

البرنامج

Add_My_Files_To_Exe.rar

#5

15193.gif

9bf91a8d60.jpg

#6

كود رائع أخ MiCcSoft و إلى الأمام

ونرجو رؤية المزيد من مواضيعك المفيدة دوما

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة