ورود

نسخه کامل مشاهده نسخه کامل : مشکل با import کردن dllهای kernerl32 و user32



CG_
02-06-2008, 19:51
آقا این kernel32.dll و user32.dll رو چرا نمیشه عین بچه آدم از import ، add reference کرد؟ بعد این کده که این زیر نوشته، در واقع همین کارو با کدنویسی می کنه؟

در واقع یه source code از یه سایتی دانلود کردم، بعد اونجا یه کلاس نوشته بود برای خاموش کردن کامپوتر. اونجا یه همچین چیزایی نوشته بود.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یه چند تا سؤال.
این که اینو نوشته، از کجا فهمید که باید چنین تابع هایی با چنین اسم هایی با چنین آرگومان هایی تعریف کنه؟

مثلاً همون طور که می بینید شبیه interface هم هست. منظورم اینه که براشون آکولاد اینا باز نکرده که بیاد توضیح بده، همون طوری با ';' گذاشته. فکر می کنم پس فقط باید یه معرفی باشه، یعنی قبلاً توش یه جا دیگه توضیح داده شده (چون extern هم هست).


بعد موضوع این IntPtr چیه؟ چرا اونو گذاشته؟ اصلاً اون واسه چیه؟ (فک کنم یه اشاره گر به نوع int ـه. خب حالا این که مال int ـه یه چیز مثل این هم برای مثلاً string یا bool هم داریم؟


آهااااااااااا، یه چیز دیگه تا یادم نرفته:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



اینو تو همون کده نوشته بود. این دیگه چه طرز struct نوشتنه؟ چرا این شکلیه؟ (با توجه به اینکه اینجا هم دوباره IntPtr نوشته)

Ultimator
05-06-2008, 14:01
نمیدانم ! صبر کن با سوادهاش بیان !یا به اساتید پی ام بده ..

m3hrz4d
05-06-2008, 21:48
من دات نت کار نیستم ولی
DLL های ویندوز مثل kernel32 یا user32 از نوع DLL های COM یا NET. نیستن بلکه فقط مجموعه ای توابع هستن (توابع API ویندوز)
بنابراین شما نمیتونین توی Add Reference این ها رو Add کنین.
کدی که شما دیدین روش استفاده از این نوع DLL هاست. کسی که میخواد یک تابع از یک DLL رو صدا بزنه باید اسم تابع و نوع تایپ آرگومان ها و تعداد اون ها رو بدونه(اسم آرگومان ها طبعا مهم نیست). در مورد DLL های ویندوز هم لیست کامل توابع API ویندوز رو براحتی میتونین توی MSDN Microsoft پیدا کنین(مثلا CreateProcess رو در گوگل سرچ کنی اولین نتیجه میشه) البته معمولا فرم C رو نوشته که اون کسی که میخواد در دات نت استفاده کنه باید به روشی که میبینین فرم NET یش رو بنویسه.

این کدها در واقع به دات نت میفهمونه که کجا باید دنبال تابع CreateProcess بگرده و آرگومان هاش چجوری هستن.

IntPtr هم تا اونجا که میدونم توی این فرم , به عنوان pointer و یا هندل , و نه فقط pointer به integer استفاده میشه. مثلا توی CreateProcess آرگومان سوم از نوع Pointer به تایپ SECURITY_ATTRIBUTES هست.
اینجا رو میتونین در این مورد بخونین
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این توابع بعضی مواقع ورودی یا خروجی هاشون struct هایی هستن که ظاهرا با struct هایی که توی دات نت به طور معمول تعریف میشه (Managed Type) متفاوتن در واقع همون struct های C هستن(Unmanaged). کد دوم هم یک struct از این نوع تعریف کرده.

CG_
05-06-2008, 22:41
اینجا رو میتونین در این مورد بخونین
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


مرسی از جوابتون :20:.
امروز از یه فروم خورجی هم پرسیدم، یکی گفت برم اینجا :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
رفتم و خیلی هم بهم حال داد جداً.
شما هم یه امتحان بزنین. اون msdn ـه هم که دادین رو همین الآن امتحان می کنم :21:.
در مورد این که چرا add reference هم نمی شه گفت که چون اسبملی شون NET. نیست.



نمیدانم ! صبر کن با سوادهاش بیان !یا به اساتید پی ام بده ..
آقای ultimator شما هم اینقدر شکسته نفسی نکنین. بابا شکسته نفس...! شما سروری...! آی لاو یو. :11:

Payman_62
06-06-2008, 17:20
سلام.
از DllImport برای استفاده از API ها استفاده میشه. این که میگی از کجا فمیده با توجه به نیازش از این API ها استفاده کرده.

_H2_
08-06-2008, 01:32
سلام
برای تکمیل جواب سوالات این دوست عزیز با اجازه اساتید دو مطلب را ذکر میکنم.


خصوصیات [StructLayout(LayoutKind.Sequential)] هم فقط یک تضمین است و اگر حذف شود هم معمولاً نباید مشکلی پیش آید !
این برچسب تضمین میکند که ترتیب اعضای ساختار توسط بهینه ساز کامپایلر هیچ تغییری نکند و اعضا عیناً به همین ترتیپ تایپ شده در کامپایل نهایی قرار گیرند.
این مسئله برای کد تحویل گیرنده ساختار بسیار ضروری است، چون اطلاعات بر اساس آفستشان بازیابی میشوند.



API مربوط به خاموش کردن نامش ExitWindowsEx است.
دو API که شما در پست اول خود درج کرده اید همانطور که دوستان اشاره کردند مطلقاً ربطی به این مسئله ندارد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید