PDA

View Full Version : سوال: مسیر فایل اجرایی



Da - Yo
جمعه 29 خرداد 1388, 01:31 صبح
سلام
چطور باید فهمید برنامه(فایل اجرایی) که اجرا شده مسیرش چی هست؟
در cpp

erfan_goohooli
جمعه 29 خرداد 1388, 05:02 صبح
با سلام خدمت شما. فایل اجرایی برنامه ها تو پوشه Bin توی مسیری که bpp نصبه ذخیره می شن. این فایل به همراه چند فایل دیگه به نام NONAME (البته به صورت پیش فرض) ذخیره می شن که باید بگردی و تو پوشه Bin پیداشون کنی.

Da - Yo
جمعه 29 خرداد 1388, 12:22 عصر
نه منظورم چیز دیگه بود
یعنی شما فایلو میگیرید میزاری رو دسکتاپ بعد اجرا میکنی من چطوری تو سورس بفهمم مسیری که فایل اجرا شده چیه؟

tdkhakpur
جمعه 29 خرداد 1388, 13:28 عصر
سلام
از تابع زیر استفاده کنید


َParamStr(int Index);

indexرا برابر 0 قرار بدید تا نام فایل اجرایی به همراه مسیر برگشت داده شود.

Da - Yo
جمعه 29 خرداد 1388, 19:33 عصر
در چه هدری قرار داره؟

TolooSoft
جمعه 29 خرداد 1388, 19:51 عصر
سلام
دوست عزیز شما زبان برنامه نویسی C بلدید؟>
اگه بلدید امکانش هست یه نگاه به تاپیک من بندازید؟
http://barnamenevis.org/forum/showthread.php?t=164730
این برنامه باید تا امشب اماده بشه و بحث ابرو میونه
ممنون میشم اگه زبان برنامه نویسی c بلدید کمکم کنید!
بابت اینکه در تاپیک شما پست دادم به دلیل فوریت این برنامه هست!باید من رو ببخشید!
پیشاپیش از جوابتون متشکرم
"علیرضا"

amir_civil
جمعه 29 خرداد 1388, 19:55 عصر
DWORD WINAPI GetModuleFileName(
__in_opt HMODULE hModule,
__out LPTSTR lpFilename,
__in DWORD nSize
);

tdkhakpur
جمعه 29 خرداد 1388, 23:20 عصر
در چه هدری قرار داره؟
سلام
system.h

Da - Yo
جمعه 29 خرداد 1388, 23:33 عصر
سلام مجدد
من از BC4.5 استفاده میکنم این هدر رو نداره. چیکار باید کرد؟

tdkhakpur
جمعه 29 خرداد 1388, 23:45 عصر
سلام
فکر نکنم هدر بخواهد.
دستور زیر رو بکار ببر

ShowMessage(ParamStr(0));
اگر پیدا نکرد دستور رو تایپ کنید بعد با انتخاب اون کلید f1 را فشار بدید.

حامد مصافی
شنبه 30 خرداد 1388, 10:30 صبح
نام فایل اجرایی به عنوان اولین پارامتر از سیستم عامل به روال مجری فایل ارسال می شود.

argv[0]

Da - Yo
شنبه 30 خرداد 1388, 13:03 عصر
اگر پیدا نکرد دستور رو تایپ کنید بعد با انتخاب اون کلید f1 را فشار بدید.
پیدا نکرد.

tdkhakpur
شنبه 30 خرداد 1388, 15:26 عصر
سلام
ساختار فایل اجرایی شما از چه نوعی هست
اگر از نوع wimmain باشد داخل آرگومانها یک پارامتر برای نام فایل اجرایی و خط فرمان در نظر گرفته شده که میتوانید نام فایل و مسیر را از داخل آن بیرون بکشید.. یادم نیست و لی مطمئنا یکی هست.

Da - Yo
شنبه 30 خرداد 1388, 18:22 عصر
دوستان من متوجه توضیحات شما نشدم شاید شما هم متوجه سوال من نشدید من میخوام موقع اجرا برنامه آدرسی که داره از اونجا اجرا میشه رو مثلا بریزه تو یه متغیر اگر من متوجه توضیحات شما نشدم لطفا زیکم سطح پایین تر بگید! ممنونم

PC2st
شنبه 30 خرداد 1388, 19:20 عصر
برای گرفتن دایرکتوری فعلی از دستور زیر هم میشه استفاده کرد:
فایل هدر dir.h هست و اعلان و پارامترها:


