كنترل پنل             جستجو               پرسشهای متداول            .:: آخرین پست‌های انجمن ::.            لیست اعضا            مدیران سایت             درجات        ورود
فهرست انجمن‌ها -> عمومي برنامه‌نويسي -> ويژوال بيسيك VB
پاسخ دادن به این موضوع رفتن به صفحه قبلی  1, 2, 3, 4, 5, 6, 7, 8, 9  بعدی
آموزش گام به گام ویژوال بیسیک 6
پست تاریخ: دوشنبه 5 دی 1384 - 02:39    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

موضوع : پخش موزيک توسط DirectMusic

مقدمه :

در اولين درس از آموزش DirectXAudio با چگونگي پخش افکتهاي صوتي آشنا شديد . اکنون اين توانايي را داريد که يک engine ساده صوتي بنويسيد . در اين بخش مباني پخش موزيک را فرا خواهيد گرفت . پس از اين درس شما مي توانيد يک ماژوال براي پخش موزيکهاي پس زمينه و افکتهاي صوتي براي برنامه هايتان ايجاد کنيد .

Initil کردن DirectMusic8 :

قبل از هر کار بايستي ماژول DirectMusic8 را مقداردهي اوليه کنيد . اينکار بصورت زير انجام مي شود :


Option ExplicitImplements DirectXEvent8
Private oDX As DirectX8
Private oDMPerf As DirectMusicPerformance8
Private oDMLoader As DirectMusicLoader8
Private oDMSeg As DirectMusicSegment8

Dim dmParams As DMUS_AUDIOPARAMS
Set oDX = New DirectX8
Set oDMPerf = oDX.DirectMusicPerformanceCreate
Set oDMLoader = oDX.DirectMusicLoaderCreate
oDMPerf.InitAudio frmMain.hWnd, DMUS_AUDIOF_ALL, dmParams, Nothing, DMUS_APATH_DYNAMIC_STEREO, 128
oDMPerf.SetMasterAutoDownload True


شي DirectMusicLoader8 کمک مي کند تا موزيک درون بافر load شود .
شي DirectMusicSegment8 مموزيکي را که بايد پخش شود ذخيره مي کند .
کد فوق کافي است يکبار زمانيکه برنامه آغاز مي شود ، اجرا گردد .
اکنون ما يک واسط مقدار دهي شده از DirectMusic داريم اما قبل از اينکه موزيک را Load کرده و پخش کنيم چگونگي terminate کردن DirectMusic را در زير مي بينيد :


If ObjPtr(oDMSeg)Then Set oDMSeg = Nothing
If ObjPtr(oDMLoader)Then Set oDMLoader = Nothing
If Not (oDMPerf Is Nothing) Then
oDMPerf.CloseDown
Set oDMPerf = Nothing
End If
If ObjPtr(oDX) Then Set oDX = Nothing



پيغامها :

در برخي از component هاي DirectX8 مثل Input , Sound , Music و Play برنامه شما بايستي يک سيستم messaging را برپا کند تا DirectX زمان وقوع برخي رخدادهاي خاص را بشما گزارش دهد . اين مطلب بخصوص زمانيکه يک موزيک را پخش مي کنيد مفيد است براي مثال مي تواند زمان خاتمه يافتن موزيک را به شما اطلاع دهد و آنگاه شما مي توانيد قطعه موزيک بعدي را پخش کنيد .
پيغامها توسط يک سيستم callback انجام مي شوند . کد زير را در تابع InitDMusic تان پس از initial کردن DirectMusic8 قرار دهيد :


oDMPerf.AddNotificationType DMUS_NOTIFY_ON_SEGMENT
hEvent = oDX.CreateEvent(Me)x
oDMPerf.SetNotificationHandle hEvent


اولين سطر به DirectMusic مي گويد چه نوع پيغامهايي را مي خواهيد به برنامه تان بفرستد . چندين نوع پيغام وجود دارد :
DMUS_NOTIFY_ON_SEGMENT = اطلاعات موزيک فعلي ( شروع پخش ، پايان پخش و غيره )
DMUS_NOTIFY_ON_CHORD = اطلاعات تغيير chord موزيک
DMUS_NOTIFY_ON_COMMAND = زمانيکه يک event فرماني صدا زده شود .
DMUS_NOTIFY_ON_MEASUREANDBEAT = اطلاعات beat/measure مربوط به موزيک فعلي
DMUS_NOTIFY_ON_PERFORMANCE = که event مربوط به سطح performance می باشد .
DMUS_NOTIFY_ON_RECOMPOSE = که recomposition event می باشد .
آخرين بخش از پيغام دهي ، تابع اصلي آن مي باشد . همانطور که در بخش Initial کردن DirectMusic ديديد يک توصيف بصورت Implements DirectXEvent8 داشتيم . بخش اصلي تابع callback مربوط به DirectXEvent8 ، شامل يک select case است که بين پيغامهاي مختلف سوئيچ می کند :


Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)x
If eventid = hEvent Then
Dim dmMSG As DMUS_NOTIFICATION_PMSG
If Not oDMPerf.GetNotificationPMSG(dmMSG) Then
Else
Select Case dmMSG.lNotificationOption
Case DMUS_NOTIFICATION_SEGABORT
Case DMUS_NOTIFICATION_SEGALMOSTEND
Case DMUS_NOTIFICATION_SEGEND
Case DMUS_NOTIFICATION_SEGLOOP
Case DMUS_NOTIFICATION_SEGSTART
Case Else
End Select
End If
End If
End Sub

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:40    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

پخش موزيک / متوقف کردن موزيک :

براي پخش يک موزيک ابتدا بايستي آنرا load کنيد . اينکار توسط کد زير انجام مي شود :


oDMLoader.SetSearchDirectory App.Path & "\"x
Set oDMSeg = oDMLoader.LoadSegment(App.Path & FILENAME)oDMSeg.SetStandardMidiFile


DirectMusic تنها چهار نوع فرمت صوتي را مي پذيرد : WAV ، MID ، RMI و SEG .
براي پخش فايلهاي MP3 بايستي از DirectXShow استفاده کنيد که آنرا در درسهاي بعدي خواهيد ديد .
اکنون که داده هاي فايل صوتي درون بافر load شد مي توانيد آنرا پخش کنيد :


oDMSeg.SetRepeats 0
oDMPerf.PlaySegmentEx oDMSeg, DMUS_SEGF_DEFAULT, 0


تعداد پخش شدن فايل را با متد SetRepets تنظيم کنيد . اگر اين مقدار صفر باشد ، آهنگ تنها يکبار پخش مي شود و اگر 1- باشد بطور ممتد پخش خواهد شد .
براي متوقف کردن موزيک از کد زير استفاده کنيد :


oDMPerf.StopEx oDMSeg, 0, DMUS_SEGF_DEFAULT


براي تنظيم ميزان صدا از متد SetMasterVolume استقاده کنيد :


oDMPerf.SetMasterVolume yourvalue


رنج صدا بين 20+ دسی بل تا 200- دسي بل است .
براي تنظيم Tempo از متد SetMasterTempo استفاده کنيد :


oDMPerf.SetMasterTempo yourvalue/ 100


بطور نرمال tempo برابر 1 مي باشد . عدد 2 سرعت را دو برابر مي کند و عدد 0 موزيک را قطع مي کند .
-------------------------------

موضوع : ايجاد صدای سه بعدی توسط DirectSound3D

مقدمه

تاکنون با چگونگي پخش افکتهاي صوتي و موسيقي پس زمينه توسط DirectXAudiuo آشنا شديد . اين مطالب براي کاربردهاي ساده مناسبند اما اينکه فقط ما صداي استريو داشته باشيم کافي نيست و در کاربردهاب حرفه اي بايستي از صداهاي کاملاً سه بعدي استفاده کنيم .
با استفاده از افکتهاي صوتي سه بعدي مي توانيم صدا را در تمام جهتها براي کاربر شبيه سازي کنيم اما با همه مزاياي صداي سه بعدي ، دو اشکال براي آن وجود دارد : اول اينکه پخش صداي سه بعدي پيچيده تر از پخش صداي عادي است و تنها کارت هاي سخت افزاري جديد بطور کاملاً واقعي از آن پشتيباني مي کنند و دوم اينکه صداي سه بعدي با 4 بلندگو يا بيشتر حاصل مي شود – کيفيت حالت 2 بلندگو بد نيست اما در مقايسه با حالت 4 بلندگو ، بسيار کيفيت صداي سه بعدي پايين است .

برپاسازي DirectSound3D

برپاسازي صداي سه بعدي چندان پيچيده نيست اما هر بافر صوتي که براي يک صداي سه بعدي مي سازيد ، يک overhead را به سيستم تان اضافه مي کند . همچنين برخي درايورها هستند که تنها اجازه ايجاد تعداد محدودي بافر سه بعدي را در يک لحظه مي دهند و نيز اغلب درايورها تعداد بافرهاي سه بعدي که مي توان در يک لحظه پخش کرد را محدود مي کنند ( معمولاً 8 تا 16 بافر ) .
اولين قدم در استفاده از صداي سه بعدي تعريف متغيرها و اشيا زير است :


Dim DSBuffer As DirectSoundSecondaryBuffer8
Dim DSBuffer3D As DirectSound3DBuffer8
Dim DSBListener As DirectSound3DListener8


تنها دو شي آخر براي شما جديد هستند . شي DirectSound3dBuffer8 يک ارائه سه بعدي از بافرهاي عادي است . ما همچنان از DirectSoundSecondaryBuffer8 براي نگهداري داده صوتي استفاده مي کنيم و از DirectSound3Dbuffer8 براي نگهداري پارامترهاي سه بعدي و تنظيمات سه بعدي استفاده مي کنيم . شي DirectSound3Dlistener8 نيز يک listener است و براي تنظيم کردن سرعت و جهت صدا و برخي پارامترهاي ديگر استفاده مي شود .
مرحله دوم ، ساخت بافر صوتي است . اين کار در دو بخش انجام مي شود . اول ما يک بافر صوتي نرمال مي سازيم و سپس يک واسط بافر صوتي سه بعدي را از آن بدست مي آوريم :


If Not (DSBuffer Is Nothing) Then DSBuffer.Stop
Set DSBuffer = Nothing
DSBDesc.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_CTRLVOLUME
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & "\blip.wav", DSBDesc)x
If DSBDesc.fxFormat.nChannels > 1 Then
MsgBox "You can only use mono (1 channel) sounds with DirectSound3D"x
End If
If optLow.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_NO_VIRTUALIZATION
If optMedium.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_LIGHT
If optHigh.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_FULL
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & "\blip.wav", DSBDesc)x
Set DSBuffer3D = DSBuffer.GetDirectSound3DBuffer()x


سه نکته است که بايد به آن دقت شود :
1 – اضافه کردن DSBCAPS_CTRL3D بسيار مهم است . شما اگر اين پارامتر را بکار نبريد ، قادر نخواهيد بود که واسط سه بعدي را بدست آوريد .
2 – ما بايستي تنها از افکتهاي صوتي Mono ( تک کاناله ) استفاده کنيم زيرا افکت صوتي استريو در صداي سه بعدي معنا ندارد زيرا صدا از يک نقطه در فضاي سه بعدي مي آيد .
3 – سطح الگوريتم سه بعدي – که در پارامتر DSBDesc.guid3Dalgorhthm آمده . حالت NO VIRTULIZATION تنها از CPU استفاده مي کند و روي تمام سيستم ها کار مي کند اما افکتها مينيمم هستند . حالت HRTF LIGHT هم از CPU و هم سخت افزار کارت صوتي استفاده مي کند و کيفيت بهتري را نسبت به خالت اول ارائه مي دهد . حالت HRTF FULL بهترين حالت است اما در صورتي درست کار مي کند که يک سخت افزار سه بعدي داشته باشيد .
آخرين پارامتري که بايد تنظيم کنيم شي listener است :


DSBDesc_2.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_PRIMARYBUFFER
Set DSBPrimary = DS.CreatePrimarySoundBuffer(DSBDesc_2) x
Set DSBListener = DSBPrimary.GetDirectSound3Dlistener
DSBListener.SetOrientation 0#, 0#, 1#, 0#, 1#, 0#, DS3D_IMMEDIATE


تا اينجا صداي سه بعدي ما آماده است و مي توانيم برخي پخش بافر را مشابه درسهاي قبلي شروع کنيد .
پارامترهاي اختياري :

چند پارامتر وجود دارد که مي توان آنها را تغيير داد :
1 – Volume : عدد 0 بيشترين ميزان صدا و عدد 3000 - کمترين ميزان صدا را دارد :


If DSBuffer Is Nothing Then Exit Sub
DSBuffer.SetVolume scrlVolume.Value


2 – Position : تنظيم محل listener :


DSBuffer3D.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE
DSBListener.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE


3 – Velocity : تنظيم سرعت و جهت منبع صدا :


DSBuffer3D.SetVelocity X, Y, Z, DS3D_IMMEDIATE
DSBListener.SetVelocity X, Y, Z, DS3D_IMMEDIATE


4 – Dppler Effect : انحراف صدا از مسيري که مي پيمايد انحراف سرعت حرکت صدا :


DSBListener.SetDopplerFactor CSng(scrlDoppler.Value), DS3D_IMMEDIATE


5 – Rolloff Effect : rolloff چگونگي تضعيف صدا با تغيير فاصله است .


DSBListener.SetRolloffFactor CSng(scrlRolloff.Value), DS3D_IMMEDIATE


6 – Distance : ماکزيمم فاصله اي که يک صدا مي تواند شنيده شود :


DSBuffer3D.SetMaxDistance 250, DS3D_IMMEDIATE
DSBuffer3D.SetMinDistance 0.01, DS3D_IMMEDIATE

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:41    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4
مقدمه :

برای آشنايي با مبانی شبکه های TCP/IP به بحث مروری بر TCP/IP مراجعه کنيد .

معرفی :

کتابخانه WinPcap يک معماری برای استخراج Packet های TCP/IP و آناليز شبکه در محيطهای ۳۲ بيتی ويندوز می باشد . اين کتابخانه شامل سه بخش است :

۱ - يک فيلتر Packet در سطح هسته سيستم عامل ( Kernel )

۲ - يک کتابخانه dll سطح پايين ( low-level ) با نام packet.dll

۳ - يک کتابخانه مستقل از سيستم عامل و سطح بالا ( high-level ) با نام wpcap.dll

فيلتر packet يک درايور دستگاه ( device driver ) است که به ويندوزهای ۹۵ ، ۹۸ ، ME ، NT و ۲۰۰۰ قابليت استخراج و capture کردن و نيز ارسال داده خام ( raw data ) از يک کارت شبکه را می دهد . همچنين اين امکان را دارد که packet های capture شده را در يک بافر ذخيره کند و يا آنها را فيلتر نمايد .
packet.dll يک API است که بمنظور دسترسی مستقيم به عملکرد درايور packet استفاده می شود . بنابراين packet.dll يک واسط برنامه نويسی مستقل از سیستم عامل های مايکروسافت را مهيا می کند .
Wpcap.dll مجموعه ای از ابزارهای سطح بالای اصلی برای capture را مهيا می کند که اين توابع با کتابخانه libpcap ( کتابخانه capture در سيستم عامل UNIX ) سازگار می باشند . اين توابع اجازه capture کردن packet ها را با روشی مستقل از سخت افزار شبکه و مستقل از سيستم عامل مهيا می کنند .

دريافت کتابخانه WinPcap :

نسخه WinPcap 2.2 :
برای دريافت برنامه auto-installer ( شامل درايور و DLL های مربوطه ) برای سيستم هایWindows 95/98/ME/NT/2000 به آدرس زير مراجعه کنيد :
WinPcap auto-installer (driver +DLLs)
برای دريافت بسته توسعه دهنده اين کتابخانه که شامل برنامه های نمونه ايجاد شده توسط packet capture driver و packet.dll و libpcap است ، به آدرس زير مراجعه کنيد :
Developer's pack
برای دريافت source code کتابخانه WinPcap به آدرس زير مراجعه کنيد :
WinPcap source code

=================

پاسخ به سوالاتی در مورد کتابخانه WinPcap :

۱ - WinPcap چگونه روی سيستم نصب می شود ؟
در صورت اجرای فايل نصب ، فايل درايور و Dll های مربوطه در دايرکتوری سيستم شما کپی می شوند . همچنين در Control Panel بخش Add/Remove Program می توانيد عبارت WinPcap را مشاهده کنيد .

