PDA

View Full Version : دو مشکل اساسی با GetCurrentDirectory



A_Salimi
شنبه 28 شهریور 1388, 00:26 صبح
من دو تا مشکل اساسی با تابع GetCurrentDirectory دارم که واقعا نمی دونم دلیلش چیه ؟

1-من در یک برنامه دلفی اول این تابع رو صدا میزنم .در حالیکه اون برنامه اجراست در یک برنامه MFC هم همین تابع رو به کار میبرم .اما در برنامه دوم هیچ وقت آدرس کامل برگردونده نمیشه و فقط اسم درایو مثلا C:\ برگردونده میشه.به نظر شما آیا توابع API با هم تداخل می کنند؟:اشتباه:

2-زمانی که از این تابع در Start Up ویندوز استفاده میکنم اصلا مسیر فایل رو برنمیگردونه... مثلا برای من آدرسی مثل زیر رو برگردوند:

C:\Documents and Settings\Administrator

در حالیکه برنامه من اصلا در درایو C هم نبود؟!:عصبانی++:

دلیل وجود این دو مشکل واقعا چیه ؟

Nima_NF
شنبه 28 شهریور 1388, 01:17 صبح
GetCurrentDirectory مسیر فولدری را بر می گرداند که برنامه/پروسه شما از آنجا شروع می شود (نه لزوما مسیر فایل اجرایی)، مگر اینکه برنامه شما (یا سایر توابع و API هایی که استفاده می کنید) از طریق SetCurrentDirectory این مسیر را تغییر دهند.
پس لزوما مسیر فایل اجرایی شما نیست.

A_Salimi
شنبه 28 شهریور 1388, 06:30 صبح
اگر قرار باشد که از SetCurrentDirectory استفاده کنم بايد به آن يک پارامتر بدهم ؟اين پارامتر را از کجا بياورم؟ چون برنامه ممکن است در هر سيستم با سيستم ديگر فرق کند.

اگر فرصت داشتيد اين قضيه را تست کنيد:يک برنامه بنويسيد که دايرکتوري موجود را برگرداند .خواهيد ديد که با اجراي فايل درست کار مي کند .حالا همان برنامه را در Start up قرار دهيد .
چون می خواهم برنامه کلا به صورت خودکار عمل کند از مسیر زیر در رجیستری استفاده می کنم :

HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run
و کلیدی را با آدرس فایل اچرایی در آن قرار می دهم.
خواهيد ديد که با اجراي خودکار آن مسير ديگري دريافت خواهد شد(البته براي من که اينطور بود).حالا باز به صورت دستي و با کليک فايل اجرايي دوباره آن را تست کنيد :نتيجه------> برنامه دوباره درست عمل مي کند!!!!!!!

من که متوجه نشدم دليل اين امر چيست.

Nima_NF
شنبه 28 شهریور 1388, 16:19 عصر
يک برنامه بنويسيد که دايرکتوري موجود را برگرداند .
توضیح دادم که کلمه current به این معنی نیست که آن فولدر، فولدر کنونی فایل اجرایی شما باشد...
پس مجددا تکرار می کنم (‍!) تابع GetCurrentDirectory مسیر کنونی فولدری را بر می گرداند که برنامه شما از آن جا فراخوانی می شود و آن را اجرا می کند، نه اینکه مسیر فولدر فایل اجرایی.


چیزی که مدنظر شما هست تابع GetModuleFileName هست که مسیر فایل اجرایی کنونی را بر می گرداند (برای گرفتن فولدر می توانید نام فایل اجرایی را با کدنویسی از مسیر داده شده حذف کنید):



TCHAR Buffer[1024];

GetModuleFileName( NULL, Buffer, 1024 )l

HMODULE اگر NULL باشد یعنی مسیر فایل اجرایی کنونی.