ما هي الملفات و كيف نتعامل معها ؟؟
#41
(17-07-2019, 07:55 PM)S.FATEH كتب : السلام عليكم
TMemoryStream تجد كل ما يخصه في ملفات المساعدة اذا اردت ان ان تتعامل مع الملفات bin...

  1.  يجب ان تدرس اولا بنية الملف PE.
  2. ان تكون لديك دراية كافية Byte / Decimal / Hexadecimal هذه الاخيرة ليست صعبة
  3. يجب ان تكون لى دراية كافية بالمؤشرات Pointers
هذا الرابط ربما يفيدك كما يوجد فيه كتاب لشرح بنية PE

تغيير قيمة معينة فى ملف عن طريق دالة معينة

بالتوفيق اخي

وعليكم السلام ورحمة الله وبركاته

بارك الله فيك استاذ فاتح على التوضيح . اود ان تسامحوني لاني ارهقكم واتسبب في انشغالكم بامور قد تكون بسيطة جدا لكم ,
استاذي اقسم بالله اني احببت دلفي ومنتدى دلفي للعرب واعضاءه , واعلم اني لا مكان لي بينكم لعدم خبرتي بالبرمجة ولكني احببت ان لا اتسبب في ازعاج احد منكم فبحثت بمصر باغلب مراكز تدريب وتعلم البرمجة عن دورات لدلفي لم اجد ففكرت ان اتعلم اي لغة اخرى متاحة في بلدي تكون قريبة من الدلفي ووجد C# وبايثون وان شاء الله ساسعى وراء تعلم اي منهم حتى اتمكن من فهم البرمجة بشكل عام وفهم الدلفي بشكل خاص ولكي استطيع تخطي الاسئلة البسيطه ولتكون مشاركاتي بالمنتدى قيمة واسألتي تستحق الطرح .

اما بخصوص ملف المساعدة الخاص بدلفي فاني ابحث به عن ما اريد ولكني لا استطيع فهم او تطبيق ما اجده بسهولة .
انا اشعر باني اتلقى معلومات غير منتظمة . معلومة من الامام واخرى من الخلف ولا استطيع تعلم اللغة بطريقة متسلسلة ومنتظمة , فقط سؤال وجواب .
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#42
ELARAPY, بما أن لديك خبرة في الدلفي, اغتنم الـ #C, فهي مقاربة لها بعض الشيء, من خلال تجربتي معها, لغة سلسة جميلة, والدعم لها كبير جدًّا, مطلوبة في العمل, لها سهم ونشاط كبير أيضًا في Stackoverflow, إضافة الى محرك الألعاب Unity اذا كان عندك فضول للدخول في عالم الالعاب, عمومًا جيدة ونشطة اذا ادرت انعاش رغبتك في البرمجة.
[-] كل من 1 user says قال شكرا ل Ben.Ja على المشاركة المفيدة
  • ELARAPY
الرد
#43
اخي استاذ Ben.Ja انا ليس لدي اي خبره في دلفي فقط اساسيات باسكال وليس كلها وبعض المعلومات البسيطة في التعامل مع مكونات الدلفي .

هل تقصد اخي الحبيب اني اتعلم #C بدلا من بايثون ؟

في بلدي توجد مراكز تدريب تقوم بدورات ++C و #C و بايثون وانا اريد تعلم واحدة منهم حتى تساعدني على فهم الدلفي لانه لا توجد دلفي بمصر .

للعلم اخي الحبيب انا قمت بتحميل دورات لجميع لغات البرمجه وصراحة شعرت بالارتياح لل C و ++C عن البايثون وعن #C .

وايضا كثيراً ما افكر في دراسة ++C لاني انوي مستقبلا ان شاء الله ان اتعلم اوردوينو لاني اعمل بمجال الهاردوير فما رايك وماذا تنصحني ؟

لا تنسى اني اعشق دلفي .
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#44
مرحبًا ELARAPY، أنا مجرد هاوٍ للبرمجة، ولست أستاذًا، بما أنك تريد التعامل مع العتاد والأردوينو كما قلت، عليك بـ C++
لكن اللغة ليست سهلة مقارنة بC# أو بايثون، أيضًا لا تقم بالتشويش على نفسك بالانتقال من لغة إلى أخرى, وتحميل دورات وكتب كلما بدأت بالتعلم, هذا خطأ وسيمنعك من التقدم, عليك وضع هدف ثابت لنفسك, ثم اختر لغة وتمسك بها حتى تصل بها الى مستوى جيّد, بعدها ما تعلمته من طرق وكيفيات في التعامل مع لغتك الجديدة يمكن ان تستخدمه مع الدلفي.
في الأخير لا تجعل "عشقك" للدلفي يعيق تعلمك، فالبعض بعد بدئهم في التعلم، وعند كل عقبة يصادفها يرجع للدلفي ويغلق على نفسه أبوابا كثيرة، المشوار في البداية سيكون صعبًا بعض الشيء لكن بعدها ستتضح الطريق.
[-] كل من 3 users say قال شكرا ل Ben.Ja على المشاركة المفيدة
  • أبو معاذ, ELARAPY, ALKO
