خطوات بناء ملف تنفيذي تطبيق ويندوز (Win32)
#1
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته

سنقوم بتوضيح خطوات بناء ملف تنفيذي تطبيق ويندوز (Win32), بطريقة مبسطة , أولا خطوات العملية :
1- ترجمة الملف المصدري (Compiling)
2- تحويل OMF الى Intel OMF
3- ربط Coff بمكتبات النظام , إنتاج ملف تنفيذي

المرحلة الأولى :
عملية ترجمة الكود سورس إلى كود أسمبلي (لغة الآلة) , لكي تتم العملية بنجاح بمرور 3 مراحل للتحقق الى إنتاج ملف Obj
- lexical analysis (التحقق من صحة الـ Token = المفردات المحفوظة if,do,begin …….ect)
- syntaxic analysis (التحقق من ترتيب الـ Token & بناء شجرة بإستخدام الـ Token)
- semantic analysis (التحقق من مبدأ المرجعية , نتأكد من القيمة المسندة لمتغير ما من نفس الطبيعة)
- code generation
حتى يتم توليد ملف مترجم (operation assembly code) يجب نجاح كل مرحلة (تم ذكر المراحل دون التفصيل لأنها موضوع أخر).
يمكن تحقيق ذلك سواء بكتابة MakeFile أو تنفيذ مباشر Command Line , يكفي كتابة dcc32 في الـ Cmd لتوضيح بارامترات الترجمة .
مثلا لإنتاج ملف OMFخام :
كود :
dcc32 -JP _MsgBox.pas
المرحلة الثانية :
إنطلاقا من دلفي 4 , قامت بورلاند بتحويل OMF (Object Module Format)i من Intel Omf الى Borland Omf
Borland Omf : قابل للربط فقط بـ Borland Linker (نحول Omf الى Coff : ممكن)
أدوات عملية : RmCoff By mickeylan / OMF2D by EliCZ
Intel Omf : قابل للربط بـ microsoft Linker (نحول Coff الى Omf لإستعمالها في دلفي : ممكن)
أدوات عملية : Object file converter
- يمكن معرفة محتوى الـ lib / Obj بواسطة TDUMP المرفق في مجلد Bin
كود :
TDUMP -C user32.lib (COFF only)
TDUMP -d MsgBox.obj (OMF only )
- أيضا يمكننا إستخدام الـ Object File الناتج عن المترجمات الأخرى c/c++ , بإظافة التوجيه L$
مواضيع ذات صلة :
انتاج ملف Object .
إستخدام ملف lib

المرحلة الثالثة :
يتم دمج كل من الأبجكت فايل (DCu) & ملفات الريسورس & ملفات Bin , لإنتاج ملف تنفيذي Exe
صورة توضيحية:
[صورة مرفقة: dflow.png]
مثال :
كود :
unit _MsgBox;

interface

procedure Start;

implementation

function MessageBoxA(hWnd: Cardinal; lpText, lpCaption: Pchar; uType: Cardinal): Integer; stdcall;
           external 'user32.dll' name '_MessageBoxA@16';
function MessageBeep(uType: Cardinal): Integer; stdcall;
           external 'user32.dll' name '_MessageBeep@4';          
procedure Start;        
begin
MessageBeep($FFFFFFFF);
MessageBoxA(0,PChar('TF6M | D4A.Com'),
               PChar('Www.Delphi4Arab.Com'),0);
MessageBeep($FFFFFFFF);
End;
end.
- العلامة @ , تعني حجم المحجوز لبارامترات الممرة للدالة مثلا : MessageBeep@4 لديه براماتر وحيد
من نوع Cardinal حجمه 4 Byte , يمكن أيضا فتح الـ Lib بأحد محررات الـ Hex أو Ida لمعرفة لائحة
الدوال & الإجراءات المخزنة .

الأن نأتي إلى عملية الترجمة + التحويل + الربط , عبارة عن MakeFile مرفق, هذا الأخير يتطلب تعديل مسار الـ Lib فقط !!
بالتوفيق,,



الملفات المرفقة
.rar   Sample [MakeFile].part1.rar (الحجم : 512 KB / التحميلات : 1,127)
.rar   Sample [MakeFile].part2.rar (الحجم : 341.39 KB / التحميلات : 922)
I'M Fly Like A G6

