ورود

View Full Version : سوال: کم کردن حجم فایلهای دلفی



loo30fer
یک شنبه 12 تیر 1390, 22:56 عصر
با سلام
من میخواستم بدونم راهی وجود داره که run time رو از فایلهای کمپایل شده حذف کرد تا حجم پروژه ها کاهش پیدا کنه. البته نمیخوام از روش فشرده سازی استفاده کنم مانند UPX . یکجا خوندم نوشته بود یک راهنما رو به پروژتون اضافه کنید اینطوری حجم پروژتون تا حدی کاهش پیدا میکنه ولی من تاثیری ندیدم. برای من مخصوصا پایین بودن حجم پلاگینهام خیلی مهمه حالا روشی وجود داره که بشه باهاش حجم فایلها رو تا حدی کاهش داد. ممنون میشم راهنمایی کنید. با تشکر

Felony
دوشنبه 13 تیر 1390, 05:57 صبح
از منو Project گزینه Option رو انتخاب کنید و در قسمت Packages تیک گزینه Build With Runtime Packages رو بزنید ، دقت کنید که با تیک زدن این گزینه به صورت پیش فرض کتابخانه های VCL و ... دلفی به فایل exe یا dll تولید شده لینک نمیشن و به همین دلیل حجم فایل بسیار کم میشه ، ولی اگر در سیستم مقصد این کتابخانه های و پکیج های استفاده شده وجود نداشته باشه فایل کار نمیکنه که 2 تا نکته رو برای این مورد باید رعایت کنید :

1- تو نوشتن پلاگینتون ترجیحا از توابع API استفاده کنید .
2- تو کادر Edit در همون بخش Build With Runtime Packages نام پکیج هایی که در پروژه استفاده کردید رو اضافه کنید .

یوسف زالی
دوشنبه 13 تیر 1390, 11:02 صبح
سلام.
البته راهی که می گم خود پروژه رو کم حجم می کنه اما ممکنه به دردتون بخوره:
یونیتی هست به اسم KOL که با Use کردنش و استفاده از اون به جای Unit های استاندارد دلفی حجم Exe کاهش پیدا می کنه.
مثلا پروژه من از 500 کیلو بایت شد 30 کیلو بایت. که این نرخ کاهش به هزار تا چیز بستگی داره.
ممکنه نیاز به کمی تغییر هم در کدهاتون داشته باشید. مثلا اسم بعضی از دستورها.
قسمتهای مهمی از این یونیت با اسمبلی و به صورت بهینه برای کاهش حجم نوشته شده.
لینکش رو براتون میگذارم:
http://www.persianupload.com/2801282

loo30fer
دوشنبه 13 تیر 1390, 15:49 عصر
1- تو نوشتن پلاگینتون ترجیحا از توابع API استفاده کنید .ممنون جناب تاجیک من الان اومدم برای خواندن و ساخت کلید رجیستری از توابع API استفاده کردم که تنها وابسته به کتابخانه Windows هست و کتابخانه Registry و Sysutils رو حذف کردم و حجم پلاگین از 89 کیلوبایت به 16 کیلوبایت کاهش پیدا کرد و بعد تو همون قسمتی که گفتین تیک Build With Runtime Packages رو زدم و حجم پلاگینم مجددا از 16 کیلوبایت به 7 کیلوبایت کاهش پیدا کرد فقط مشکلی که میمونه و شما هم اشاره کردین باید روی اون سیستم اون کتابخانه نصب باشه تا کار کنه و حالا میخوام کتابخانه Windows رو تو قسمت Edit که گفتین بهش بدم ولی فایلهایی که درخواست میکنه bpl. و dpc. توی پوشه نصب دلفی جستجو کردم جز پسوند pas و dcu و dpr چیزی نیافتم حالا چیکار باید کرد کتابخانه Windows رو با پسوند bpl و dpc رو از کجا میتونم گیر بیارم. راستی وقتی این کتابخانه رو بهش بدم حجم پروژه دوباره به 16 کیلوبایت باز نمیگرده؟ با تشکر از تمامی راهنماییهاتون

یوسف زالی
دوشنبه 13 تیر 1390, 16:25 عصر
Loo30fer عزیز یونیت های مشابهی در KOL وجود داره. نیازی هم به بودن در Client نداره.
برای یونیت رجیستری هم این رو نوشته بودم قدیما. (در حقیقت بازبینی کرده بودم)
ببین کارت رو راه می ندازه؟
http://www.persianupload.com/6878435

loo30fer
دوشنبه 13 تیر 1390, 16:58 عصر
Loo30fer عزیز یونیت های مشابهی در KOL وجود داره. نیازی هم به بودن در Client نداره.
برای یونیت رجیستری هم این رو نوشته بودم قدیما. (در حقیقت بازبینی کرده بودم)
ببین کارت رو راه می ندازه؟
http://www.persianupload.com/6878435


ممنون مشکل من تو رجیستری حل شد و ممنون بابت فایل فقط الان مشکل من کم کردن حجم پروژه در هنگام استفاده از کتابخانه Windows هست.

یوسف زالی
دوشنبه 13 تیر 1390, 17:07 عصر
از چه توابعی از Windows استفاده می کنید؟
تا جایی که یادم هست در اون نیاز به کتابخانه ویندوز رو مرتفع کرده بود و دیگه لازم نبود Use شه.

loo30fer
سه شنبه 14 تیر 1390, 00:07 صبح
از چه توابعی از Windows استفاده می کنید؟ pdI := nil;
WUACSF:= 0;
if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\', 0, KEY_READ, hOpenKey) = ERROR_SUCCESS then begin
iSize := SizeOf(pcTemp);
if RegQueryValueEx(hOpenKey, 'Key', nil, @iType, @iI, @iSize) = ERROR_SUCCESS then
WUACSF:= iI;
RegCloseKey(hOpenKey);
end;end;

تا جایی که یادم هست در اون نیاز به کتابخانه ویندوز رو مرتفع کرده بود و دیگه لازم نبود Use شه.میشه یکم توضیح بدین متوجه منظورتون نشدم چی و کجا ؟

یوسف زالی
سه شنبه 14 تیر 1390, 00:28 صبح
الان با این کد دیگه به اون KOL هم نیازی نیست.
HKEY_LOCAL_MACHINE ~~~ LongWord($80000002) // jaygozin
KEY_READ ~~~ ($00020000 or $0001 or $0008 or $0010) and not $00100000 // jaygozin
var hOpenKey: HKEY; ~~~ type HKEY = type LongWord; var hOpenKey: HKEY; // jaygozin
ERROR_SUCCESS ~~~ 0 // jaygozin
با اینا دیگه نیازی به Windows یوز کردن نیست.

loo30fer
سه شنبه 14 تیر 1390, 00:53 صبح
الان با این کد دیگه به اون هم نیازی نیست.
HKEY_LOCAL_MACHINE ~~~ LongWord(DWORD($80000002)) // jaygozin
KEY_READ ~~~ ($00020000 or $0001 or $0008 or $0010) and not $00100000 // jaygozin
var hOpenKey: HKEY; ~~~ type HKEY = type LongWord; var hOpenKey: HKEY; // jaygozin
ERROR_SUCCESS ~~~ 0 // jaygozin
با اینا دیگه نیازی به Windows یوز کردن نیست. ممنون ولی دو چیز رو فکر میکنم که مهمه رو خدمتتون عرض کنم که 1 - من از دلفی 7 استفاده میکنم و البته برای پلاگین نویسی به دلایلی مجبورم 2- SDK پلاگین بیلدر بدون این توابع نیاز به کتابخانه Windows داره اگه لازمه این SDK رو که استفاده میکنم رو ضمیمه کنم.
الان اومدم تمام مقدارهایی رو که تو SDK به کتابخانه Windows وابسته بود رو حذف کردم و حتی Uses رو با Windows حذف و مجددا کمپایل کردم ولی هیچ تاثیری تو حجم پلاگین نداشت و همون 16 کیلوبایت باقی مونده و فکر میکنم دیگه کمتر از این نمیشه کاری کرد.

یوسف زالی
سه شنبه 14 تیر 1390, 20:04 عصر
اگر بگذارید که خوبه.
ما هم دو تا چیز یاد می گیریم.
اگر هم تونستیم کمکی کنیم در خدمتیم.

loo30fer
سه شنبه 14 تیر 1390, 21:28 عصر
SDK رو براتون ضمیمه کردم.
ضمنا از اینکه تا الان جواب سوالات بنده رو دادین و قصد کمک داشتین ممنونم.

یوسف زالی
سه شنبه 14 تیر 1390, 21:47 عصر
خواهش می کنم.
اگر {$R *.res} رو حذف کنید یک کیلو بایت دیگه کم میشه.

loo30fer
سه شنبه 14 تیر 1390, 21:51 عصر
خواهش می کنم.
اگر {$R *.res} رو حذف کنید یک کیلو بایت دیگه کم میشه.
ممنون یک سوال کمپایلر دلفی 5 یا پایین تر تو حجم بهینه تر نیستن تا از اونها استفاده کنم؟

یوسف زالی
سه شنبه 14 تیر 1390, 22:05 عصر
راستش تست نکردم اما احتمال می دم حجم کمتری بده.
چون امکانات کمتری داره طبعا باید کمتر هم کد کامپایل تولید کنه.
اما این الزام نیست. ممکنه در ورژن های بالاتر بهینه سازی کد صورت گرفته باشه.
چرا از پکر ها استفاده نمی کنی؟
مثلا UPX کارش خوبه.

loo30fer
سه شنبه 14 تیر 1390, 22:16 عصر
راستش تست نکردم اما احتمال می دم حجم کمتری بده.
چون امکانات کمتری داره طبعا باید کمتر هم کد کامپایل تولید کنه.
اما این الزام نیست. ممکنه در ورژن های بالاتر بهینه سازی کد صورت گرفته باشه.
چرا از پکر ها استفاده نمی کنی؟
مثلا UPX کارش خوبه.
شناخته شدن الان یا بعدها توسط آنتی ویروس

یوسف زالی
سه شنبه 14 تیر 1390, 22:28 عصر
اگر به اسمبلی آشنا هستید با اون امتحان کنید.
حجم کار رو ببینید:
http://www.persianupload.com/954967
البته خیلی سخته کار باهاش اما خب طاووسه و جور هندستون!
اگر بخواهی برات آپ کنم.

loo30fer
سه شنبه 14 تیر 1390, 23:26 عصر
اگر به اسمبلی آشنا هستید با اون امتحان کنید.
حجم کار رو ببینید:
http://www.persianupload.com/954967
البته خیلی سخته کار باهاش اما خب طاووسه و جور هندستون!
اگر بخواهی برات آپ کنم.
من ورژن 6 و 5 و 4 و 3 رو تست کردم دیدم هیچ کدوم بهینه تر از دلفی 7 نبود.
ممنون میشم سورسش رو برام قرار بدین ببینم چطوریه.

یوسف زالی
چهارشنبه 15 تیر 1390, 01:02 صبح
این لینک خود اسمبلی:
http://www.persianupload.com/7044554

loo30fer
چهارشنبه 15 تیر 1390, 15:39 عصر
جناب yousijoon من تو SDK نیاز به استفاده از کدی که قرار دادم هستم که باید از متغیر HWND استفاده کنم که از کتابخانه Windows استفاده میکنه حالا معادل این متغیر به نوع API چیه که نیازی به کتابخانه Windows نباشه. ضمنا ممنون میشم منابعی رو بهم معرفی کنید تا بتونم معادل این کدها رو گیر بیارم . با تشکر
procedure SetParentWindow (hwnd: HWND); cdecl;
var
hMMBWindow : HWND;
begin
hMMBWindow := hwnd;
end;

یوسف زالی
چهارشنبه 15 تیر 1390, 16:01 عصر
راستش من اینها رو از کد خود دلفی بر میدارم.
برای این کار کافیه که Ctrl را نگه دارید و رو کلمه کلیک کنید.
اونقدر داخل کد ها برید تا بالاخره از حوزه Windows خارج بشید.
معمولا یکی دو بار شما رو به مقصد می رسونه.
مثلا Hwnd شما رو می بره به HWND = type LongWord که باید رو LongWord همین کارو کنی.
می بینی که LongWord در System هست نه Windows که یعنی برای کار شما جواب میده.

loo30fer
چهارشنبه 15 تیر 1390, 16:11 عصر
ممنون ولی من موفق نشدم تغییرش بدم چون رو کلمه type خطا میگیره اگه امکان داره شما کد من رو تغییر بدین تا متوجه بشم به چه شکل ازش استفاده کنم.

یوسف زالی
چهارشنبه 15 تیر 1390, 16:27 عصر
اول یه Type تعریف کنید که توش اون کده هست.
بعد از در تعریف متغیر از نوعی که الان خودتون تعریف کردید یعنی HWND استفاده کنید.


type
HWND = type LongWord ;
var
h: HWND;

Felony
چهارشنبه 15 تیر 1390, 22:06 عصر
خواهش می کنم.
اگر {$R *.res} رو حذف کنید یک کیلو بایت دیگه کم میشه.
با این کار فایل ریسورس دیگه به برنامه الحاق نمیشه ! احتمالا میدونید که فایل ریسورس حاوی چه اطلاعاتی هست ؟

loo30fer
چهارشنبه 15 تیر 1390, 22:17 عصر
با این کار فایل ریسورس دیگه به برنامه الحاق نمیشه ! احتمالا میدونید که فایل ریسورس حاوی چه اطلاعاتی هست ؟ولی قصد دارم یک فایل رو به ریسورس اضافه کنم اون موقع این راهنما رو نیاز داره و خیر در این مورد اطلاعی ندارم ممنون میشم توضیح بدین. با تشکر

یوسف زالی
چهارشنبه 15 تیر 1390, 22:20 عصر
;)
:لبخند:
راستش فایلی که برای من فرستادند فقط چند تا فراخوانی ساده داشت و نیازی به اون نداشت.
خروجی هم یه DLL بود که چندتا تابع Export می کرد.
برای همین هم در اون مورد خاص نیازی نبود.
اگر برای کارهای دیگه بود حق با شما بود.
تا جایی که می دونم ریسورس یه سریالایز از آبجکت ها رو Add می کنه که تو DFM هاست.
همون شکل و شمایل فرم ها و ...
اگر موردی هست بفرمایید تا استفاده کنیم..

lord_viper
پنج شنبه 16 تیر 1390, 10:39 صبح
خب اکثر حجم فایلهای exe تو دلفی از runTimeLibrary هست شما اگه از توابع api استفاده کنین حجم فایل خروجی به 16-20 کیلوبایت میرسه
روش دیگه استفاده از Col Component هست همونطور که اون دوستمون گفتن

اگه میخواهید حجم فایل خروجی رو از 16 کیلوبایت هم کمتر کنین مقاله ای که در ادرس زیر هست میتونه به شما کمک زیادی بکنه


http://www.delphibasics.info/home/delphibasicsarticles/smallapplicationsindelphibyn0v4

حجم فایل خروجی حدود 1 کبلوبایت

cybercoder
دوشنبه 03 بهمن 1390, 12:02 عصر
سلام من یک برنامه ای نوشتم که از raize ، fast report ، user controll , ehlib, indy ، shDate و ... توش استفاده کردم. حجم فایل exe حدود 13 مگابایت میشه و 60 مگابایت از ram رو اشغال می کنه در لحظه اجرا!
تمام فرم هاش هم در زمانی میان به مموری که طرف کلیک کنه و وقتی می بنده cafree میشه.
وقتی تیک build runtime packages رو می زنم که شما گفتید دیگه پروژه کامپایل نمیشه اصلا و اجرا نمی کنه
فتوشاپ در زمان اجرا انقدر رم اشغال نمی کنه که برنامه من داره اشغال می کنه! :قهقهه:
1- چطور میزان استفاده ram رو کم کنم؟
2- برنامه ای هست که فایل های include ی رو که داره پروژه ازش استفاده می کنه رو خودکار بذاره تو dll ی چیزی که من برای هر بار upgrade مجبور نشم فایل exe بزرگ رو منتقل کنم؟

BORHAN TEC
چهارشنبه 05 بهمن 1390, 09:59 صبح
سلام من یک برنامه ای نوشتم که از raize ، fast report ، user controll , ehlib, indy ، shDate و ... توش استفاده کردم. حجم فایل exe حدود 13 مگابایت میشه و 60 مگابایت از ram رو اشغال می کنه در لحظه اجرا!
از کدام نسخه دلفی استفاده می کنید؟ برنامه را در حالت Debug کامپایل کرده اید یا Release ؟

vcldeveloper
چهارشنبه 05 بهمن 1390, 17:38 عصر
وقتی تیک build runtime packages رو می زنم که شما گفتید دیگه پروژه کامپایل نمیشه اصلا و اجرا نمی کنه
با یک تیک زدن معجزه نمیشه؛ Build with runtime packages یعنی اینکه، تو کد من رو کامپایل کن، برای کد کامپوننت هایی که استفاده کردم، خودم بهت bpl های مربوطه رو میدم. حالا اگر لیست Package ها درست تنظیم نشده باشه، یا فایل های bpl مربوطه توسط برنامه قابل پیدا کردن نباشند، برنامه هم کار نمیکنه! مثل این هست که یکی بگه، با دات نت برنامه نوشتم، ولی دات نت فریم ورک رو نصب نکردم، نمیدونم چرا برنامه ام اجرا نمیشه!


سلام من یک برنامه ای نوشتم که از raize ، fast report ، user controll , ehlib, indy ، shDate و ... توش استفاده کردم. حجم فایل exe حدود 13 مگابایت میشه و 60 مگابایت از ram رو اشغال می کنه در لحظه اجرا!
اون کامپوننت ها به خودی خود حجم یک برنامه رو 13 مگابایت نمی کنند، بلکه اینکه برنامه نویس چطور ازشون استفاده کرده باشه، و چه کدی نوشته باشه تعیین میکنه که حجم فایل EXE خروجی چقدر باشه، شما ممکنه 20 تا فرم با کلی عکس و چیزهای دیگه داشته باشی که فقط حجم رابط کاربر گرافیکی برنامه ات چند 10 مگابایت باشه. میزان حافظه مصرفی برنامه هم باید با یک Profiler بررسی بشه، نه احیانا Task Manager ویندوز. بر فرض اگر میزان حافظه مصرفی برنامه بالا بود، باز به کد نویسی برنامه نویس بر میگرده، و صرف لیست کردن نام چند کامپوننت نمیتونه کمکی به پیدا کردن ریشه مشکل بکنه.

cybercoder
پنج شنبه 06 بهمن 1390, 02:28 صبح
با یک تیک زدن معجزه نمیشه؛ Build with runtime packages یعنی اینکه، تو کد من رو کامپایل کن، برای کد کامپوننت هایی که استفاده کردم، خودم بهت bpl های مربوطه رو میدم. حالا اگر لیست Package ها درست تنظیم نشده باشه، یا فایل های bpl مربوطه توسط برنامه قابل پیدا کردن نباشند، برنامه هم کار نمیکنه! مثل این هست که یکی بگه، با دات نت برنامه نوشتم، ولی دات نت فریم ورک رو نصب نکردم، نمیدونم چرا برنامه ام اجرا نمیشه!

اینو که خودمون می دونستیم غیب گو!
چرا کامپایل نمیشه در این حالت؟ سوال این بود!


اون کامپوننت ها به خودی خود حجم یک برنامه رو 13 مگابایت نمی کنند، بلکه اینکه برنامه نویس چطور ازشون استفاده کرده باشه، و چه کدی نوشته باشه تعیین میکنه که حجم فایل EXE خروجی چقدر باشه، شما ممکنه 20 تا فرم با کلی عکس و چیزهای دیگه داشته باشی که فقط حجم رابط کاربر گرافیکی برنامه ات چند 10 مگابایت باشه. میزان حافظه مصرفی برنامه هم باید با یک Profiler بررسی بشه، نه احیانا Task Manager ویندوز. بر فرض اگر میزان حافظه مصرفی برنامه بالا بود، باز به کد نویسی برنامه نویس بر میگرده، و صرف لیست کردن نام چند کامپوننت نمیتونه کمکی به پیدا کردن ریشه مشکل بکنه.

تعداد فرم ها زیاده ولی گرافیک نداره جز چند تا آیکن که اونا هم فشرده ان.
در مورد نحوه برنامه نویسی هم هر چیزی رو فقط در زمان نیاز به حافظه میارم
دلیل لیست کردن کامپوننت ها هم سوالی بوده که در آخر پرسیده شده! و بهش هیچ کس جواب نداد!


از کدام نسخه دلفی استفاده می کنید؟ برنامه را در حالت Debug کامپایل کرده اید یا Release ؟

نسخه دلفی هم 7 هست
من میزنم buid xxxx دیگه از منوی Project