int getcurdir (int drive, char* directory);
که رشته رو بعنوان ورودی در پارامتر دوم بهش میدیم. پارامتر اول؛ صفر=درایو پیش فرض (فعلی)، ۱=درایو A، و ۲=درایو B و غیره...

Da - Yo
شنبه 30 خرداد 1388, 21:46 عصر
من متوجه نشدم مقدار بازگشتی این تابع صفر یا یک هست مسیر جاری رو چطور بفهمم چی هست؟

PC2st
شنبه 30 خرداد 1388, 22:01 عصر
char* pathhh [128];
getcurdir (0, pathhh);

پارامتر اول صفره، پس از درایو جاری (مثلا درایو C) مسیر فعلی رو در متغیر pathhh قرار میده.

Da - Yo
شنبه 30 خرداد 1388, 22:12 عصر
خروجی فقط یک سری کاراکتر نامفهوم بود!
مشکل کجاست؟

PC2st
شنبه 30 خرداد 1388, 22:18 عصر
ببخشید ... :ناراحت: چه اشتباه نافرمی کردم :لبخند:
اینطور باید می‌نوشتم:


char pathhh [128];
getcurdir (0, pathhh);

توی پست قبلی، اشتباهی آرایه‌ای از اشاره‌گرها تعریف کرده بودم.

Da - Yo
یک شنبه 31 خرداد 1388, 09:19 صبح
نه اونو که درستش کردم
کاراکترها نامفهومه به تنظیمات کامپایلر مربوط میشه؟
راستی این انتی اسپای ور م برنامه رو تروجان تشخیص داد!!! الکی الکی تروجان نویس شدیم!!:لبخند:

PC2st
یک شنبه 31 خرداد 1388, 15:42 عصر
نمیدونم چرا تابع بالا کار نکرده! راستش خودم هم تابحال ازش استفاده نکردم :لبخند: بهرحال روش‌های دیگری هم هست.
متاسفانه استاندارد زبان C یا ++C توابع یا کلاس‌هایی برای کار با فایل‌ها تعریف نکرده...
در لینوکس برای گرفتن دایرکتوری فعلی از تابع getcwd (از هدر unistd.h) استفاده میشه:

char * getcwd (char *buffer, size_t size)۱) پارامتر اول، متغیری که دایرکتوری فعلی در اون ذخیره میشه.
۲) پارامتر دوم، هم طول متغیر (پارامتر اول) رو مشخص میکنه.
۳) نکته: اگه پارامتر اول null بگذاریم و پارامتر دوم رو صفر، خودش یک متغیر رو ایجاد کرده (که دایرکتوری فعلی در آن ذخیره شده) و سپس به عنوان خروجی تابع برمیگردونه. در اینصورت، پس از استفاده و وقتی دیگه بهش نیاز نبود باید با تابع free مقدار حافظه آزاد بشه.
که تابع getcwd بعنوان یک تابع POSIX (استاندارد سیستم عامل‌های Unix) در کامپایلر ++MS VC قرار داده شده که البته از نگارش ۲۰۰۵ به بعد، بجای آن باید از تابع getcwd_ استفاده کرد که به نام آن یک _ (underline) اضافه شده بخاطر اینکه جزء استاندارد زبان ++C نیست. این تابع در ویندوز (کامپایلر مایکروسافت) در هدر direct.h قرار داره.
http://msdn.microsoft.com/en-us/library/ms235450(VS.80).aspx (http://msdn.microsoft.com/en-us/library/ms235450%28VS.80%29.aspx)

توضیح بهمراه یک مثال از MSDN
http://msdn.microsoft.com/en-us/library/sf98bd4y(VS.80).aspx (http://msdn.microsoft.com/en-us/library/sf98bd4y%28VS.80%29.aspx)

از توابع win32 API هم میشه استفاده کرد:
تابع GetCurrentDirectory
http://msdn.microsoft.com/en-us/library/aa364934(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa364934%28VS.85%29.aspx)
مثالی از آن:
http://msdn.microsoft.com/en-us/library/aa363806(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa363806%28VS.85%29.aspx)

از توابع GetLongPathName و GetShortPathName برای تبدیل مسیر از حالت DOS (حداکثر طول نام به ۸ کاراکتر و حداکثر طول پسوند هم ۳ کاراکتر) به حالت طول نام‌های بلند تبدیل کنید یا بالعکس:
http://msdn.microsoft.com/en-us/library/aa364980(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa364980%28VS.85%29.aspx)
http://msdn.microsoft.com/en-us/library/aa364989(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa364989%28VS.85%29.aspx)

