PDA

View Full Version : سوال: استفاده از api



amir_civil
پنج شنبه 06 فروردین 1388, 13:57 عصر
با سلام
اگر بخاهیم از تابع


int MessageBox( HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
استفاده کنیم به جز استفاده از کتابخانه مربوطه چه راهایی دیگه ایی وجود داره که به کامپایلر بفهمانیم که از این تابع داریم استفاده میکنیم(والبته به جز استفاده از دی ال ال)

Nima_NF
پنج شنبه 06 فروردین 1388, 19:47 عصر
متوجه منظور شما نشدم، لطفا بیشترین توضیح دهید.

amir_civil
پنج شنبه 06 فروردین 1388, 22:52 عصر
با سلام
ببینید در کتابخانه ها برای هر ورودی ثابتی که کامپایلر میشناسه یه define وجود داره(مثلا Generic_Read( که میشه مستقیماازاون استفاده کرد
حالا یه همچین چیزی برای خود توابع هم وجود داره؟ که بدون استفاده از اسم تابع که تو msdn هست از اون استفاده کرد؟ مثلا تو اسمبلی از ادرس اون تابع به جای اسم اون استفاده میکنیم چون کامپایلر اون اسم رو نمیشناسه...حالا همچین کاری رو میشه با سی++ انجام داد؟(به عبارتی کامپایلر چه جوری متوجه میشه منظور ما از فلان تابع که از اسمش استفاده میکنیم کدوم تابع است اگر نخاهیم مثلا از windows.h استفاده کنیم چه جوری باید این تابع رو متوجه کامپایلر یا ویندوز کرد))

Nima_NF
جمعه 07 فروردین 1388, 16:38 عصر
کامپایلر برای آدرس ها و یافتن محتویات توابع در dll به linker نگاه می کند و از آنجا توابع را استخراج می کند اما نحوه خواندن پارامترها را نمی داند، برنامه شما هم هر وقت تابعی را فراخوانی می کند ابتدا باید در جایی از کدهایتان اعلان آن وجود داشته باشد،(چیزی که در dll ها ذخیره می شود تعریف محتویات تابع با همان نام تابع هست، اما اعلان آن وجود ندارد.) پس یا خودتان تابع را با همان تابع باید اعلان کنید یا با include فایل هدر را اضافه کنید، مثلا وقتی می نویسید include windows.h یعنی در همانجا تمام محتویات آن فایل .h در کد شما کپی شود. پس اگر از windows.h استفاده نمی کنید خودتان باید تمامی کلاس ها یا توابع مورد استفاده و ثابت های استفاده شده در تابع را تعریف کنید.
حال اگر دو تعریف مشابه با یک سری پارامتر مشابه در برنامه شما پیدا شود کامپایلر خطا می دهد، تنها راهکار این است که از حوزه نام استفاده کنید.


وقتی در ++C آدرس تابع را توسط مثلا GetProcAddress می گیریم، باید حتما خودمان تابع و پارامترهایش اعلان کنیم. (حتی می توانیم برای این کار یک ماکرو بسازیم)

اگر هم مستقیم از تابع استفاده می کنیم و dll را از همان ابتدا لینک می کنیم، فقط کافی هست تابع را کلا به همان شکل در فایل خودمان تعریف کنیم، یعنی برای MessageBox چیزی مشابه تعریف اصلی آن را تعریف کنیم.