۲ - آيا WinPcap 2.2 آخرين نسخه WinPcap است ؟
خير . آخرين نسخه WinPcap نسخه ۲.۳ می باشد که از آدرس زير قابل دريافت است :
Support Windows 95/98/ME/NT/2000/XP
WinPcap auto-installer:driver +DLLs
Developer's pack
WinPcap source code
همچنين WinPcap 3.0 Alpha 4 را می توانيد از آدرس زير دريافت کنيد :
WinPcap auto-installer:driver +DLLs

۳ - چگونه می توان فهميد که WinPcap در حال اجرا روی يک کامپيوتر Win2k/XP است ؟
در بخش Run دستور msinfo32 را وارد کنيد . سپس در بخش Software Environment و سپس بخش System Drivers بايستی عبارت NPF را ببينيد .

۴ - برنامه های بر مبنای WinPcap ( مثل Windump که بعداً در مورد آن صحبت خواهم کرد ) بدرستی اجرا نمی شوند . آيا اشکال از WinPcap است ؟
برنامه Windump را نصب کنيد . دستور windump -D ليست آداپتورهای مجاز را گزارش می دهد و همچنين نشان می دهد که آيا WinPcap قادر به شناسايی درست سخت افزار شما بوده است يا نه . اگر Windump درست کار کند ، اشکال از برنامه شماست نه از WinPcap .

۵ - آيا می توان از WinPcap در اتصالات PPP (‌ اتصالات مودمی ) استفاده کرد ؟
در ويندوز ۹۵ بخاطر باگی که در NDIS است WinPcap گاهی اوقات اتصال PPP را reset می کند . در ويندوزهای ۹۸ و ME اين مشکل وجود ندارد اما گاهی اوقات قادر به ارسال packet نيست . در ويندوزهای NT/2k/XP نيز برخی مشکلات در فرايند binding وجود دارد که مانع از درست کار کردن درايور پروتکل روی آداپتور WAN می شود . اين مشکل بخاطر درايور PPP با نام ndiswan است که يک واسط استاندارد را برای capture کردن مهيا نمی کند .

۶ - Security در WinPcap چگونه است ؟
مدل Security اين برنامه ضعيف است و نويسندگان اين برنامه درحال کار روی آن هستند .

۷ - آيا از WinPcap می توان در محيطهای برنامه نويسی Borland استفاده کرد ؟
برای اينکه بتوان از امکانات WinPcap در C++ Builder استفاده کرد بايستی توسط برنامه COFF2OMF.EXE که در دايرکتوری Borland وجود دارد ، کتابخانه های Packet.lib و wpcap.lib که بر اساس استانداردهای مايکروسافت ( استاندارد COFF ) هستند را به استاندارد OMF تبديل کنيد مثال : COFF2OMF input.lib output.lib

۸ - آيا می توان از WinPcap در ويژوال بيسيک استفاده کرد ؟
بطور مستقيم نمی توان از اين کتابخانه در VB استفاده کرد . شرکت BeeSync يک کنترل ActiveX با نام PacketX ايجاد کرده که بوسيله آن می توان از تواناييهای WinPcap در ويژوال بيسک يا هر محيط ديگری که Microsoft ActiveX technology را پشتيبانی کند استفاده کرد .

بحث در مورد اين ActiveX موضوع بخش بعدی اين سلسه مقالات می باشد .

۹ - آيا WinPcap می تواند با فايروال کار می کند ؟
ممکنست گاهی اوقات کار نکند .

۱۰ - آيا می توان از WinPcap در جاوا استفاده کرد ؟
WinPcap بطور مستقيم از جاوا پشتيبانی نمی کند اما در اين آدرس می توانيد يک Java wrapper را برای اينکار دريافت کنيد .

۱۱ - آيا WinPcap از device های loopback پشتيبانی می کند ؟
خير و علت آن بخاطر محدوديتهای ويندوز است .

۱۲ - WinPcap از چه سخت افزارهايي پشتيبانی می کند ؟
NPF device driver طوری توسعه يافته که بتواند با آداپتورهای اترنت درست کار کند اما نمی تواند بدرستی با آداپتورهای PPP WAN ( مودمها ) کار کند . همچنين نبايستی با کارتهای FDDI, ARCNET, ATM و Token Ring مشکلی داشته باشد اما اين امر بطور قطعی تائيد شده نيست . با آداپتورهای Wireless نيز نمی تواند درست کار کند و در بهترين حالت قادرست يک Ethernet emulation را ببيند .

۱۳ - آيا می توان توسط WinPcap ، بسته های اطلاعاتی ورودی را Drop کرد ؟
خير فقط می توان بسته ها را capture کرد .

۱۴ - آيا می توان توسط امکانات WinPcap يک Firewall ساخت ؟
همانطور که در بالا گقته شد WinPcap قابليت Drop کردن بسته ها را ندارد و تواناييهای Filtering در WinPcap تنها روی بسته های sniff شده است . برای جلوگيری کردن از ورود يک بسته به پشته TCP/IP بايستی خودتان يک درايور ميانی ايجاد کنيد .

۱۵ - چگونه می توان کاری کرد که WinPcap بطور اتوماتيک در زمان بوت سيستم فعال گردد ؟

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:43    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

مقدار کليد زير را در رجيستری از 0x3 به 0x2 تغيير دهيد . اين کار فقط در ويندوزهای NTx جواب می دهد :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPF\Start

۱۶ - آيا با کامپايل مجدد سورس WinPcap نتيجه درستی حاصل می شود ؟
بله اما ابتدا بايستی Service Pack 5 برنامه Microsoft Visual Studio را از سايت مايکروسافت دريافت و آنرا نصب کنيد .

۱۷ - آيا درايورهای ديگری بجز WinPcap برای کار با packet های TCP/IPوجود دارد ؟
بله . برای مثال برنامه Zx Sniffer يک کتابخانه capture کردن packet دارد که مشابه WinPcap است .

۱۸ - آيا Document ها و Tutorial های کاملی برای کار با Packet Driver API و Packet.dll و wpcap.dll در ويژوال سی وجود دارد ؟
بله . برای اينکار می توانيد از مطالب زير استفاده کنيد :
How to use wpcap.dll
wpcap specific extensions
Packet Driver API. How to use the low level capture library
Instructions and examples of how to write and compile a capture application using libpcap calls or packet driver's (PACKET.DLL) calls
Compiling WinPcap
========================

بررسی يکی از برنامه هاي نوشته شده با WinPcap : معرفی WinDump

مقدمه :

برنامه WinDump نسخه تحت ويندوز برنامه مشهور TcpDump می باشد که در سيستم عامل UNIX وجود دارد . اين برنامه يکی از بهترين ابزارهای Network Sniffer/Analyzer می باشد .
WinDump کاملاً با TcpDump سازگار می باشد و می توان از آن برای مانيتور کردن ترافيک شبکه بر اساس قوانين مختلف و پيچيده ای که قابل تنظيم هستند ، استفاده کرد .
WinDump روی سيستم عاملهای 95/98/ME و نيز NT/2000/XP قابل استفاده می باشد .
WinDump از کتابخانه libpcap موجود در WinPcap استفاده می کند .

دريافت برنامه :

برای دريافت نسخه 3.6.2 به آدرس زير مراجعه کنيد :
WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 2.3 WinPcap را روی سيستم خود نصب کنيد .
برای دريافت نسخه 3.8 alpha به آدرس زير مراجعه کنيد :
WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 3.0 WinPcap را روی سيستم خود نصب کنيد .

پاسخ به سوالاتی در مورد برنامه WinDump :

۱ - چگونه می توان با استفاده از WinDump ليست آداپتورهای شبکه را بدست آورد ؟
با اجرای دستور WinDump –D
توسط دستور WinDump –i adaptername می توان WinDump را روی آداپتور خاصی اجرا کرد .

۲ - آيا می توان از WinDump روی اتصالات PPP ( اتصالات مودمی ) استفاده کرد ؟
WinDump از همان device هايي پشتيبانی می کند که WinPcap می کند . به بخش قبل مراجعه کنيد .

۳ - چگونه می توان اطلاعاتی در مورد TcpDump بدست آورد ؟
به آدرس زير مراجعه کنيد :
www.tcpdump.org

۴ - با وجود نصب آخرين نسخه برنامه WinDump ، چرا اين برنامه قادر به capture کردن همه packet ها نيست ؟
توسط سوئيچ B می توانيد سايز بافر درايور را افزايش دهيد برای مثال دستور Windump –B 5000 سايز بافر را ۵ مگابايت می کند . سايز بافر برنامه در حالت عادی 1 مگابايت است .

۵ - آيا می توان چندين WinDump را روی يک ماشين اجرا کرد ؟
بله

۶ - چرا WinDump در زمان capture کردن برای مدتی hang می کند ؟
علت آن فراخوانی تابع gethostbyaddr در برنامه می باشد که برای استخراج host name ها بکار می رود . می توان توسط سوئيچ n- از name resolution جلوگيری کرد .

۷ - آيا اطلاعات کاملی در مورد برنامه WinDump وجود دارد ؟
به آدرس زير مراجعه کنيد :
WinDump Manual

==========================

مقدمه

PacketX مجموعه ای از کلاسهای اکتيو ايکس است که امکانات WinPcap را در ويژوال بيسيک و هر زبان برنامه نويسی ديگری که از تکنولوژی Microsoft ActiveX پشتيبانی کند مهيا می کند .
بطور خلاصه PacketX از WinPcap برای capture کردن و فيلتر کردن packet های شبکه استفاده می کند . علاوه بر capture استاندارد ، شما می توانيد از PacketX برای گردآوری اطلاعات ترافيک شبکه و ارسال raw packet استفاده کنيد .

دريافت PacketX

برای دريافت نسخه 1.3 اين کتابخانه به آدرس زير مراجعه کنيد :
PacketX 1.3 Download
قبل از استفاده از PacketX بايستی WinPcap 2.3 را که آدرس آن در بخش قبل گفته شد دريافت و نصب نمائيد .

استفاده از PacketX

با يک مثال ساده سعی می کنم روش استفاده از اين کتابخانه را به شما آموزش دهم .
پس از نصب PacketX وارد محيط ويژوال بيسيک شده و از منوی Project مورد Components را انتخاب کنيد .
سپس مورد PacketX Type Library را انتخاب کنيد تا به ToolBar اضافه شود .

اين ActiveX را در فرمتان قرار دهيد و سپس در قسمت properties آن روی Custom کليک نموده و نوع آداپتور را مشخص نمائيد .
پس از انتخاب آداپتور با کليک روی دکمه Edit می توانيد اطلاعاتی از قبيل مد کاری و ساير بافر و نوع فيلترينگ را مشخص نمائيد .
نام اين شی را نيز PacketX1 می گذاريم .
در فرمتان دو دکمه به نامهای Start و Stop قرار دهيد . همچنين يک listBox با نام IPList در فرمتان قرار دهيد .
در کد مربوط به Form_load عبارت زير را بنويسيد :


PacketX1.Adapter.BPFilter = "port 80"x


عبارت فوق مشخص می کند که می خواهيم packet های پورت 80 را capture کنيم .
کد زير را برای event مربوط به کليک شدن دکمه Start بنويسيد :


PacketX1.start


کد زير را برای متد OnPacket مربوط به PacketX1 بنويسيد :


Private Sub PacketX1_OnPacket(ByVal pPacket As PACKETXLibCtl.IPktXPacket)x
IPList.AddItem (pPacket.DestIpAddress)x
End Sub


کد فوق آدرس IP مقصد packet ها را به يک ليست اضافه می کند . شما می توانيد اطلاعات ديگری از قبيل داده موجود در packet ، سايز داده ، آدرس مبدا ، تاريخ ارسال داده و غيره را استخراج کنيد .
کد زير را برای event مربوط به کليک شدن دکمه Stop بنويسيد :


PacketX1.stop



برای اينکه بتوانيد در يک مدت خاص وضعيت دريافت و ارسال packet را بدست آوريد بايد ابتدا توسط دستور زير مد آداپتور را در حالت Statistic قرار دهيد :


PacketX1.Adapter.Mode=PktXModeStatistics
PacketX1.Adapter.ReadTimeout=2000 '// 2 sec


سپس PacketX1 را start نموده و توسط متد OnStatistics اطلاعات مربوطه را استخراج کنيد .

اطلاعات بيشتر

برای مشاهده اطلاعات کامل در مورد ساختار PacketX و ماژولهای آن به آدرس زير مراجعه کنيد :
PacketX Documentation

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:44    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

آموزش DirectX Input - بخش 1,2,3
گرفتن اطلاعات ورودی از کيبرد - ۱

مقدمه

Direct Input 8 همانطور که از نامش مشخص است به شما اجازه می دهد که بتوانيد برنامه هايي بنويسيد که توسط هر نوع دستگاه ورودی کنترل شود .
Direct Input 8 دارای چندين مزيت نسبت به استفاده از کنترلهای ورودی خود ويژوال بيسيک دارد – کنترلهايي مثل Form_KeyUp, Form_KeyDown, Form_MouseMove - و همچنين قابليت کنترل بيشتری نسبت به توابع استاندارد Win32 از قبيل GetCursorPos, GetKeyState دارد .
Direct Input 8 سريعتر ، کاراتر و قدرتمند تر بوده و برای ساخت بازيها طراحی شده بنابراين باعث کندی برنامه ها نخواهد شد .

چگونگی کار با Direct Input 8 برای گرفتن ورودی از کيبرد

دو روش برای استفاده از کيبرد در DirectX8 وجود دارد : روش polling و روش event-based که هر دو دارای مزايا و معايبی هستند .
بطور کلی در اغلب طراحيها از روش event-based استفاده می شود زيرا کار با آن راحت تر اسن . در اين روش هر پيغام فرستاده شده ازطرف دستگاه ورودی log می شود و برنامه نيازی به هيچگونه پردازشی بمنظور منتظر ماندن برای يک پيغام از طرف ورودی ندارد ، بنابر اين کاراتر است . در روش polling کنترل کمی دقيقتر و راحتر است .
اگر در مورد برنامه نويسی بر مبنای polling و بر مبنای event اطلاعات کافی نداريد می توانيد از منابع موجود در سايتهايي چون Gamasutra و GameDev استفاده کنيد .

روش Polling

مراحل اين روش عبارتند از :

1 – تعريفات Declerations : يک فرم ايجاد کرده و يک TextBox به نام txtOutput با خصوصيات Multiline ، Locked و Vertical Scroll Bar در آن قرار دهيد . کدهای زير را در بخش کدنويسی اين فرم بنويسيد :

Private Const UsePollingMethod As Boolean = True
Private Const UseEventMethod As Boolean = False
‘نکته مهم اينست که تنها يکی از دو ثابت فوق بايستی True باشد .
Private bRunning As Boolean
‘اين متغير برای polling استفاده می شود
Private DX As DirectX8
Private DI As DirectInput8
‘تعريف شی اصلی DirectX و شی DirectInput
Private DIDevice As DirectInputDevice8
Private DIState As DIKEYBOARDSTATE
‘اين دو شی برای دسترسی به دستگاه ورودی ( کيبرد ) استفاده می شوند
Private KeyState(0 To 255) As Boolean
‘آرايه ای برای تشخيص فشرده شدن کليد
Private Const BufferSize As Long = 10
‘ سايز بافر نگهدارنده event ها . در روش event-based اين مقدار برابر يک و در روش polling برابر 10 تا 20 است ( بسته به سرعت حلقه بازی )
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)x
‘ تابع Sleep برای متوقف کردن حلقه polling در صورت بالا بودن نرخ ورودی



2- مقدار دهی اوليه Initialisation : اين بخش سه مرحله دارد :
در مرحله اول اشيا و Device ها ساخته می شوند .
در مرحله دوم تنظيمات مربوط به Device انجام می شود .
در مرحله سوم به Device می گوئيم که می خواهيم شروع به استفاده از آن کنيم .

در Form_Load کدهای زير را بنويسيد :

Me.Show
Dim I As Long
Dim DevProp As DIPROPLONG
Dim DevInfo As DirectInputDeviceInstance8
Dim pBuffer(0 To BufferSize) As DIDEVICEOBJECTDATA
If UsePollingMethod And UseEventMethod Then
MsgBox "You must select only one of the constants before running"x
Unload Me
End
End If

If UsePollingMethod Then txtOutput.Text = "Using Polling Method" & vbCrLf
If UseEventMethod Then txtOutput.Text = "Using Event Based Method" & vbCrLf

‘مقداردهی اوليه روش انتخاب شده
Set DX = New DirectX8
Set DI = DX.DirectInputCreate
Set DIDevice = DI.CreateDevice("GUID_SysKeyboard")x

DIDevice.SetCommonDataFormat DIFORMAT_KEYBOARD
DIDevice.SetCooperativeLevel frmMain.hWnd, DISCL_BACKGROUND Or ISCL_NONEXCLUSIVE

‘برپاسازی بافر
DevProp.lHow = DIPH_DEVICE
DevProp.lData = BufferSize
DIDevice.SetProperty DIPROP_BUFFERSIZE, DevProp

‘ به دايرکت ايکس می گوئيم که می خواهيم از دستگاه ورودی استفاده کنيم
DIDevice.Acquire

‘استخراج اطلاعاتی در مورد دستگاه ورودی
Set DevInfo = DIDevice.GetDeviceInfo()x
txtOutput.Text = txtOutput.Text & "Product Name: " & DevInfo.GetProductName & vbCrLf
txtOutput.Text = txtOutput.Text & "Device Type: " & DevInfo.GetDevType & vbCrLf
txtOutput.Text = txtOutput.Text & "GUID: " & DevInfo.GetGuidInstance & vbCrLf


‘در صورتی که بخواهيم به برنامه خاتمه بدهيم کدهای زير را می نويسيم
DIDevice.Unacquire
Set DIDevice = Nothing
Set DI = Nothing
Set DX = Nothing
Unload Me
End



3 – گرفتن ورودی از کيبرد : در اين بخش فرض کنيد بخواهيم يک بازی را در يک حلقه Do-Loop شبيه سازی کنيم . در اين حلقه هر بار فشرده شدن کليدهای کيبرد را چک می کنيم :

If Not Err.Number Then bRunning = True

Do While bRunning

‘دريافت اطلاعات شامل خواندن وضعيت کيبرد ، خواندن اطلاعات بافر و سپس خطا
DIDevice.GetDeviceStateKeyboard DIState
DIDevice.GetDeviceData pBuffer, DIGDD_DEFAULT
If Err.Number = DI_BUFFEROVERFLOW Then
Msgbox(“BUFFER OVERFLOW (Compensating)...")x
GoTo ENDOFLOOP:
End If
‘بررسی فشرده شدن کليدها
For I = 0 To 255
If DIState.Key(I) = 128 And (Not KeyState(I) = True) Then
txtOutput.Text = txtOutput.Text & "{ DOWN } " & KeyNames(CInt(I))& vbCrLf
txtOutput.SelStart = Len(txtOutput.Text)x
KeyState(I) = True
End If
Next I

‘بررسی رها شدن کليد
For I = 0 To BufferSize
If KeyState(pBuffer(I).lOfs) = True And pBuffer(I).lData = 0 Then
KeyState(pBuffer(I).lOfs) = False
txtOutput.Text = txtOutput.Text & "{ UP } " & KeyNames(CInt(pBuffer(I).lOfs)) & vbCrLf
txtOutput.SelStart = Len(txtOutput.Text)x
End If
Next I

Sleep (50)x
DoEvents
ENDOFLOOP:
Loop


در کد فوق يک تابع KeyName وجود دارد که نام کليد فشارداده شده را بر می گرداند . بخشی از اين تابع را در زير می بينيد :


Function KeyNames(iNum As Integer) As String

Dim aKeys(0 To 255) As String

aKeys(1) = "DIK_ESCAPE"
aKeys(2) = "DIK_1 On main keyboard"x
aKeys(3) = "DIK_2 On main keyboard"x
aKeys(4) = "DIK_3 On main keyboard"x
aKeys(5) = "DIK_4 On main keyboard"x
aKeys(6) = "DIK_5 On main keyboard"x
aKeys(7) = "DIK_6 On main keyboard"x
aKeys(8) = "DIK_7 On main keyboard"x
aKeys(9) = "DIK_8 On main keyboard"x
aKeys(10) = "DIK_9 On main keyboard"x
aKeys(11) = "DIK_0 On main keyboard"x
aKeys(12) = "DIK_MINUS On main keyboard"x
aKeys(13) = "DIK_EQUALS On main keyboard"x
aKeys(14) = "DIK_BACK BACKSPACE"x
aKeys(15) = "DIK_TAB"x
aKeys(16) = "DIK_Q"x
aKeys(17) = "DIK_W"x
aKeys(18) = "DIK_E"x
aKeys(19) = "DIK_R"x
aKeys(20) = "DIK_T"x
.
.
.
KeyNames = aKeys(iNum)x

End Function

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست: Gytyonline (یکشنبه 31 مرداد 1389 - 05:16)

پست تاریخ: دوشنبه 5 دی 1384 - 02:46    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

موضوع : کنترل کيبرد با روش Event-Based

مقداردهی اوليه و مفاهيم اصلی در روش Event-Based مشابه روش Polling است و تنها بايستی ساختار بخش جمع آوری داده و حلقه پردازشی را تغيير دهيم . مراحل کار با روش Event-Based بصورت زير می باشد :

۱ - تعاريف و مقداردهی اوليه : در بخش تعاريف دو تعريف جديد بصورت زير داريم :


Dim hEvent As Long
Implements DirectXEvent8


hEvent يک پارامتر هندل برای يک می باشد .
نکته : زمانی که کليدی فشرده يا رها می شود ، DirectX اين امر با فراخوانی تابعی به اسم DirectXEvent8_DXCallback به برنامه شما اطلاع می دهد . ( اين نوع توابع را Call Back Function گويند ) . اين تابع به برنامه شما می گويد که يک رويداد اتفق افتاده است و بايستی بافرها را چک کند .

تنها تغييری که در بخش مقداردهی اوليه نياز است ، برپاسازی يک event می باشد :


If UseEventMethod Then
hEvent = DX.CreateEvent(frmMain)x
DIDevice.SetEventNotification hEvent
End If


در انتهای برنامه نيز کد زير را برای از بين بردن event اضافه کنيد :


If hEvent <> 0 Then DX.DestroyEvent hEvent



۲ - استفاده از event : برای اين بخش کدهايي را در داخل تابع DirectXEvent8_DXCallback می نويسيم :


Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)x
'متغيرهای موردنياز
Dim I As Long
Dim pBuffer(0 To BufferSize) As DIDEVICEOBJECTDATA
If eventid = hEvent Then
If DIDevice Is Nothing Then Exit Sub
'درصورت رخ دادن event داده را از کيبرد می گيريم
DIDevice.GetDeviceStateKeyboard DIState
DIDevice.GetDeviceData pBuffer, DIGDD_DEFAULT
'چک کردن تمام کليدها برای اينکه متوجه شويم چه اتفاقی افتاده است
For I = 0 To 255
'عدد ۱۲۸ نشان دهنده key_down event است .
If DIState.Key(I) = 128 Then
If pBuffer(0).lData = 128 Then
txtOutput.Text = txtOutput.Text & "{ DOWN } " & KeyNames(CInt(I)) & vbCrLf
End If
End If
'کد فوق برای بررسی فشرده شدن يک کليد بود . کد زير رها شدن کليد را بررسی می کند
If (pBuffer(0).lData = 0 And pBuffer(0).lOfs = I) Then
txtOutput.Text = txtOutput.Text & "{ UP }" & KeyNames(CInt(I)) & vbCrLf
End If

txtOutput.SelStart = Len(txtOutput.Text)x
Next I
End If
End Sub

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:47    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

موضوع : کنترل ماوس با DirectX Input

مقدمه :

برای استفاده از ماوس در برنامه های مالتی مديا و بازيها همانند کی برد می توانيم از امکانات دايرکت ايکس استفاده کنيم . روش کنترل ماوس توسط DirectX Input بسيار ساده بوده و مشابه کنترل کيبرد می باشد بنابراين درصورتی که دو درس گذشته را نخوانده اين پيشنهاد می کنم ابتدا آنها را مطالعه کنيد .

برپاسازی Device :

علاوه بر متغيرهايي که در بخش کنترل کيبرد تعريف شد بايستی متغيرهای جديد زير را نيز در ابتدای برنامه تان تعريف کنيد :


Private Const mSpeed As Single = 2
Private Const BufferSize As Long = 10
Private mPosition As Point


mSpeed مقدار سرعت حرکت کرسر ماوس را مشخص می کند .
BufferSize سايز بافر DI می باشد .
mPosition موقعيت جاری کرسر ماوس را نشان می دهد .

در مرحله بعدی بايستی مقداردهي های اوليه لازم را انجام دهيد :


Set DIDevice = DI.CreateDevice("guid_SysMouse")x
Call DIDevice.SetCommonDataFormat(DIFORMAT_MOUSE)x
Call DIDevice.SetCooperativeLevel(frmMain.hWnd, DISCL_FOREGROUND Or DISCL_EXCLUSIVE)x


تفاوت عمده کدهای فوق با کدهای مقداردهی اوليه در بخش کی برد آنست که cooperativelevel تغيير کرده است . در اينجا گفته شده که ما می خواهيم از ماوس بصورت انحصاری در برنامه استفاده کنيم . اين حالت برای برنامه های window-base مناسب نيست و بهترست از آن در بازيهايي که بصورت full screan هستند استفاده کنيد .

خواندن ورودی از ماوس :

در اين بخش می توانيد هم از روش polling و هم event-based استفاده کنيد . نکته مهمی که در اينجا وجود دارد آنست که Direct Input فقط حرکت داده شدن ماوس و کليک شدن يک دکمه را به شما اطلاع می دهد و برای تشخيص حالتهای double click و single click خودتان بايستی کد بنويسيد برای مثال اگر فاصله زمانی بين دو کليک کمتر از ۴۰ ميلی ثانيه باشد آنگاه اين يک double click بوده است .
کد زير حرکت داده شدن ماوس و کليک يکی از سه دکمه آنرا اطلاع می دهد :


Dim DevData(1 To BufferSize) As DIDEVICEOBJECTDATA
Dim nEvents As Long
Dim I As Long
nEvents = DIDevice.GetDeviceData(DevData, DIGDD_DEFAULT)x
For I = 1 To nEvents
Select Case DevData(I).lOfs
Case DIMOFS_X
mPosition.x = mPosition.x + (DevData(I).lData * mSpeed)x
If mPosition.x < 0 Then mPosition.x = 0
If mPosition.x > frmMain.ScaleWidth Then mPosition.x = frmMain.ScaleWidth
imgCursor.Top = mPosition.y
imgCursor.Left = mPosition.x
lablel(1).Caption = "Mouse Coordinates: [" & mPosition.x & ", " & mPosition.y & "]"x
Case DIMOFS_Y
mPosition.y = mPosition.y + (DevData(I).lData * mSpeed)x
If mPosition.y < 0 Then mPosition.y = 0
If mPosition.y > frmMain.ScaleHeight Then mPosition.y = frmMain.ScaleHeight
imgCursor.Top = mPosition.y
imgCursor.Left = mPosition.x
lablel(1).Caption = "Mouse Coordinates: [" & mPosition.x & ", " & mPosition.y & "]"x
Case DIMOFS_BUTTON0
label(2).Caption = "Button 0 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON1
label(3).Caption = "Button 1 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON2
label(4).Caption = "Button 2 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON3
label(5).Caption = "Button 3 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
End Select
Next I


برای استفاده از کد فوق در روش Polling ، بايستی آنرا در يک حلقه Do while-Loop قرار دهيد .
برای استفاده از کد فوق در روش Event-Based ، بايستی آنرا درون روتين DirectXEvent8_DXCallback قرار دهيد

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:49    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7
TAPI چيست ؟

TAPI يا Telephony API يک کتابخانه استاندارد برای کار با مودم و نوشتن برنامه های تلفنی می باشد . برای نمونه می توان از برنامه های Phone Dialer ( شماره گير تلفن ) ، برنامه شبکه سازی تلفنی ( Dialup Networking ) ، برنامه تشخيص پالس مودم برای ضبط اطلاعات وارد شده از طرف کاربران و کاربردهای ديگر در اين زمينه نام برد . اين کتابخانه به شما کمک کمک می کند تا بدون درگير شدن با برنامه نويسی سخت افزار مودم و درايور آن بطور مستقيم بتوانيد برنامه های کاربردیي در اين زمينه بنويسيد .
مروری بر Microsoft Telephony :

Telephony امکان مجتمع سازی کامپيوترها با دستگاههای ارتباطی و شبکه ها را فراهم نموده است . معمولاً دستگاه ارتباطی يک مودم و خط ارتباطی نيز شبکه PSTN ( شبکه عمومی تلفن سوئيچينگ ) می باشد . برخی از کاربردهای Telephony عبارتند از :

۱ - کنفرانسهای مالتی مديا بصورت Multicast
۲ - VoIP
۳ - مرکز پاسخ گويي اتوماتيک
۴ - تماس تلفنی از طريق کامپيوتر روی شبکه PSTN

دياگرام زير معماری Microsoft Telephony را نشان می دهد :
برنامه های TAPI :

برای نوشتن برنامه های کاربردی با استفاده از TAPI بايستی ابتدا در مورد سطح سرويسی که می خواهيم ارائه دهيم تصميم گيری کنيم . برای مثال برای نوشتن يک برنامه شماره گير تلفن نياز به استفاده کامل از TAPI نيست و می توان از قابليتهای خود ويندوز در اين زمينه استفاده کرد ( Assisted Telephony ) . در بخشهای بعدی در مورد سطوح مختلف سرويس در TAPI بيشتر صحبت خواهم کرد .
دومين مطلبی که بايد مورد توجه قرار داد اينست که می خواهيم از TAPI 2.x استفاده کنيم يا از TAPI 3.x . تفاوت ايندو آنست که TAPI ورژن ۲ يک API برمبنای C است در حاليکه ورژن ۳ آن بر مبنای تکنولوژی COM می باشد . در بخشهای بعدی مطالب بيشتری در مورد تفاوتهای اين دو نسخه بيان خواهم کرد .
بخشهای اصلی يک برنامه کامل TAPI عبارتند از :

۱ - TAPI Initialization : شامل load کردن TAPI dll ، اتصال به TAPI Server ، مذاکره در مورد ورژن TAPI و برپاسازی سيستم اطلاع رسانی event می باشد .

۲ - Session Control : مقداردهی اوليه ، دريافت و کنترل تماسها

۳ - Device Control : دريافت و تنظيم اطلاعات دستگاه

۴ - Media Control : تشخيص و يا توليد تونها و ارقام ، کنترل stream

۵ - TAPI Shutdown : آزاد سازی منابع
مقداردهی اوليه TAPI :

عملکرد درست اجزای TAPI نياز به برپاسازی محيط ارتباطی روی کامپيوتر مورد نظر دارد . مراحل اين امر عبارتند از :

۱ - نصب TAPI : زمانيکه سخت افزار و يا نرم افزار برای اولين بار به کامپيوتر اضافه می شود انجام می گيرد . جزئيات کار به سيستم عامل و نرم افزار بستگی دارد .

۲ - مقداردهی ابتدائی : ساخت اشيا و مسيرهای ارتباطی

۳ - مذاکره در مورد ورژن TAPI : برای اطمينان از اينکه اجزای TAPI قادر به تبادل داده ها باشند .

۴ - استخراج اطلاعات منابع : بدست آوردن اطلاعاتی در مورد دستگاهی که می توان از آن در برنامه TAPI مورد نظرمان استفاده نمود .

۵ - Event notification : برپاسازی سيستم اطلاع رسانی event
مقداردهی اوليه TAPI در ويژوال بيسيک :

از منوی Project گزينه References را انتخاب کرده و از ليست مربوطه مورد Microsoft TAPI 3.0 Type Library را انتخاب کنيد .
حال وارد بخش کد نويسی فرمتان شويد و متغير objTAPI را بصورت زير تعريف کنيد :

Dim objTapi As TAPI


سپس در بخش مربوط به Form Load شی objTAPI را بصورت زير ايجاد می کنيم :

Set objTapi = New TAPI


همانطور که در بخشهای قبلی گفته شد ، قبل از فراخوانی هر تابع TAPI ابتدا بايستی آنرا مقداردهی اوليه کنيم . برای مقداردهی اوليه کردن شی TAPI عبارت زير را بنويسيد :