الرد
#45
(20-07-2019, 11:55 AM)Ben.Ja كتب : في الأخير لا تجعل "عشقك" للدلفي يعيق تعلمك، فالبعض بعد بدئهم في التعلم، وعند كل عقبة يصادفها يرجع للدلفي ويغلق على نفسه أبوابا كثيرة، المشوار في البداية سيكون صعبًا بعض الشيء لكن بعدها ستتضح الطريق.

فعلا نصيحة ذهبية ،
وهذا الذي أعاني منه . Blush Sad
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 1 user says قال شكرا ل أبو معاذ على المشاركة المفيدة
  • ELARAPY
الرد
#46
(20-05-2019, 10:29 AM)محمد عبد العزيز كتب :
إقتباس :MS.Position := Offset; لتحديد الادريس المراد التعامل معه . فهل يتم تغير Offset الى العنوان الخاص به ؟
للذهاب لوضع/مكان معين، وما يلي من قراءة/كتابة تكون في ذلك المكان

ماذا لو اني لا اعلم العنوان ولكني اعلم القيمة التي اريد الكتابة من بعدها فكيف يتم ارجاع عنوان القيمة ثم استخدام Offset للذهاب اليه ؟
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#47
(29-05-2019, 04:03 AM)Agmcz كتب : وعليكم السلام
هذا مثال يقوم بالمطلوب
يمكن التعليق عن أي شيء لم تفهمه

function read_(const FileName: string; Offset: DWORD; Length: DWORD; out bArray: ByteArray): Integer;

السلام عليكم 

لماذا المتغيران offest, length من النوع  DWORD ؟
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#48
إقتباس :لماذا المتغيران offest, length من النوع  DWORD ؟ 

في هذه الحالة لا يهم DWORD هو نوع من ااعداد الصحيحة الموجبة فقط ..يمكنه التعامل و تحديد العناوين في ملفات يصل حجمها الى 4G ... و لكن الافضل استعمال نوع صحيح موجب و سالب signed integer لان خلط بينها قد يؤدي الى عمليات خاطئة عند المقارنة وغير ذلك..

ملاحظة حول الدلة _Read استعمال TMemoryStream  في المثال السابق لا معنى له في هذه الدالة لانه يقوم بفتح كل الملف و نقله الى الذاكرة ثم يتم نقل مجددا الجحم المراد في مصفوفة اخرى... الاولى استعمال TFileStream الذي لا يخزن اي شي في الذاكرة...


بما ان الملفات Bin التي تريد تعديلها صغيرة اذن يمكنك استعمال TMemoryStream لتعديل بعض المعطيات بطريقة صحيحة وسهلة ... عند فتح ملف يقوم  TMemoryStream بنقله كاملا الى الذاكرة و يمكن الوصول اليها عن طريق TMemoryStream.Memory عندئذ يمكن التعامل معها كمصفوفة بطريقة سهلة وذلك بتحويل نوع المدخل Memory من Pointer عام الى PByteArray...  في النسخ الحديثة من دالفي ينبغي استعمال TBytesStream الذي يخزن المعطيات مباشرة في مصفوفة يمكن الولوج اليها من خلال Bytes هذا اسهل دون الحاجة الى كود اضافي

كود :
var
  MS: TMemoryStream;
  D:byte;
  P:PByteArray;
begin
  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile(FileName); // open the file & load it in memory
// option 1 use Position & write
    D:= 50; // new arbitrary value
    MS.Position := $34; //writing pos
    MS.Write(D, SizeOf(D));// store value of D to memory to the address $34 and inc position by SizeOf(D)

    D:= 177; // new arbitrary value
    MS.Position := $95;//writing pos
    MS.Write(D, SizeOf(D));// store 177 to memory to $95 and inc position by SizeOf(D)

// option 2 use TMemoryStream.Memory
    P := MS.Memory; // puts memory address to P and map it as array of byte
    P[$34]:=50;// store 50 to the address $34
    P[$95]:=177;// store 177 to the address $95

//option 3 use TBytesStream instead of TMemoryStream
    //MS.Bytes[$34]:=50;
    //MS.Bytes[$95]:=177;


    MS.SaveToFile(FileName); // save entire memory in the file
  finally
    MS.Free;
  end;
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد
#49
(27-11-2022, 09:22 PM)Ndagor كتب :  و لكن الافضل استعمال نوع صحيح موجب و سالب signed integer لان خلط بينها قد يؤدي الى عمليات خاطئة عند المقارنة وغير ذلك..

بارك الله فيك اخي, بعض الاسئلة