حامد مصافی
یک شنبه 31 خرداد 1388, 17:16 عصر
سلام

مورد اول:
تابع getcwd در سرآیند dir.h در سیستم عامل dos و هم خانواده های وی (از جمله ویندوز مایکروسافت) نیز در دسترس است.

مورد دوم:
همانگونه که می دانید هر درایو در dos یک دایراکتوری جاری دارد، اما این مسیر الزاماً مسیر برنامه شما (در حالی که برنامه شما اجرا شده باشد) نیست! فرض کنید برنامه شما در آدرس c:\dir2\exam.exe ذخیره شده باشد و کاربر در command prompt سیستم عامل dos با استفاده از دستور cd به مسیر c:\dir1 رفته باشد. در این حالت اگر کاربر با دستور زیر برنامه شما را اجرا کند، دایراکتوری جاری وی همچنان c:\dir1 خواهد بود.


c:\dir2\exam.exe
و اما راه حل: به پست قبلی بنده رجوع شود!

Da - Yo
دوشنبه 01 تیر 1388, 00:30 صبح
نام فایل اجرایی به عنوان اولین پارامتر از سیستم عامل به روال مجری فایل ارسال می شود.

argv[0]

کمی دقیق تر توضیح میدید؟

حامد مصافی
دوشنبه 01 تیر 1388, 15:12 عصر
printf ("Executable file path : %s", argv[0]);

Yasersadegh
دوشنبه 01 تیر 1388, 16:24 عصر
سلام خدمت دوستان عزيز
من فكر مي كنم كه مشكل دوستمون با دستور زير حل بشه!!


WCHAR Source[MAX_PATH];
GetCurrentDirectory(MAX_PATH,Source);
اين دستور مسير جاري برنامه ي اجرا شده رو در Source قرار ميده و در سرآيند windows.h هست!!:چشمک:

موفق باشي:چشمک:

حامد مصافی
دوشنبه 01 تیر 1388, 16:29 عصر
windows.h جزء سرآیند های استاندارد زبان ++C نیست.
این از جمله سرآیند های ارائه شده با کامپایلر ++VC است که برای اجرا نیازمند سکوی Win32 است.
ر.ک. پست 22

Da - Yo
دوشنبه 01 تیر 1388, 16:31 عصر
Error: Undefined symbol 'argv'

حامد مصافی
دوشنبه 01 تیر 1388, 18:17 عصر
تعریف شروع تابع اصلی را به این شکل تغییر دهید

int main(int argc, char** argv)

PC2st
دوشنبه 01 تیر 1388, 18:18 عصر
windows.h جزء سرآیند های استاندارد زبان ++C نیست.
این از جمله سرآیند های ارائه شده با کامپایلر ++VC است که برای اجرا نیازمند سکوی Win32 است.
ر.ک. پست 22

البته dir.h یا direct.h نیز جزء هدرهای استاندارد نیست. اگر هم بود، چون getcwd_ جزء استاندارد ++C نیست، پس بازهم در portable بودن کد، تاثیری نمی‌گذاشت.



Error: Undefined symbol 'argv'

تعریف تابع main رو باید بصورت (int main (int argc, char** argv تغییر بدید تا بتوانید کد را کامپایل و اجرا کنید.

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


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

و این جمله شما "من میخوام موقع اجرا برنامه آدرسی که داره از اونجا اجرا میشه رو مثلا بریزه تو یه متغیر" معنی متفاوتی می‌تواند داشته باشد و همانطور که جناب BlackDal توضیح دادند (http://www.barnamenevis.org/forum/showpost.php?p=743111&postcount=22)، برنامه می‌تواند از هرجایی اجرا شود. حال یا به طریق آدرس دهی صریح برنامه، یا از طریق استفاده از مسیرهای موجود در متغیر PATH.

Da - Yo
دوشنبه 01 تیر 1388, 19:33 عصر
من فکر کردم که منظور شما، همان مسیر فعلی است که برنامه از آنجا اجرا شده است، نه مسیری که برنامه‌ی اجرایی در آن قرار دارد.
نه منظورم مسیری بود که فایل اجرایی در اون هست.
متوجه منظور شما شدم! بله جمله م اشتباه بود
متغیر argv که گفتید مشکل رو حل کرد. ممنونم