Call objTapi.Initialize


انتخاب يک آدرس :
کد زير نشان می دهد که چگونه می توان با استفاده از شی TAPI در ويژوال بيسيک منابع تلفنی در دسترس را برای يک آدرس که بتواند يک مجموعه مشخص از نيازها را مديريت کند ، بررسی کرد .
توجه داشته باشيد که قبل از انجام اين کار بايستی عمل مقداردهی اوليه TAPI را که در بخش قبل ررسی شد ، انجام دهيد .

نکته : در کد زير عمل error checking انجام نگرفته است و برای استفاده از کد زير در برنامه های واقعی بايستی بخش بررسی خطا را به آن اضافه کنيد .
۱ - تعريف يک شی آدرس و يک شی مجموعه آدرس :

Dim gobjAddress As ITAddress
Dim objCollAddresses As ITCollection


۲ - تنظيم شی objCollAddress بعنوان يک مجموعه آدرس از شی objTapi :

Set objCollAddresses = objTapi.Addresses


۳ - پيدا کردن آدرسی که بتواند از واسط مورد نظر ما پشتيبانی کند :

bFound = False
For indexAddr = 1 To objCollAddresses.Count
Set objCrtAddress = objCollAddresses.Item(indexAddr)x
Set objMediaSupport = objCrtAddress
Set objAddressCapabilities = objCrtAddress

If objMediaSupport.QueryMediaType( nSelectedType ) x
bFound = True
End If

Set objAddressCapabilities = Nothing
Set objMediaSupport = Nothing
Set objCrtAddress = Nothing

If bFound = True Then Exit For
Next indexAddr

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:50    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

در صورتيکه آدرس مورد نظزر پيدا شود برنامه از حلقه خارج شده و gobjAddress يک آدرس قابل استفاده خواهد بود :

Set gobjAddress = objcollAddresses.Item(indexAddr)x


انجام Event Handling در TAPI :

کد زير شامل يک event handler ساده برای TAPI ، رجيستر کردن واسط event ، تنظيم فيلتر event و رجيستر کردن تمام فراخوانيهای دادن اخطار است . هدف اصلی از اين کد اينست که مطمئن شويم بخشی از TAPI که event ها را دريافت می کند پردازشی را قبل از انتقال به بخشهای ديگر انجام دهد .

تعاريفها :

Dim WithEvents gobjTapiWithEvents As TAPI
Attribute gobjTapiWithEvents.VB_VarHelpID = -1
Dim glRegistrationToken As Long



Const TAPI3_CALL_EVENTS =TE_CALLMEDIA Or
TE_CALLNOTIFICATION Or TE_CALLSTATE



تنظيم eventfilter بصورتيکه تمام event های تعريف شده برای TAPI را بپذيرد :

objTapi.EventFilter = TAPI3_CALL_EVENTS


رجيستر کردن event ها :

Set gobjTapiWithEvents = objTapi
Dim fOwner As Boolean, fMonitor As Boolean
Dim lMediaTypes As Long, lCallbackInstance As Long

fOwner = True
fOwner = True
fMonitor = False
lMediaTypes = TAPIMEDIATYPE_AUDIO
lCallbackInstance = 1

glRegistrationToken = gobjTapi.RegisterCallNotifications(gobjAddress,fMonitor,
fOwner,lMediaTypes,lCallbackInstance)x


انتخاب يک ترمينال :

+ قبل از اينکه يک ترمينال را برای برقراری ارتباط انتخاب کنيد بايستی TAPI Initialization و عمل انتخاب آدرس را انجام داده باشيد .

ابتدا يک متغير از نوع ITBasicCallControl ( واسط کنترل تماس ) تعريف می کنيم :

Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo


سپس يک متغير از نوع ITTerminalSupport ( کوئری از شی آدرس ) تعريف می کنيم :

Dim objTerminalSupport As ITTerminalSupport
Set objTerminalSupport = gobjAddress


سپس متغير ترمينال را تعريف کرده و توسط شی objTerminalSupport يک ترمينال را برای آن استخراج می کنيم :

Dim objTerminal As ITTerminal
Set objTerminal = objTerminalSupport.GetDefaultStaticTerminal(lMediaType, dir)x


در اينجا ديگر نيازی به شی objTerminalSupport نيست بنابراين آنرا آزاد می کنيم :

Set objTerminalSupport = Nothing


سپس نياز به تعريف شی objStreamControl برای کنترل ترمينال است :

Dim objStreamControl As ITStreamControl
Set objStreamControl = objCallControl


در صورتيکه اين شی ايجاد شود ، به ازای استريم های موجود در ITCollection امکان ايجاد ترمينال در يک حلقه for بررسی می شود و ترمينال مناسب انتخاب می گردد :

If Not (objStreamControl Is Nothing) Then
Dim objITCollStreams As ITCollection

Set objITCollStreams = objStreamControl.Streams

Dim nIndex As Long, objCrtStream As ITStream

For nIndex = 1 To objITCollStreams.Count
Set objCrtStream = objITCollStreams.Item(nIndex)x
If objCrtStream.MediaType = lMediaType Then
If objCrtStream.Direction = dir Then
Call objCrtStream.SelectTerminal(objTerminal)x
End If
End If
Set objCrtStream = Nothing
Next nIndex

Set objITCollStreams = Nothing
Set objStreamControl = Nothing
End If



ايجاد يک تماس ( Make a Call ) :
+ قبل از اين بخش بايستی مراحل TAPI Initialization و عمل انتخاب آدرس انجام شده باشد .
اين بخش برای ايجاد يک شی تماس ، بررسی و مشخص کردن استريمی که با اين تماس در ارتباط است ، انتخاب و ايجاد ترمينالهای مناسب و کامل کردن ارتباط استفاده می شود .
قبل TAPI Initialization و عمل انتخاب آدرس و انتخاب ترمينال انجام شده باشد .
در ابتدا با استفاده از متد CreateCall يک شی تماس ساخته می شود :

Set gobjCall = gobjOrigAddress.CreateCall(strDestAddress, nSelectedType,lMediaTypes)x