الرد
#2
وعليكم السلام ورحمة الله وبركاته
موضوع جميل Smile
إقتباس :- أيضا يمكننا إستخدام الـ Object File الناتج عن المترجمات الأخرى c/c++...
بالفعل، مع التنبيه أنه يجب استخدام Borland C Compiler لإنتاج ملفات obj متوافقة
وإلا سنحصل على "Bad object file format" ثم نلجأ إلى التحويل والمزالق المترتبة عنه...

كملاحظة، يمكن باستخدام خيارات المشروع توليد Obj عوض Dcu من(دلفي 7):
Project -> Options -> Linker -> Generate C object files
بالتوفيق.
الرد
#3
وعليكم السلام ورحمة الله وبركاته

معلومات مهمة أخي tf6m

بالتوفيق.
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#4
السلام عليكم ورحمة الله

للعلم ما كان يميز مترجم Borland من ايام Turbo Pascal انه لم يكن ينتج ملف obj (بالقرص و انما بالذاكرة) بل ينتج مباشرة الملف التنفيذي ويظهر كانها مرحلة واسرع سرعة بذلك الوقت
كل مترجمات اللغات الاخرى (مثل C/C++وFortran الخ) تمر بمرحلتين
تنتج اولا ملفات الobj بعد الترجمة Compile
ثم ثانيا مرحلة الربط Link تنتج الملف التنفيذي

ولاثراء الموضوع:
لما هذه الطريقة (ما الفائدة) ؟ في حين يكفي الضغط على الزر F9 من دلفي لانتاج ملف تنفيذي
[-] كل من 1 user says قال شكرا ل B.M.AbdelAziZ على المشاركة المفيدة
  • mohamed49
الرد
#5
أعتقد أن هذا يسهل أمور كثيرة منها:
- توزيع أجزاء من البرنامج دون السورس (مكتبات، مكونات...)
- تسهيل إعادة الاستخدام ضمن نفس البرنامج أو في برامج أخرى
- تقليص حجم الكود (باستخدام Includes...)
[-] كل من 1 user says قال شكرا ل kachwahed على المشاركة المفيدة
  • mohamed49
الرد
#6
و عليكم السلام و رحمة الله و بركاته
"لما هذه الطريقة (ما الفائدة) ؟ في حين يكفي الضغط على الزر F9 من دلفي لانتاج ملف تنفيذي"
- بإختصار Application Size Optimization , كان يكفي الضغط على زر F9 لنتحصل على تطبيق 14 Ko
1- لم نستخدم الـ VCL (حتى و إن يمكن تعويضه بـ KOL لكن وقت أقل + حجم أقل)
2- الإستغناء عن إظافات الـ RTL (Delphi Runtime Library "..\Source\Rtl\MakeFile")i .
- بالتحديد ملف System الذي يترجم مع جميع الوحدات المستخدمة (مقالة) , و هذا سبب إستخدام
الربط الستاتيكي ,أي دمج الكود المصدر مباشرة من الـ
LIB
4-
لو لاحظنا بنية الملف الناتج (PE) , نجده يحتوي عدد أقسام اقل من الذي ينتجه الـ Borland Linker
هذا ما أعرفه [صورة مرفقة: icon10.gif] .
I'M Fly Like A G6

الرد
#7
اضافة الى ما ذكر الطريقة باختصار
دلفي ينتج ملف تنفيذي EXE/DLL ولا يسمح بانتاج sys
ما الحل ؟
1- استخدام مترجم Compiler من Borland
لماذا ؟ بكل بساطة لاننا نستخدم دلفي/ نبرمج بباسكال Pascal
2- استخدام Linker من مايكروزفت
لماذا ؟ لانتاج ملف sys



[-] كل من 1 user says قال شكرا ل B.M.AbdelAziZ على المشاركة المفيدة
  • mohamed49
الرد
#8
أفادك الله وجزاك كل الخير على ماقدمت وأحسنت فيه فالموضوع رائع والشرح أروع .. شكراً شكراً
الرد
#9
شكرا للفائدة
عندي سوال فقط بالنسبة للملف omf2d.exe لمادا تعتبره الافيرا والافجي ملف ضار بالجهاز
الرد
#10
mahboub2011 كتب :شكرا للفائدة
عندي سوال فقط بالنسبة للملف omf2d.exe لمادا تعتبره الافيرا والافجي ملف ضار بالجهاز
انا ايضا عندي مشكلة عندما احمل المرفق يحذفه
هل من بديل ؟
الرد


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


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف