PDA

View Full Version : سوال: چگونگی استفاده از دستور AddressOf



IranVB
پنج شنبه 21 بهمن 1389, 08:56 صبح
سلام به همگی،
من در برخی دستورات api این کلمه کلیدی رو مشاهده میکنم: AddressOf
البته اطلاع دارم که این کلید برای صدا زدن یک فانکشن از طرف api بکار میره (همانند دستور Call در خود vb)

اما نمیدونم که از مجا بدانیم که پارامترهای تابع مورد نظر رو چه بذاریم، مثل نمونه زیر:



Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Function TextBoxProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If wMsg = WM_MOUSEWHEEL Then
Form1.Text1 = IIf(wParam < 0, "Wheel Down", "Wheel UP")
End If

TextBoxProc = CallWindowProc(OldProc, wHwnd, wMsg, wParam, lParam)
End Function


Private Sub Command1_Click()
OldProc = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf TextBoxProc)
End Sub


در نمونه بالا به اون پارامترهای قرمز رنگ توجه کنین، سوال من این بود که از کجا بدونم باید این پارامترها رو در این فانکشن وارد کنم

با تشکر از همگی

returnx
پنج شنبه 21 بهمن 1389, 17:46 عصر
دستور AddrssOf آدرس یک تابع را در رم بر میگردونه که نحوه استفاده از این دستور هم به شکل زیر است:

AddressOf function name
بجای Function name نام یک تابع عمومی (Public) قرار می گیرد که باید در module نوشته شود...
در واقع این دستور نقش اشاره گر را بازی میکند.

در نمونه بالا به اون پارامترهای قرمز رنگ توجه کنین، سوال من این بود که از کجا بدونم باید این پارامترها رو در این فانکشن وارد کنم

خوب همونطور که می بینید ابتدای پارامتر ها با کلمه کلیدی Byval آغاز شده که مخفف Byvalue یا همون با مقدار است در این نوع پارامتر ها حتما باید یک مقدار وارد شود اما نوع دیگری از پارامتر است
که Byref هستند یعنی با ارجا که این ها هم باید پر شوند اما میتوان به آنها یک متغیر انتصاب نمود در غیر اینصورت اگر ابتدا پارامتر با ByVal شروع نشود می تونید این پارامتر را خالی بزارید.

IranVB
پنج شنبه 21 بهمن 1389, 18:16 عصر
خیلی ممنون
اما اینو نمیخواستم
فکر کنم بد توضیح دادم؛ من میخواستم بدونم که از کجا باید اطلاع داشته باشم که در این تابع:
Public Function TextBoxProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

باید اون چهار پارامتر قرمزه رو وارد کنم یعنی از کجا بدونم که تابعی که AddressOf اونو صدا میزنه دارای چهار پارامتر از نوع Long هست
آیا این اطلاعات رو جایی مثلا مایکروسافت اعلام کرده یا از راه دیگه؟

خیلی ممنون

returnx
پنج شنبه 21 بهمن 1389, 19:08 عصر
نمی دونم شاید بازم منظورتون نگرفته باشم ، اما زمانی که شما پرانتز رو باز میکنید تا پارامتر ها رو وارد کنید خوب یک Tooltip باز میشه که نوع پارامتر ها رو میگه دیگه...
به عکس زبر توجه کنید:

IranVB
پنج شنبه 21 بهمن 1389, 19:23 عصر
نه ببینین اینجوری:
من این API رو در ماژول قرار دادم:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

خب حالا میخوام توسط کامندباتن موجود در فرم برنامم ازش استفاده کنم، طبیعتا برای این API باید یک تابع رو در یک ماژول تعریف کنم که باید با AddressOf فراخوانی بشه، حالا میا توو ماژول و شروع میکنم تابع رو نوشتن:
اینا رو نوشتم:
Public Function TextBoxProc(؟؟؟؟؟؟
تا اینجاش دیگه گیر میکنم که APIی SetWindowLong چه پارامترهایی رو لازم داره که باید بجای علامت های سوال به عنوان پارامتر واسه تابعه بنویسم

امیدوارم منظورم رو رسونده باشم

باتشکر

returnx
پنج شنبه 21 بهمن 1389, 21:53 عصر
طبیعتا برای این API باید یک تابع رو در یک ماژول تعریف کنم که باید با AddressOf فراخوانی بشه، حالا میا توو ماژول و شروع میکنم تابع رو نوشتن:


خوب مشکل همینجاست ، زمانی که شما تابع تون رو Declare می کنید چه بصورت Public یا Private دیگه برای استفاده از این تابع نیازی به Addrss Of ندارید ما زمانی از Address Of استفاده میکنیم که یک تابع دیگه نیاز به آدرس تابع ما داره...
به طور مثال تابع CreateThread ، این تابع برای ما یک نخ می سازه (برای چند برنامگی) که می تونیم به صورت همزمان چند تابع رو اجرا کنیم ، ما اینجا برای اینکه بگیم کدوم تابع رو اجرا کنیم مجبوریم که آدرس تابع خودمون رو به این تابع بدیم و اینجا ما از Address of استفاده میکنیم...

Public Declare Function CreateThread Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long

نمیدونم شاید باز هم منظورتون رو نگرفته باشم، یا من گیراییم پایینه یا شما بد توضیح می دید...
اگه باز هم منظورتون این نبود شما سوالتون رو واضح تر بپرسید تا بتونیم به شما کمک کنیم...

IranVB
پنج شنبه 21 بهمن 1389, 22:15 عصر
نه، اصلا" منظورم این نیست، اگه یه بار دیگه پست 5 رو به دقت بخونین متوجه میشین:
هدف من از ایجاد این تاپیک فقط اینه که چه گونه من بفهمم که باید چه پارامترهایی رو در تابعی که در پست 5 مشخص کرده ام بنویسم یعنی از مجا بد انم که باید در تابع TextBoxProc پارامترهای قرمز رنگ زیر رو که دستور SetWindowLong لازمشون داره پبنویسم؟

Public Function TextBoxProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

returnx
پنج شنبه 21 بهمن 1389, 23:14 عصر
آها شما مشکلتون اینه که نمیدونید جای هر یک از این پارامتر ها چی باید بزاید، خوب اصولا در این مواقع از یک Refrence استفاده می شود و من هم به شما برنامه API-Guide رو پیشنهاد میکنم که همراش مثال هم هست ...
از لینک زیر دانلودش کنید حجمش کمه حدودا 2MB ...
http://npmpro.blogfa.com/post-47.aspx

IranVB
پنج شنبه 21 بهمن 1389, 23:46 عصر
احسنت، منظور من هم همین بود که آیا دوستان برای استفاده از APIیی نظیر همینی که در این تاپیک گفتم از Reference استفاده میکنند یا اینکه خودشون میدونن چی بنویسن (از روی تجربه و مهارتی که کسب کردن)؛ دستتون درد نکنه API-Guide رو داشتم؛
سربلند و پیروز باشید

returnx
جمعه 22 بهمن 1389, 10:23 صبح
خوب از همون اول این جمله رو می گفتید:

منظور من هم همین بود که آیا دوستان برای استفاده از APIیی نظیر همینی که در این تاپیک گفتم از Reference استفاده میکنند یا اینکه خودشون میدونن چی بنویسن (از روی تجربه و مهارتی که کسب کردن)

IranVB
جمعه 22 بهمن 1389, 11:21 صبح
البته این مطلبی که در پست آخری نوشتم؛ ذهنیتم از این بود نه منظور سوالم
و اگه به آخر پست3 نگاه کنین سوال کرده بودم که منبع این اطلاعات ممکنه از کجا باشه؟
اما فکر کنم متوجه نشده بودین

به هرحال بازم یه دونه thanks بخاطر همراهیتون