۰۶-فروردین-۱۳۸۷, ۱۸:۵۲:۱۹
۰۷-فروردین-۱۳۸۷, ۰۱:۰۸:۴۵
اینم لیست تمام انواع داده های مورد استفاده در ویندوز
http://msdn2.microsoft.com/en-us/library...S.85).aspx
http://msdn2.microsoft.com/en-us/library...S.85).aspx
۰۷-فروردین-۱۳۸۷, ۱۳:۰۷:۰۰
با تشکر.
اینا که خیلی زیادند. یعنی همه اینها توی توابع api به کار میرند؟
نمیشه چنتاشون رو با یکیشون جاگذاری کرد؟ مثلا توی اون لیست چندتا handle برای چیزای مختلف بود. نمبشه بجای همهشون از خود نوع handle استفاده کرد؟ وبهمین ترتیب؟
یه چیز دیگه توی ویبی که چهار تا نوع بیشتر نداره چطوری با این توابع کار میکنند؟
اینا که خیلی زیادند. یعنی همه اینها توی توابع api به کار میرند؟
نمیشه چنتاشون رو با یکیشون جاگذاری کرد؟ مثلا توی اون لیست چندتا handle برای چیزای مختلف بود. نمبشه بجای همهشون از خود نوع handle استفاده کرد؟ وبهمین ترتیب؟
یه چیز دیگه توی ویبی که چهار تا نوع بیشتر نداره چطوری با این توابع کار میکنند؟
۰۷-فروردین-۱۳۸۷, ۱۶:۱۶:۰۴
متاسفانه بله !
تعداد بسیار زیادی از این نوع داده ها که مربوط به ویندوز هستند در ظاهر مشابه هستند ولی کاربرد های متفاوتی دارند و توابع مختلف پارامتر های مختلفی دریافت میکنند . بساری از اینها اشاره گر هستند ، string های مختلف هستند و .... که پیچیدگی کار با API رو بطور مستقیم زیاد می کنند برای همینه که کتابخونه هایی مثل Net. یا MFC بوجود اومدند تا کار مستقیم با API و انواع داده های مختلف رو کم کنند !
ویژوال بیسیک یک زبان برنامه نویسی با متغیرهای بسیار محدود تر از ویندوز هست . مثلا فقط یک مدل string در وی بی داریم ( شاید بشه گفت دو مدل یکی با طول ثابت و با طول متغیر ) اما در ویندوز چندین مدل string داریم و هر کدوم کارشون و کاربردشون فرق داره . تیم وی بی برنامه API Viewer رو برای راحت تر شدن کار شما درست کردند و معادل متغیر ها ، ساختمانهای داده و ثابت های ویندوز رو در زبان وی بی طراحی کردند که کار شما رو برای برنامه نویسی با اونها بسیار ساده تر میکنه اما این کافی نیست.
به همین دلایل ، تمام کنترل و صدا زدن درست و دقیق توابع API و ارسال متغییر های مناسب به اونها بر عهده شماست . وی بی هیچ کاری نمیکنه بلکه فقط متغیر های شما رو به همون شکلی که هستند به توابع API میفرسته !
بر فرض مثال شما مجبور هستید که متغیر string رو با 0 ( یا همون NULL در زبان سی ) پر کنید و بعد اونو به توابع API بفرستید . دلیلش اینه که ویندوز انتهای تمام string ها رو با کارکتر 0 یا NULL تشخیص میده ! در واقع این شما هستید که باید متغیر های خودتون رو برای ارسال به توابع آماده کنید !!
همینطور اگر کوچکترین خطایی در صدا زدن این توابع رخ بده ، سیستم یا برنامه شما کراش میکنه و وی بی قابلیت کنترل و بررسی اونها رو نداره . علتش اینه که وی بی فقط متغیر های شما رو به توابع API میفرسته و اونها رو صدا میزنه بقیه کار با ویندوزه . اینجا هر خطای مهلکی میتونه حتی منجر به کراش کردن محیط وی بی بشه !!!
تعداد بسیار زیادی از این نوع داده ها که مربوط به ویندوز هستند در ظاهر مشابه هستند ولی کاربرد های متفاوتی دارند و توابع مختلف پارامتر های مختلفی دریافت میکنند . بساری از اینها اشاره گر هستند ، string های مختلف هستند و .... که پیچیدگی کار با API رو بطور مستقیم زیاد می کنند برای همینه که کتابخونه هایی مثل Net. یا MFC بوجود اومدند تا کار مستقیم با API و انواع داده های مختلف رو کم کنند !
ویژوال بیسیک یک زبان برنامه نویسی با متغیرهای بسیار محدود تر از ویندوز هست . مثلا فقط یک مدل string در وی بی داریم ( شاید بشه گفت دو مدل یکی با طول ثابت و با طول متغیر ) اما در ویندوز چندین مدل string داریم و هر کدوم کارشون و کاربردشون فرق داره . تیم وی بی برنامه API Viewer رو برای راحت تر شدن کار شما درست کردند و معادل متغیر ها ، ساختمانهای داده و ثابت های ویندوز رو در زبان وی بی طراحی کردند که کار شما رو برای برنامه نویسی با اونها بسیار ساده تر میکنه اما این کافی نیست.
به همین دلایل ، تمام کنترل و صدا زدن درست و دقیق توابع API و ارسال متغییر های مناسب به اونها بر عهده شماست . وی بی هیچ کاری نمیکنه بلکه فقط متغیر های شما رو به همون شکلی که هستند به توابع API میفرسته !
بر فرض مثال شما مجبور هستید که متغیر string رو با 0 ( یا همون NULL در زبان سی ) پر کنید و بعد اونو به توابع API بفرستید . دلیلش اینه که ویندوز انتهای تمام string ها رو با کارکتر 0 یا NULL تشخیص میده ! در واقع این شما هستید که باید متغیر های خودتون رو برای ارسال به توابع آماده کنید !!
همینطور اگر کوچکترین خطایی در صدا زدن این توابع رخ بده ، سیستم یا برنامه شما کراش میکنه و وی بی قابلیت کنترل و بررسی اونها رو نداره . علتش اینه که وی بی فقط متغیر های شما رو به توابع API میفرسته و اونها رو صدا میزنه بقیه کار با ویندوزه . اینجا هر خطای مهلکی میتونه حتی منجر به کراش کردن محیط وی بی بشه !!!
۱۴-فروردین-۱۳۸۷, ۱۴:۴۲:۲۳
یه سوال دیگه.
توی نرم افزار APIViwer که میشه زبان رو انتخاب کرد. در vb6 بعضی از پارامتر ها از نوع any مشخص میشند.توی vb.net با int32. توی c# با int . توی delphi با pointer.
میخواستم بدونم اینجور پارامتر ها توی c از چه نوعی تعریف شدند که توی هر زبانی یه نوعیه؟
در ضمن. آیا جایی هست یا روشی هست که بشه تعریف عنوان تمام توابع api رو در زبان c دید؟
توی نرم افزار APIViwer که میشه زبان رو انتخاب کرد. در vb6 بعضی از پارامتر ها از نوع any مشخص میشند.توی vb.net با int32. توی c# با int . توی delphi با pointer.
میخواستم بدونم اینجور پارامتر ها توی c از چه نوعی تعریف شدند که توی هر زبانی یه نوعیه؟
در ضمن. آیا جایی هست یا روشی هست که بشه تعریف عنوان تمام توابع api رو در زبان c دید؟
۱۴-فروردین-۱۳۸۷, ۲۱:۲۱:۴۷
نقل قول: در vb6 بعضی از پارامتر ها از نوع any مشخص میشند.توی vb.net با int32. توی c# با int . توی delphi با pointer. میخواستم بدونم اینجور پارامتر ها توی c از چه نوعی تعریف شدند که توی هر زبانی یه نوعیه؟
اگر از ساختمان ماشین و کامپیوترهای IMB PC اطلاع داشته باشید باید بدونید که کوچکترین مقدار قابل آدرس دهی اعداد صحیح از 8 بیت ( 1بایت ) شروع میشه تا 64 بیت و حتی 128 بیت ( بعلاوه چندین مدل اعداد اعشاری از جمله 32 و 64 بیتی ) که هر کدومشون میتونن در شکل های مختلفی استفاده بشن !
کامپایلرها تنها کاری که میکنند اینه که یک زیر مجموعه مورد نیاز رو انتخاب میکنند و بهش اسم میدن مثلا توی ++C/C داده های 8 بیتی ( 1 بایتی) char نامیده میشن . داده های 16 بیتی یا دو بایتی short و داده های 32 بیتی int نامیده میشن و .... حالا دیگه این بستگی به زبان مورد نظر شما داره که چطور این بیت و بایت ها رو نامگذاری کنه و کامپایلر چه امکاناتی برای استفاده از اون چند بیت فراهم کنه . مثلا 8 بیت داده در C همنطور که گفتم char نامیده میشه که سه شکل کاربرد داره : یک عدد صحیح مثبت بین 0 تا 255 ( یا بین 127- تا 128 ) و یا ذخیره یک کاراکتر ASCII . پس در زبان ++C/C این نوع داده 3 شکل میتونه داده ذخیره کنه !!!!
اگر چه همین 8 بیت در جاوا مثلا به اسم Byte شناخته میشه که فقط همون عدد صحیحه ( بین 127- تا 128 ) و نمیتونیم توش کاراکتر ذخیره کنیم ، پس اینجا 8 بیت در جاوا فقط یک شکل داره . امیدوارم متوجه شده باشی که این اسمها و نوع ها همه وابسته به ماشین و کامپایلر هستند !!
نقل قول: در ضمن. آیا جایی هست یا روشی هست که بشه تعریف عنوان تمام توابع api رو در زبان c دید؟
توابع API همه به زبان C نوشته شدن و توضیحات اون هم باید در زبان C نوشته شده باشن . کل توابع API ویندوز در MSDN به زبان C نوشته و مستند سازی شدن !! لطفا به اونجا سر بزنید .
مثال : شکل کلی تابع FindWindowEx با تمام نکات و پارامتر ها و مقادیر بازگشتی اون
http://msdn2.microsoft.com/en-us/library...S.85).aspx
۱۵-فروردین-۱۳۸۷, ۱۰:۳۱:۴۶
راست میگن آب در کوزه و ما گرد جهان میگردیم. آقا ممد دستت حسابی درد نکنه(به توان 2).
۱۵-فروردین-۱۳۸۷, ۱۳:۰۸:۲۷
و یه سوال دیگه. توی زبان c وقتی میخواستیم متغیری رو از نوع مرجع ارسال کنیم یه & میگذاشتیم پشتش. توی vb هم با byref و byval . توی دلفی هم با یه var . خب از اینا که بگذریم.
تعریف تابع acmDriverClose در C :
MMRESULT acmDriverEnum(
ACMDRIVERENUMCB fnCallback,
DWORD_PTR dwInstance,
DWORD fdwEnum
);
معادلش در vb.net :
Declare Function acmDriverEnum Lib "msacm32.dll" ( _
ByVal fnCallback As Int32, _
ByRef dwInstance As Int32, _
ByVal fdwEnum As Int32) As Int32
و معادلش در دلفی :
function acmDriverEnum (fnCallback : Integer;
var dwInstance : Integer;
fdwEnum : Integer) : Integer;
stdcall; external 'msacm32' name 'acmDriverEnum'
خب در این تابع پارامتر dwInstance در vb و دلفی از نوع مرجع مشخص شده ولی در C هیچ علامتی مشخص کنندهای نیست. پس از کجا مشخص میشه که این از نوع مرجعه؟
تعریف تابع acmDriverClose در C :
MMRESULT acmDriverEnum(
ACMDRIVERENUMCB fnCallback,
DWORD_PTR dwInstance,
DWORD fdwEnum
);
معادلش در vb.net :
Declare Function acmDriverEnum Lib "msacm32.dll" ( _
ByVal fnCallback As Int32, _
ByRef dwInstance As Int32, _
ByVal fdwEnum As Int32) As Int32
و معادلش در دلفی :
function acmDriverEnum (fnCallback : Integer;
var dwInstance : Integer;
fdwEnum : Integer) : Integer;
stdcall; external 'msacm32' name 'acmDriverEnum'
خب در این تابع پارامتر dwInstance در vb و دلفی از نوع مرجع مشخص شده ولی در C هیچ علامتی مشخص کنندهای نیست. پس از کجا مشخص میشه که این از نوع مرجعه؟
۱۵-فروردین-۱۳۸۷, ۱۹:۳۹:۲۰
مبنای ارسال پارامتر با مرجع (Passing By Reference ) در زبان ++C/C به دو شکل انجام میشه :
1- استفاده از pointer ها ( اشاره گر ها )
2-استفاده از مرجع یا همون &
اگرچه در زبان ++C/C این دوتا از نظر ساختار متفاوت هستند ولی تقریبا یک کار رو انجام میدن . نکته مهم اینه که در زبان وی بی ما اشاره گر نداریم ، پس ارسال پارامتر در در وی بی بشکل مرجع فقط یک جور امکان داره اونهم با بکار بردن ByRef .
در مثالی که شما زدی متغیر dwInstance از نوع DWORD_PTR تعریف شده .
اگر دقت کنی از روی نامگذاریه مایکروسافت میتونی راحت پی ببری که یک نوع اشاره گر هست یا نه ! اون PTR که در آخرش نام گذاری شده یعنی که این نوع ، یک pointer یا اشاره گر هست و از طریق ارسال با مرجع منتقل میشه در نتیجه برای تعریف کردن مشابه در وی بی باید از ByRef استفاده کنیم . بطور کلی مایکروسافت داده های مورد استفاده ویندوز رو به شکلی نام گذاری کرده که برنامه نویسان بتونن اشاره گر بودن اونو تشخیص بدن . من میتونم یه شکل کلی ازشون بهت ارائه بدم :
نوع هایی که اولشون حرف P هست ( به معنای Pointer ) مثل PDWORD ، PHANDLE ، PINT
نوع هایی که آخرشون پسوند PTR_ دارند مثله همون DWORD_PTR ( اگر چه این مدل داده ها واقعا اشاره گر نیستند ولی برای عملیات ریاضی روی اشاره گر ها بکار میرن)
نوع هایی که اولشون LP دارند ( به معنای Long Pointer ) مثل LPTSTR ، LPLONG
البته باید بدونیم که در VB 6 ذکر ByRef اجباری نیست چون تمام پارامتر ها به توابع یا ساب روتین ها بصورت default بشکل مرجع ارسال میشن و برای همین ByRef بسیاری اوقات نوشته نمیشه ( اگر هم نوشته میشه واسه مستند سازی و آگاهی برنامه نویسه نه چیز دیگه !!) پس چه اونو ذکر کنیم چه نکنیم هیچ تفاوتی وجود نداره . در طرفی دیگه ذکر ByVal اجباری هست و باید مشخص کنیم کدوم پارمتر رو ما بصورت مقدار ارسال میکنیم .
در زبان ++C/C تمام پارامتر ها بشکل مقدار ارسال میشن بجز آرایه ها ، اشاره گر ها و مرجع ها . برای همینه که در تعریف توابع API در وی بی پارامتر های ByVal زیاد دیده میشن .
1- استفاده از pointer ها ( اشاره گر ها )
2-استفاده از مرجع یا همون &
اگرچه در زبان ++C/C این دوتا از نظر ساختار متفاوت هستند ولی تقریبا یک کار رو انجام میدن . نکته مهم اینه که در زبان وی بی ما اشاره گر نداریم ، پس ارسال پارامتر در در وی بی بشکل مرجع فقط یک جور امکان داره اونهم با بکار بردن ByRef .
در مثالی که شما زدی متغیر dwInstance از نوع DWORD_PTR تعریف شده .
اگر دقت کنی از روی نامگذاریه مایکروسافت میتونی راحت پی ببری که یک نوع اشاره گر هست یا نه ! اون PTR که در آخرش نام گذاری شده یعنی که این نوع ، یک pointer یا اشاره گر هست و از طریق ارسال با مرجع منتقل میشه در نتیجه برای تعریف کردن مشابه در وی بی باید از ByRef استفاده کنیم . بطور کلی مایکروسافت داده های مورد استفاده ویندوز رو به شکلی نام گذاری کرده که برنامه نویسان بتونن اشاره گر بودن اونو تشخیص بدن . من میتونم یه شکل کلی ازشون بهت ارائه بدم :
نوع هایی که اولشون حرف P هست ( به معنای Pointer ) مثل PDWORD ، PHANDLE ، PINT
نوع هایی که آخرشون پسوند PTR_ دارند مثله همون DWORD_PTR ( اگر چه این مدل داده ها واقعا اشاره گر نیستند ولی برای عملیات ریاضی روی اشاره گر ها بکار میرن)
نوع هایی که اولشون LP دارند ( به معنای Long Pointer ) مثل LPTSTR ، LPLONG
البته باید بدونیم که در VB 6 ذکر ByRef اجباری نیست چون تمام پارامتر ها به توابع یا ساب روتین ها بصورت default بشکل مرجع ارسال میشن و برای همین ByRef بسیاری اوقات نوشته نمیشه ( اگر هم نوشته میشه واسه مستند سازی و آگاهی برنامه نویسه نه چیز دیگه !!) پس چه اونو ذکر کنیم چه نکنیم هیچ تفاوتی وجود نداره . در طرفی دیگه ذکر ByVal اجباری هست و باید مشخص کنیم کدوم پارمتر رو ما بصورت مقدار ارسال میکنیم .
در زبان ++C/C تمام پارامتر ها بشکل مقدار ارسال میشن بجز آرایه ها ، اشاره گر ها و مرجع ها . برای همینه که در تعریف توابع API در وی بی پارامتر های ByVal زیاد دیده میشن .
۱۶-فروردین-۱۳۸۷, ۰۸:۱۷:۳۵
فکر کردم یه تشکر کمه. بازم تشکر.