لماذا استخدم متغير سالب في حين اني استخدمه كادرريس ومن المفترض ان العناوين تكون تصاعديا بداية من ادريس صفر ؟

(27-11-2022, 09:22 PM)Ndagor كتب : [size=1]ملاحظة حول الدلة _Read استعمال TMemoryStream  في المثال السابق لا معنى له في هذه الدالة لانه يقوم بفتح كل الملف و نقله الى الذاكرة ثم يتم نقل مجددا الجحم المراد في مصفوفة اخرى... الاولى استعمال TFileStream الذي لا يخزن اي شي في الذاكرة[/size]

ملاحظة جميلة بارك الله فيك, دائما كنت افكر ما الفرق بينهم , بعض الاحيان ارى شخص يستخدم TMemoryStream واخر يستخدم في كوده TFileStream ولم اكن اعرف ما الاختلاف.


اخيراً اخي وجدت في توثيق دلفي PByteArray مؤشر من نوع TByteArray جاهز للاستخدام , فلا احتاج الى تعريفه اليس كذلك؟
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#50
إقتباس :لماذا استخدم متغير سالب في حين اني استخدمه كادرريس ومن المفترض ان العناوين تكون تصاعديا بداية من ادريس صفر ؟


في الاصل لا مشكل ان كنت تعرف نوع الذي تتعامل معه لاخذ الاحتياطات المشكل عندما يتم اجراء عمليات مختلطة بين signed و  unsigned  تسبب مشاكل للبرنامج ...الدالفي يستعمل كذلك الموجب و السالب لتحديد عدد العناصر Count و Length بالرغم انها تعبر عن ارقام موجبة فقط.

في المثال التالي يبين احدى المشاكل عند البحث على عنصر في قائمة Lixtbox  و تكون النتيجة سلبية 1- اي غير موجود ويتم حفظ هذه القيمة في المتغير Index الموجب فقط تتحول الى 255 و بالتالي تفشل المقارنة التي تاتي من بعد ..

كود :
var
  Index:Byte;
  ..
begin
   Index := Listbox1.Items.IndexOf('ououo');
   if Index <> -1 then
   begin
     S:= Listbox1.Items[Index];
     ..


TFileStream يتيح الولوج الى بيانات المخزنة التي يتم تحليلها و تحويلها مباشرة  الى المتغيرات و المكونات المعنية في في البرنامج في عملية متسلسلة ..
هنالك ملاحظة في غاية الاهمية TFileStream ليس سريع في قراة او الكتابة مثل MemoryStream لا يمكن قيام بتغير قيمة ادريس واحد في كل عملية قراءة او كتابة هذه عملية مرهقة لقرص الصلب خاصة نوع HDD الافضل في هذه الحالة هو فتح الملف كله او الجزء المعني في الذاكرة للتعامل معه .. مثل حالتك..  هناك بديل له هو TBufferdFileStream يقوم بفتح جزئيا الملف في الذاكرة


كود مقارنة بين الانواع الثلاث يقوم يتسجيل قيم من 0 الى 99999 في ملف.

كود :
procedure TForm2.tFileStreamClick(Sender: TObject);
var
  Fs:TFileStream;
  I:integer;
begin
  if not SaveDlg.Execute then
      Exit;
  Fs:=TFileStream.Create(SaveDlg.FileName,fmCreate);//fmCreate create new file ..if exist delete it
  try
      for I := 0 to 99999 do
      begin
        Fs.Write(I,SizeOf(I));
      end;
  finally
     Fs.Free;
  end;
  Showmessage('ok');
end;

procedure TForm2.tBufferedStreamClick(Sender: TObject);
var
  Fs:TBufferedFileStream;
  I:integer;
begin
  if not SaveDlg.Execute then
      Exit;
  Fs:=TBufferedFileStream.Create(SaveDlg.FileName,fmCreate,4096);//fmCreate create new file ..if exist delete it
  try
      for I := 0 to 99999 do
      begin
        Fs.Write(I,SizeOf(I));
      end;
  finally
     Fs.Free;
  end;
  Showmessage('ok');

end;

procedure TForm2.tMemoryStreamClick(Sender: TObject);
var
  Fs:TMemoryStream;
  I:integer;
begin
  if not SaveDlg.Execute then
      Exit;
  Fs:=TMemoryStream.Create();
  try
      for I := 0 to 99999 do
      begin
        Fs.Write(I,SizeOf(I));
      end;
      Fs.SaveToFile(SaveDlg.FileName);//save the file
  finally
     Fs.Free;
  end;
  Showmessage('ok');

end;

إقتباس :اخيراً اخي وجدت في توثيق دلفي PByteArray مؤشر من نوع TByteArray جاهز للاستخدام , فلا احتاج الى تعريفه اليس كذلك؟

هو موجود لا داعي لاعادة تعريفه
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • ELARAPY
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم