تبليغاتX
Iranian Scorpion Security Group

Iranian Scorpion Security Group

همه چیز در مورد امنیت

آشنايي با 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 :  

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

توابع URL :

توابع FTP :

توابع HTTP :

بررسی جزئيات توابع Dial-Up موجود در WinInet :

1 – تابع InternetAutodial : بطور اتوماتيک باعث شماره گيری اتصال پيش فرض اينترنت توسط مودم می شود . اگر اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false بر می گرداند .
پارامترهای ورودی تابع :
dwFlags : فلگ کنترل کننده عمليات اتصال می باشد و يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_AUTODIAL_FORCE_ONLINE 
- INTERNET_AUTODIAL_FORCE_UNATTENDED  
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long

2 – تابع InternetAutodialHangup : باعث قطع کردن يک اتصال dial-up اتوماتيک می شود . اگر قطع اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false برمی گرداند . تابع دارای يک پارامتر ورودی به اسم dwReserved است که رزرو شده بود و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long

3 – تابع InternetDial : يک اتصال به اينترنت را با استفاده از يک ارتباط مودم مقداردهی اوليه می کند . پارامترهای ورودی آن عبارتند از :
hwndParent : هندل مربوط به پنجره parent
lpszConnectoid : نام ارتباط dial-up مورد استفاده
dwFlags : فلگ کنترل اتصال که يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_AUTODIAL_FORCE_ONLINE 
- INTERNET_AUTODIAL_FORCE_UNATTENDED 
- INTERNET_DIAL_UNATTENDED   : اتصال به اينترنت از طريق مودم بدون نمايش واسط کاربر
lpdwConnection : آدرس داده ای که شامل عدد متناظر با اتصال است .
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetDial Lib "wininet.dll" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long

4 – تابع InternetGetConnectedState : اين تابع وضعيت اتصال جاری به اينترنت را بر می گرداند . اگر اتصال برقرار باشد تابع مقدار true و در غير اينصورت false برمی گرداند .
پارامترهای ورودی تابع عبارتند از :
lpdwFlags : توصيف وضعيت اتصال . اين پارامتر يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_CONNECTION_MODEM
- INTERNET_CONNECTION_LAN
- INTERNET_CONNECTION_PROXY
- INTERNET_CONNECTION_MODEM_BUSY
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long

5 – تابع InternetGoOnline : پيغامی به کاربر برای دادن مجوز برای مقداردهی اوليه اتصال به يک URL را می دهد . اگر اينکار موفقيت آميز باشد مقدار true و در غير اينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از :
lpszURL : URL وب سايت مورد نظر برای اتصال
hwndParent : هندل پنجره parent
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetGoOnline Lib "wininet.dll" (ByVal lpszURL As String, ByVal hwndParent As Long, ByVal dwReserved As Long) As Long

6 – تابع InyernetHangUp : به مودم می گويد که اتصال به اينترنت را قطع کند . پارامترهای اين تابع عبارتند از :
dwConnection : شماره مربوط به اتصالی که می خواهيم آنرا قطع کنيم .
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long

7 – تابع InternetSetDialState : تنظيم نمودن وضعيت شماره گيری مودم . اگر تنظيم با موفقيت انجام شود تابع true و در غيراينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از :


lpszConnectoid : نام اتصال dial-up
dwState : وضعيت مربوط به اتصال dial-up . در حال حاضر اين پارامتر تنها مقدار INTERNET_DIALSTATE_DISCONNECTED را می تواند داشته باشد .

dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetSetDialState Lib "wininet.dll" (ByVal lpszConnectoid As String, ByVal dwState As Long, ByVal dwReserved As Long) As Long

بررسی فلگهای مورد استفاده در توابع dial-up :

1 – فلگهای تابع InternetDial :

Public Const INTERNET_DIAL_UNATTENDED = &H8000&  '0x8000
Public Const INTERENT_GOONLINE_REFRESH = &H1    '0x00000001
Public Const INTERENT_GOONLINE_MASK = &H1       '0x00000001

2 – فلگهای تابع InternetAutoDial :

Public Const INTERNET_AUTODIAL_FORCE_ONLINE = 1
Public Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2
Public Const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4


3 – فلگهای تابع InternetGetConnectedState :

Public Const INTERNET_CONNECTION_MODEM = 1
Public Const INTERNET_CONNECTION_LAN = 2
Public Const INTERNET_CONNECTION_PROXY = 4
Public Const INTERNET_CONNECTION_MODEM_BUSY = 8

4 - فلگهای مربوط به dial handler اختصاصی :

Public Const INTERNET_CUSTOMDIAL_CONNECT = 0
Public Const INTERNET_CUSTOMDIAL_UNATTENDED = 1
Public Const INTERNET_CUSTOMDIAL_DISCONNECT = 2

5 – فلگهای عملياتی پشتيبانی شده برای dial handler اختصاصی :
Public Const INTERNET_CUSTOMDIAL_SAFE_FOR_UNATTENDED = 1
Public Const INTERNET_CUSTOMDIAL_WILL_SUPPLY_STATE = 2
Public Const INTERNET_CUSTOMDIAL_CAN_HANGUP = 4

6 - وضعيتهای مربوط به InternetSetDialState :

Public Const INTERNET_DIALSTATE_DISCONNECTED = 1


در اين بخش که آخرين بخش از مباحث WinInet API است برنامه ای نمونه برای کار با توابع مودمی اين کتابخانه ارائه خواهيم داد :

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

Private Declare Function InternetDial Lib "wininet.dll" Alias "InternetDialA" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long

سپس وضعيت شماره گيری را در متغيری به اسم lOption قرار می دهيم . اين متغير می تواند مقادير زير را داشته باشد :
- DF_FORCE_ONLINE
- DF_FORCE_UNATTENDED
- DF_DIAL_FORCE_PROMPT
- DF_DIAL_UNATTENDED
حال نام اتصالی را که می خواهيم از آن استفاده شود در متغيری به اسم ConnectionName قرار می دهيم .
همچنين دو متغير به اسم ConnectionID و RetVal را از نوع long تعريف می کنيم .

حال تابع InternetDial را بصورت زير صدا می کنيم :

RetVal = InternetDial(Me.hwnd, ConnectionName, lOption, ConnectionID, 0)

اگر RetVal مخالف صفر باشد عمل Dial بدرستی انجام شده است .

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

Private Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long

سپس اين تابع را بصورت زير فراخوانی می کنيم :

RetVal = InternetHangUp(ConnectionID, 0)

برای اينکه مودم را مجبور کنيم تا بطور اتوماتيک از اتصال پيش فرض سيستم برای شماره گيری استفاده کند از تابع InternetAutodial  استفاده می کنيم .
برای اينکار ابتدا تابع را Declare می کنيم :

Private Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal hwndParent As Long) As Long

سپس تابع را بصورت زير فراخوانی می کنيم :

RetVal = InternetAutodial(ADF_FORCE_UNATTENDED, Me.hwnd)

اگر RetVal مخالف صفر باشد عمل AutoDial بدرستی انجام شده است .

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

Private Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long

فراخوانی اين تابع بصورت زير است :

    Call InternetAutodialHangup(0)

برای اينکه بفهيم آيا اتصال به اينترنت وجود دارد يا نه از تابع InternetGetConnectedStateEx استفاده می کنيم . برای اينکار ابتدا تابع را Declare می کنيم :

Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "InternetGetConnectedStateExA" (lpdwFlags As Long, lpszConnectionName As Long, dwNameLen As Long, ByVal dwReserved As Long) As Long

سپس تابع را بصورت زير فراخوانی می کنيم :

strConnectionName = Space(256)
lNameLen = 256
lPtr = StrPtr(strConnectionName)
lNameLenPtr = VarPtr(lNameLen)
RetVal = InternetGetConnectedStateEx(lConnectionFlags, ByVal lPtr, ByVal lNameLen, 0)

که strConnectionName از نوع String و بقيه متغيرها از نوع Long هستند .

اگر RetVal مخالف صفر باشد اتصال برقرار است .

ثابتهايی که در کدهای فوق استفاده شده عبارتند از :

Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1&
Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2&
Private Const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4&

Private Const INTERNET_DIAL_FORCE_PROMPT = &H2000
Private Const INTERNET_DIAL_SHOW_OFFLINE = &H4000
Private Const INTERNET_DIAL_UNATTENDED = &H8000

+ نوشته شده در  دوشنبه هشتم خرداد 1385ساعت 13:31  توسط DevilHell  | 

از خصوصیت Tag غافل نشوید

از خصوصیت Tag غافل نشوید

بیشتر برنامه نویسان Visual Basic هیچ وقت از خصوصیت Tag که همراه اغلب کنترلها هست، استفاده نمی کنند. براستی این خصوصیت که کاری انجام نمی دهد، پس فلسفه وجودی آن چیست؟ واقعیت آنست که این خصوصیت در موارد زیادی بسیار سودمند است. می تواینید هر گونه اطلاعاتی که می خواهید را در خصوصیات Tag کنترل ذخیره کنید و بهر طریقی که مایلید از آن اطلاعات استفاده کنید.

یک مثال، زمانی است که آرایه ای از کنترلهای CommandButton ایجاد می کنید. برنامه نویسان اغلب از آرگومان Index که به روال رویداد Click پاس داده می شود، برای تشخیص اینکه کدام دکمه از آرایه کلیک شده است استفاده می کنند. با انتساب یک مقدار گویا به خصوصیت  Tag، می توانید در عوض از آن استفاده کرده و در نتیجه کد خواناتری داشته باشید. در اینجا کدی برای یک مثال ساده می بینید:       

Private Sub Command1_Click(Index As Integer)

Select Case Command1(Index).Tag
    Case "Exit"
        ' Code to exit the program goes here.
    Case "Cancel"
        ' Code to cancel goes here.
End Select

End Sub

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

 

+ نوشته شده در  پنجشنبه چهاردهم اردیبهشت 1385ساعت 1:22  توسط بیتا  | 

خالی کردن تمامی کادرهای متن(Text Box) روی یک فرم

خالی کردن تمامی کادرهای متن(Text Box) روی یک فرم

حتما تا کنون بارها صفحات وبی را با چندین فیلد متنی، مثل فرمی برای سفارش آنلاین دیده اید.  

این فرم ها اغلب یک دکمه Clear یا Reset دارند که متنی را که در تک تک فیلدها وجود دارد پاک می کند و شما می توانید دوباره از ابتدا شروع به پر کردن آنها کنید. می توانید همانند این کار را برای فرم های Visual Basucانجام دهید، یعنی همه کنترلهای TextBox روی فرم را خالی کنید تا داده های جدید در آنها وارد شود.

برای انجام این کار، از کلکسیون Controls فرم استفاده کنید. این کلکسیون بازای هر کنترلی که روی فرم قرار دارد، یک عنصر دارد. با چرخیدن در این کلکسیون و با استفاده از کلمه کلیدی TypeOf می توان نوع هر کدام از این کنترلها رامشخص کرد. اگر کنترل Text Box بود، متن آنرا پاک کرد و چنانچه Text Box نبود آنرا نادیده گرفت. در زیر یک روال برای خالی کردن تمامی کنترلهای TextBox روی فرم آمده است:  

Public Sub ClearTextBoxes()

Dim c As Control

For Each c in Controls
   If TypeOf c Is TextBox Then
      c.Text = ""
   End If
Next

End Sub

در ضمن می توانید این تکنیک را به سایر کنترلها نیز بسط دهید. برای مثال کد زیر تمامی کنترلهای Check Box روی فرم را خالی می کند(تیکشان را بر می دارد):

For Each c In Controls
  If TypeOf c Is CheckBox Then
    c.Value = False
  End I
f

Next

منبع: http://www.pgacon.com/visualbasic.htm

نویسنده: Peter G. Aitken

لینک به منبع: http://www.pgacon.com/visualbasic.htm#Prevent%20Multiple%20Program%20Instances%20From%20Running

+ نوشته شده در  جمعه هشتم اردیبهشت 1385ساعت 1:34  توسط بیتا  | 

جلوگیری از اجرای چندین نمونه از یک برنامه

جلوگیری از اجرای چندین نمونه از یک برنامه

بسیاری از برنامه های ویندوز، از جمله برنامه هایی که توسط Visual Basic ایجاد می شوند، اجازه اینرا می دهند که در آن واحد، بیش از یک نمونه یا کپی از برنامه اجرا شود.  برای مثال می توانید در یک زمان، دو یا چند کپی از Notepad را در حال اجرا داشته باشید و با آن فایلهای متنی مختلف را ویرایش کنید.  مواردی هستند که در آنها مجاز دانستن چندین نمونه از یک برنامه فکر خوبی نیست. ممکن است برنامه ای یک فولدر را زیرنظر داشته باشد و بدنبال فایل های جدیدی باشد که در آن قرار داده می شود؛ بدین ترتیب هیچ نیازی به داشتن دو نمونه در حال اجرا از این برنامه نیست. همینطور برنامه ای که که front-end یک بانک اطلاعاتی است بایستی محدود به یک نمونه گردد، چراکه داشتن دو یا چند کپی اجرایی از آن در یک زمان ممکن است منجر به خطاهای کار با داده ها شود.

برای جلوگیری از اجرای همزمان چندین نمونه از یک برنامه، از خصوصیت App.PrevInstance استفاده کنید. این خصوصیت درصورتیکه نمونه دیگری از برنامه در حال اجرا باشد، مقدار True بر می گرداند. می توانید در یک روتین رویداد Load برنامه از این خصوصیت استفاده کنید. می توانید اگر مقدار True برگرداند، پیغامی را به کاربر نشان دهید و در صورت تمایل قبل از متوقف کردن نمونه تکراری جدید، کپی در حال اجرا را فعال سازید. در زیر نمونه کدی که باید آنرا در روتین رویداد Load قرار دهید آمده است:           

If App.PrevInstance Then
    MsgBox "یک نمونه دیگر از این برنامه اکنون در حال اجراست"
    AppActivate App.Title
    Unload Me
End If

منبع: http://www.pgacon.com/visualbasic.htm

نویسنده: Peter G. Aitken

لینک به منبع: http://www.pgacon.com/visualbasic.htm#Prevent%20Multiple%20Program%20Instances%20From%20Running

+ نوشته شده در  شنبه دوم اردیبهشت 1385ساعت 0:26  توسط بیتا  | 

بنام خدا و سلام!

باسلام خدمت دوستان عزیز،

من بیتا، یه برنامه نویس تازه کار که اصلا خبره هم نیست و خودش هم مرتب داره از دیگران و اینجا و اونجا چیز یاد می گیره و بهمین دلیل هیچ ادعایی نداره، با یاد ایزد یکتا و امید به اینکه مطالبی که اینجا می نویسم مفید باشه و آموزنده، شروع می کنم. امیدوارم که فرصت کافی داشته باشم و بتونم در آینده بخش نکته ها و ترفندهای Visual Basic رو مرتب بروز کنم. لطفا از نظر دادن دریغ نفرمائید!

ضمنا از دوست خوبم DevilHell که این گوشه از وبلاگش رو در اختیار من گذاشته متشکرم.    
+ نوشته شده در  شنبه دوم اردیبهشت 1385ساعت 0:24  توسط بیتا  |