سپس در اينجا بايستی کدی که در بخش اول اين درس برای انتخاب ترمينال نوشته شد آورده شود :

}
Select Terminal Code
{


سپس بايستی دستور Connect اجرا شود :

gobjCall.Connect (False)x


False بدين معناست که ارتباط بصورت آسنکرون برقرار می شود .
دريافت يک تماس :

کد زير برای يافتن و يا ايجاد يک ترمينال مناسب برای دريافت يک تماس بکار می رود . بايستی توجه داشته باشيد که قبل از اجرای کد زير بايستی مراحل مقداردهی اوليه ، انتخاب يک آدرس و رجيسر کردن event ها را انجام دهيد . همچنين در کد زير بايستی مرحله انتخاب ترمينال را نيز انجام دهيد . توجه داشته باشيد که در کد زير متغير pEvent يک اشاره گر برای واسط ITCallNotificationEvent است که توسط TAPI به event Handler داده می شود :

If TapiEvent = TE_CALLNOTIFICATION Then
Dim objCallNotificationEvent As ITCallNotificationEvent
Set objCallNotificationEvent = pEvent
Dim gobjReceivedCallInfo As ITCallInfo
Set gobjReceivedCallInfo = objCallNotificationEvent.Call
Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo
objCallControl.Answer
End If




+ بخاطر طولانی شدن اين سری مطالب و نيز تخصصی بودن آن که باعث می شود مخاطبين کمتری داشته باشد بحث TAPI را به همين جا خاتمه می دهم . اما برای دوستان علاقمند که بخواهند مطالب بيشتری در اين زمينه آموخته و نيز مثالهای عملی از نوشتن برنامه های TAPI را در اختيار داشته باشند لينکهای زير را معرفی می کنم :
آموزش TAPI در سايت MSDN
سوالات مختلف در مورد TAPI
سوالات مختلف در مورد TAPI
Active Call Center
يک کنترل ActiveX برای استفاده از TAPI
نمونه ای از يک برنامه کامل TAPI در ويژوال بيسيک
TAPI در ويژوال بيسيک
کتابی در مورد برنامه نويسی TAPI در ويژوال بيسيک

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 5 دی 1384 - 02:51    
taknikbartar
داره كولاك مي‌كنه!
داره كولاك مي‌كنه!


پست: 106
عضو شده در: 22 آذر 1384
محل سکونت: ایران|آمریکا|دبی|اتحادیه صادر کننده نرم افزار بینل ملل


امتياز: 962

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

آشنايي با RAS API و WinInet API – کامل
مقدمه

ويندوز برای برقراری ارتباط با Internet Service Provide- ISP- شما از طريق مودم و خط تلفن در اتصالات dial-up networking ، از سرويسی خاص به اسم RAS (Remote Access Service) استفاده می کند . اين سرويس دارای يک واسط برنامه نويسی است که RAS API نام دارد . اين واسط شامل مجموعه ای از توابع است که شما می توانيد آنها را در برنامه خود صدا بزنيد . RAS API ابزاری بسيار قدرتمند و قابل انعطاف است همچنين بسيار پيچيده می باشد .
خوشبختانه برای استفاده راحتتر ، مايکروسافت تعدادی تابع را در مجموعه ای به اسم WinInet API قرار داده تا بتوان از آنها برای برقراری ارتباط و کنترل اتصال استفاده کرد .

آشنايي با WinInet API :

WinInet API مجموعه ای از توابع است که امکان ايجاد و توسعه برنامه های اينترنتی را بصورتی ساده ، سريع و کارآمد برای برنامه نويسان مهيا می کند . با استفاده از اين مجموعه توابع شما می توانيد برنامه هايي بنويسيد که از منابع اينترنتی با استفاده از پروتکلهايي چون HTTP و FTP استفاده کنند . همچنين WinInet به شما اجازه می دهد تا بتوانيد ارتباطی dial-up با يک ISP ايجاد نموده و آنرا کنترل کنيد .
مزيـت اصلی توابع WinInet آينست که شما نيازی به دانستن ساختار پروتکلهای ارتباطی و نيز برنامه نويسی Socket نخواهيد داشت . بعبارت ديگر WinInet يک واسط سطح بالا را برای کار با منابع اينترنتی ارائه می دهد .

امکانات Dial-Up موجود در WinInet :

تا قبل از ارائه اينترنت اکسپلورر ورژن 4 ، WinInet تنها دارای دو تابع dial-up بود :

تابع InternetAttemptConnect : برای بررسی اينکه آيا يک ارتباط به اينترنت وجود دارد يا نه استفاده می شد . اگر هيچ اتصالی به اينترنت وجود نداشت اين برنامه کادر تبادلی dial-up networking را نمايش می داد و کاربر اجازه داشت تا يک اتصال را برای وصل شدن به اينترنت انتخاب کند .

تابع InternetCheckConnection : تابع با استفاده از انجام يک دستور ping به url ای که به تابع داده شده ، بررسی می کرد که آيا ارتباطی به اينترنت وجود دارد يا نه .

اين دو تابع دارای محدوديتهای فراوانی بودند . برای مثال تابع اول نمی تواند بطور اتوماتيک اتصال به اينترنت را برقرار کند و تابع دوم نيز نمی تواند هيچ اطلاعاتی در مورد نوع ارتباط به ما بدهد .

IE نسخه 4 ، تعدادی تابع جديد برای WinInet معرفی کرد که برخی از آنها عبارتند از :

تابع InternetGetConnectedState : اطلاعاتی در مورد نوع ارتباط استفاده شده را بيان می کند . برای مثال اين تابع اطلاع می دهد که نوع ارتباط به اينترنت از طريق مودم است يا شبکه LAN و يا از طريق پروکسی .

تابع InternetAutodial : اين امکان را فراهم می سازد تا يک ارتباط اينترنتی اتوماتيک از طريق مودم را با استفاده از مدخل اتصال پيش فرض که کاربر آنرا در dial-up networking مشخص کرده ايجاد کنيد .

تابع InternetDial : اين تابع کارآمدتر از تابع InternetAutodial است و کادری را نمايش می دهد که کاربر می تواند نوع مدخل مورد نظر خود برای ارتباط تلفنی با اينترنت را انتخاب کند .

تابع InternetAutodialHangup : برای قطع کردن اتصالی مودمی که از طريق تابع InternetAutodial برقرار شده استفاده می شود .

تابع InternetHangUp : برای قطع کردن اتصالی مودمی که از طريق تابع InternetDialبرقرار شده استفاده می شود .

تابع InternetSetDialState : برای تنظيم کردن وضعيت جاری ارتباط اينترنتی استفاده می شود .

در قسمت بعدی اين سلسه مباحث جزئيات اين توابع را بررسی کرده و نهايتاً برنامه ای کاربردی برای کار با اين توابع در ويژوال بيسيک ارائه خواهم داد .

اطلاعات بيشتری در مورد WinInet :

در اين بخش ما تنها توابع dial-up موجود در WinInet API را بررسی کرديم اما همانطور که در ابتدا گفته شد WinInet دارای امکانات فراوانی در زمينه کار با اينترنت است . برای آشنايي بيشتر با اين امکانات در زير جداولی ارائه شده که به اختصار امکانات مختلف اين مجموعه تابع را نشان می دهد :

توابع Dial-Up :

Name
Description

InternetGetConnectedState
Retrieves the current state of the Internet connection

InternetAutodial
Initiates an unattended dial-up connection

InternetAutodialHangup
Disconnects a modem connection initiated by

InternetDial
Initiates a dial-up connection

InternetHangUp
Disconnects a modem connection initiated by InternetDial

InternetGoOnline
Prompts the user for permission to initiate a dial-up connection to the given URL

InternetSetDialState
Sets the current state of the Internet connection


توابع عمومی اينترنت :

Name
Description

InternetOpen
Initializes the Win32 Internet functions

InternetConnect
Opens an FTP, Gopher, or HTTP session for a given site

InternetCloseHandle
Closes a single Internet handle or a subtree of Internet handles

InternetErrorDlg
Displays a dialog box for the error that is passed to InternetErrorDlg

InternetFindNextFile
Continues a file search started as a result of a previous call to FtpFindFirstFile or GopherFindFirstFile

InternetGetLastResponseInfo
Retrieves the last Win32 Internet function error description or server response on the thread calling this function

InternetLockRequestFile
Allows the user to place a lock on the file being used

InternetQueryDataAvailable
Queries the amount of data available

InternetQueryOption
Queries an Internet option on the specified handle

InternetReadFile
Reads data from a handle opened by the InternetOpenURL, FtpOpenFile, GopherOpenFile, or HttpOpenRequest function

InternetReadFileEx
Reads data from a handle opened by the InternetOpenURL, FtpOpenFile, GopherOpenFile, or HttpOpenRequest function

InternetSetFilePointer
Sets a file position for InternetReadFile

InternetSetOption
Sets an Internet option

InternetSetStatusCallback
Sets up a callback function that Win32 Internet functions can call as progress is made during an operation

InternetStatusCallback
Placeholder for the application-defined status callback function

InternetTimeFromSystemTime
Formats a date and time according to the specified RFC format (as specified in the HTTP version 1.0 specification)

InternetTimeToSystemTime
Takes an HTTP time/date string and converts it to a SYSTEMTIME structure

InternetUnlockRequestFile
Unlocks a file that was locked using InternetLockRequestFile

InternetWriteFile
Writes data to an open Internet file

InternetConfirmZoneCrossing
Checks for changes between secure and nonsecure URLs



توابع URL :

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:


نمایش پستها:                 مشاهده موضوع قبلی :: مشاهده موضوع بعدی  
پاسخ دادن به این موضوع
 
رفتن به صفحه قبلی  1, 2, 3, 4, 5, 6, 7, 8, 9  بعدی
صفحه 8 از 9

تمام زمانها بر حسب GMT + 3.5 Hours می‌باشند
 Related Topics 


 information 

 

پرش به:  
شما نمی توانید در این بخش موضوع جدید پست کنید
شما نمی توانید در این بخش به موضوعها پاسخ دهید
شما نمی توانید موضوع های خودتان را در این بخش ویرایش کنید
شما نمی توانید موضوع های خودتان را در این بخش حذف کنید
شما نمی توانید در این بخش رای دهید


Copyright 2004-2024. All rights reserved.
© by Aftabgardan Cultural Center : Aftab.cc