delphi4arab منتديات دلفي للعرب
خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير (/showthread.php?tid=11728)



خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 29-12-2021

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

هذه الدالة تعمل جيداً حين اكتب القيمة المرجعة بدالة مماثلة الى ملف ولكن عندما حاولت اظهار القيمة المرجعة بكل الطرق لم استطع , المشكلة القيمة المرجعة دائما هي القيمة المدخلة لبراميتر الطول Length فاين المشكلة.

كود :
function Search_(const FileName: string; Offset: DWORD; Length: DWORD; out bArray: ByteArray): Integer; var   MS : TMemoryStream; begin   MS := TMemoryStream.Create;   try     MS.LoadFromFile(FileName);     MS.Position := Offset;     SetLength(bArray, Length);     Result := MS.Read(bArray[0], Length);   finally     MS.Free;   end; end; procedure TForm1.Button1Click(Sender: TObject); var   bArray : ByteArray;   str    : string;   i      : integer; begin   str :='';   //str :=  Search_('j:\Test.hex', $3d3, $f, bArray).ToHexString;   i :=  Search_('j:\Test.hex', $3d3, $f, bArray); // Memo1.Lines.Add(str);   Memo1.Lines.Add(IntToStr(i)); end;

هذا فقط لتوضيح المشكلة ولكن في الاصل احاول ان اتحقق من محتوى المصفوفة Result := MS.Read(bArray[0], Length); بجملة الشرط if لتغير مسار البرنامج.


RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - Agmcz - 29-12-2021

السلام عليكم
تحقق بإستخدام الدالة CompareMem


RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 29-12-2021

(29-12-2021, 02:32 PM)Agmcz كتب : السلام عليكم
تحقق بإستخدام الدالة CompareMem


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

اولا انا بشكرك جدا اخي الحبيب من قلبي والله لانك علمتني التعامل مع التدفق

ثانيا ان شاء الله ساجرب واوافيك الرد , جزاك الله خيرا اخي 

احبك في الله .


RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 31-12-2021

(29-12-2021, 02:32 PM)Agmcz كتب : السلام عليكم
تحقق بإستخدام الدالة CompareMem

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

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

توجد صورة مرفقة ارجوا التوضيح وجزاك الله خيرا.


RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - I3CT - 31-12-2021

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

إقتباس :كل ما احتاج فعله هو التحقق من قيمة محددة في عنوان محدد بطول محدد حتى يتحقق برنامجي انه الملف الصحيح للتعديل عليه او يرسل رسالة بانه ملف غير صالح.
توجد عدة طرق برمجية و ابسطها:


PHP كود :
procedure TPoC.CheckBtnClick(Sender: TObject);
var
  MyStream: TMemoryStream;
  StoredMarker: integer;
begin
  MyStream 
:= TMemoryStream.Create;
  MyStream.LoadFromFile('Test.hex');

  MyStream.Seek($00FBC050, soFromBeginning);
  MyStream.Read(StoredMarker, 3);

  if IntToHex(StoredMarker, 3) <> '73616D' then // <-- Mirrored hex value
    MessageBoxA(Handle, 'File Corrupted!', 'PoC', MB_ICONWARNING)
  else
    MessageBoxA(Handle, 'File clean!', 'PoC', MB_ICONINFORMATION);

  MyStream.Free;
end; 



[صورة: 3GgdnmK.gif]


RE: خطأ في القيمة المرجعة من دالة حال اسنادها الى متغير - ELARAPY - 08-01-2022

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


اولا اعتذر لتأخيري في متابعة طلبي على المنتدى وذلك لاني والحمد لله مرضت قليلاً.

ثانيا إجراء التحقق يعمل كما ارسله الاستاذ I3CT لكني عدلت عليه حتى يقوم باختبار ملفين وليس ملف واحد فاصبح هناك مشكله ان الاجراء لا يقبل  MessageBoxA(Handle,  لماذا لا ادري , فهل يمكنني ارسال كود الوحدة كاملاً حتى يتم وضع ملاحظات من حضراتكم حتى استفيد منها ؟ 

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

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

كود الوحدة اعلم ان به بعض الاخطاء ولكن ماذا يجب علي فعله لتحسين الكود ؟


كود :
unit UnitMain; interface uses     System.SysUtils, Vcl.Graphics,  Vcl.Forms,  Winapi.Windows,      Vcl.Dialogs, Vcl.Controls, Vcl.StdCtrls, System.Classes,  Winapi.Messages, System.Variants; type   TForm2 = class(TForm)     Edit1: TEdit;     Edit2: TEdit;     btnModify: TButton;     Label1: TLabel;     btnSelectWorkFile: TButton;     btnSelectBadFile: TButton;     Label2: TLabel;     Label3: TLabel;     OpenDialog1: TOpenDialog;     SaveDialog1: TSaveDialog;     lblAuthor: TLabel;     procedure btnModifyClick(Sender: TObject);     procedure btnSelectWorkFileClick(Sender: TObject);     procedure btnSelectBadFileClick(Sender: TObject);     procedure FormClose(Sender: TObject; var Action: TCloseAction);    // procedure btnModifyExit(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end; var   Form2: TForm2; implementation {$R *.dfm} uses unitLogin; Type   ByteArray = array of Byte; //============================================= procedure notCorrectFile(okFile, badFile: string; var isErr: Boolean); var   MS1, MS2: TMemoryStream;   okFileVal, badFileVal: integer; begin   MS1 := TMemoryStream.Create;   MS2 := TMemoryStream.Create;    try      MS1.LoadFromFile(okFile);      MS1.Seek($00FE0008, soFromBeginning);      MS1.Read(okFileVal, 3);      MS2.LoadFromFile(badFile);      MS2.Seek($00FE0008, soFromBeginning);      MS2.Read(badFileVal, 3);      if IntToHex(okFileVal, 3) <> '304D43' then      begin        ShowMessage('Choose correct work file for Tdvr4i !');        isErr := True      end      else if IntToHex(badFileVal, 3) <> '304D43' then      begin        ShowMessage('Choose correct bad file for Tdvr4ii !');        isErr := True;      end      else    finally      begin        MS1.Free;        MS2.Free;      end;    end; end; //============================================================================== function read_(FileName : string; Offset : DWORD; Length : DWORD; out bArray : ByteArray): Integer; var   MS : TMemoryStream; begin   MS := TMemoryStream.Create;   try     MS.LoadFromFile(FileName);     MS.Position := Offset;     SetLength(bArray, Length);     Result := MS.Read(bArray[0], Length);   finally     MS.Free;   end; end; //============================================================================== function write_(FileName : string; Offset : DWORD; var bArray : ByteArray): Integer; var   MS : TMemoryStream; begin   Result := 0;   MS := TMemoryStream.Create;   try     MS.LoadFromFile(FileName);     MS.Position := Offset;     Result := MS.Write(bArray[0], Length(bArray));     MS.SaveToFile(fileName);   finally     MS.Free;   end; end; //============================================================================== procedure TForm2.btnSelectWorkFileClick(Sender: TObject); begin   if OpenDialog1.Execute then   begin     Edit1.Text := OpenDialog1.FileName;   end; end; //============================================================================== procedure TForm2.btnSelectBadFileClick(Sender: TObject); begin   if OpenDialog1.Execute() then   begin     Edit2.Text := OpenDialog1.FileName;   end; end; //============================================================================== procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin   Application.Terminate; end; //============================================================================== procedure TForm2.btnModifyClick(Sender: TObject); var   err : Boolean;   i : integer;   bArray: ByteArray;   okFile, badFile : string; begin   okFile  := Edit1.Text;   badFile := Edit2.Text;   try   if not FileExists(okFile) then     ShowMessage('Please select working file!')   else if not FileExists(badFile) then     ShowMessage('Please select bad file!')   finally     err := False;   end;   try     notCorrectFile(okFile, badFile, err);     if err then     Exit;     read_(okFile, $FDFFF0, $1de, bArray);     write_(badFile, $FDFFF0, bArray);     lblAuthor.Visible := False;     for i := 0 to 2 do       begin         Label1.Visible := True;         application.ProcessMessages;         sleep(400);         Label1.Visible := False;         application.ProcessMessages;         sleep(400);       end;       lblAuthor.Visible := True;       application.ProcessMessages;       Sleep(1000);       Application.Terminate;     except       ShowMessage('There''s been a problem!');   end;   end; end.