PDA

View Full Version : سوال: تشخیص وضعیت یک Connections ، چگونه ؟



hamid-nic
جمعه 10 آذر 1391, 16:40 عصر
سلام
برای تشخیص وضعیت اتصال بودن یا نبودن یک کانکشن ارتباطی از انواع broadband یا Dial-Up و یا VPN (Virtual Private Network) باید به چه نحوی اقدام کرد ؟ جست و جو کردم از توابع RAS میشه استفاده کرد ولی چیزی پیدا نکردم . دوستان اگر در این زمینه تجربه ای دارند ممنون می شوم .

Felony
جمعه 10 آذر 1391, 17:11 عصر
باید از تابع RasGetConnectStatus (http://msdn.microsoft.com/en-us/library/windows/desktop/aa377503(v=vs.85).aspx)استفاده کنید ، تو نت نمونه کدهایی میشه پیدا کرد ، مخصوصا ++C که راحت میشه ترجمشون کرد .

اگر هم خواستید لیست Connection ها رو بگیرید باید از تابع RasEnumConnections (http://msdn.microsoft.com/en-us/library/windows/desktop/aa377284(v=vs.85).aspx)استفاده کنید .

hamid-nic
جمعه 10 آذر 1391, 18:39 عصر
ممنون آقا ماهان با استفاده از تابع RasEnumConnections لیست کانکشن ها را در یک listbox آوردم اما حالا می خواهم یک تابعی با خروجی Boolean بسازم که با با انتخاب یک مورد از این لیست (listbox) وضعیت وصل بودن یا نبودن را بواسطه ی تابع RasGetConnectStatus مشخص و بصورت 0 یا 1 برگردونه .
فعلا مشکل با پاس دادن پارامتر به تابع RasGetConnectStatus است .

Felony
جمعه 10 آذر 1391, 18:56 عصر
خوب ، با چیش مشکل داری ؟ تابع RasEnumConnections یک اشاره گر به آرایه ای با ساختار RASCONN (http://msdn.microsoft.com/en-us/library/windows/desktop/aa376725(v=vs.85).aspx)بر میگردونه ، طول آرایتون رو پارامتر lpcConnections این تابع تعیین میکنه ، هر کدوم از خونه های آرایه اشاره به یک Connection دارن ، هر Connection با توجه به ساختار اون RASCONN یک پارامتر با نام HRASCONN داره که به نوعی هندل اون Connection هست ، شما باید این پارامتر رو به تابع RasGetConnectStatus پاس بدی تا وضعیت اون Connection رو بهتون برگردونه .

hamid-nic
جمعه 10 آذر 1391, 23:42 عصر
ممنون از راهنماییتون .
قراره در ابتدا لیست همه ی کانکشن های سیستم توی یک listbox ریخته شه و در مرحله ی بعد کاربر یک با چندین کانکشن را انتخاب و در یک لیست دیگر قرار بدهد یعنی یک لیست سفارشی شده حال از طرفی برای اجرای تابع RasGetConnectStatus نیاز به هندل یک کانکشن برای انجام کار داره لذا اینکه به چه شکلی وقتی index در یک listbox ست میشه
ListBox1.Items
[ListBox1.ItemIndex] راحت بشه همون کانکشن انتخاب شده برای تشخیص وضعیت به تابع RasGetConnectStatus فرستاده بشه برام نامفهومه همان طور که می دانید ساختار این تابع به شکل زیر است :

DWORD RasGetConnectStatus(

HRASCONN hrasconn,
// handle to RAS connection of interest
LPRASCONNSTATUS lprasconnstatus
// buffer to receive status data
);

حال ارسال مقدار برای پارامتر های این تابع به چه شکلی میشه ؟ :متفکر:

Felony
شنبه 11 آذر 1391, 06:16 صبح
میتونید از کلاس TDictionary که یک Generic هست استفاده کنید ، این کلاس همونطور که از اسمش پیداست دقیقا مثل یک دیکشنری عمل میکنه ، یعنی به ازای هر Key یک Value میگیره و در آخر شما میتونی با دادن یک کلید Value متناظرش رو ازش واکشی کنی ، مثلا :


var
Dic: TDictionary<string, hrasconn>;
begin
Dic:= TDictionary<string, hrasconn>.Create(1);
Dic.Add('Dialup Connection 1', 43468769);
ShowMessage(IntToStr(Dic.Items['Dialup Connection 1']));
end;

وقتی داری مشخصات Connection ها رو به دست میاری تو دیکشنری به ازای هر Connection یک مقدار اضافه کن ، اسم به عنوان Key و هندل به عنوان Value تا بعدا بتونی واکشیشون کنی ، به جای هندل هم میتونی کل ساختار رکورد RASCONN رو برای هر Connection ذخیره کنی تا بتونی با دادن اسم کانکشن به تمام مشخصاتش دسترسی داشته باشی که در این صورت تعریف دیکشنری به صورت زیر در میاد :


var
Dic: TDictionary<string, TRasConnection>;

TRasConnection همون پیاده سازی ساختار RASCONN هست .

موقع ساخت دیکشنری باید ظرفیتش رو تعیین کنید ، در کد بالا من ظرفیت رو 1 قرار دادم که شما میتونید با استفاده از همون پارامتر lpcConnections ظرفیتش رو به تعداد Connection های یافت شده تعیین کنید .

در آخر وقتی کاربر رو هر آیتمی کلیک کرد عنوانش رو از ListBox میخونی و به دیکشنری پاس میدی تا هندل متناظرش رو برات پیدا کنه .