PDA

View Full Version : سوال: پيغام اتصال به اينترنت



A_Salimi
دوشنبه 06 خرداد 1387, 10:56 صبح
سلام . ميخواستم بدونم براي اتصال به اينترنت چه پيغامي در MFC وجود داره ؟

من با استفاده از تابع InternetGetConnectedState ميتونم وضعيت اتصال به اينترنت رو تشخيص بدم ولي پيغامي رو ميخوام که به محض اتصال و يا قطع ارتباط اينترنتي به برنامه ارسال بشه . . .

با تشکر

Nima_NF
چهارشنبه 08 خرداد 1387, 16:39 عصر
یک بررسی بر روی InternetStatusCallback انجام دهید، از این طریق پارامتر lpvStatusInformation باید بتوان پیام ها قطع و یا اتصال را دریافت کرد، با توجه به MSDN می توان به شکل زیر تابع callback را برای دریافت موارد فراخوانی کرد:



HINTERNET hOpen; // Root HINTERNET handle
INTERNET_STATUS_CALLBACK iscCallback; // Holder for the callback
// function

// Create the root HINTERNET handle.
hOpen = InternetOpen( "Test Application",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);

// Set the status callback function.
iscCallback = InternetSetStatusCallback( hOpen,
(INTERNET_STATUS_CALLBACK)CallMaster );


برای دیدن مثال کامل این صفحه را مشاهده کنید، (http://msdn.microsoft.com/en-us/library/aa383976%28VS.85%29.aspx)
شما باید بر روی فلگ INTERNET_STATE_DISCONNECTED و INTERNET_STATE_CONNECTE بررسی انجام دهید.

A_Salimi
پنج شنبه 09 خرداد 1387, 18:10 عصر
سلام

یه جاهایی رو نمیتونم درست متوجه بشم :

یعنی برای استفاده از InternetStatusCallback ما باید این دو کار رو قبلش انجام بدیم :

1-تعریف context value.
2-ایجاد status callback function.


در حقیقت میخوام بدونم این طور استفاده از CALLBACK ها چه تفاوتی با پیغام های آماده در MFC دارد ؟
و بعد از اجرای برنامه چه روندی طی میشود تا این کدها شبیه به پیغام عمل کنند ؟

ضمنا کدی رو که بالا قرار دادید (قسمت انتهایی مثال) را چطور در برنامه بکار ببرم ؟

و یک چیز دیگه : در جایی به من گفتند که اگر پورت 80 و 443 را چک کنم هم میتوانم از وصل و قطع شدن به اینترنت مطلع شوم آیا این روش ممکن است و کد نویسی کمتری ندارد ؟

اگر توضییح بیشتری بدهید ممنون میشوم . . .

Nima_NF
شنبه 11 خرداد 1387, 13:49 عصر
شما کد قسمت چهارم را در هر جایی از برنامه می توانید فراخوانی کنید، در هنگام شروع ، با کلیک کردن بر روی دکمه ای و ...
بعد تابع CallMaster را خارج از کلاس ها در همان فایل قرار دهید که دسترسی به آن وجود داشته باشد، با این کار هرگاه اتصال یا قطع رخ داد به تابع CallMaster پیام ارسال می شود که می توانید همان موقع هر پیغام یا کاری که می خواهید انجام دهید. (قرار نیست همه فلگ ها را مورد استفاده قرار دهید فقط ان هایی را که نیاز دارید که می شود چند خط کد)

ضمنا هر وقت هم که خواستید در جایی از برنامه از طریق InternetConnect از پورت دلخواه استفاده کنید مثلا پورت 80 یا همان INTERNET_DEFAULT_HTTP_PORT که بعد از آن باید InternetSetStatusCallback را با هندل InternetConnect فراخوانی کنید،
سپس پیام های آن به تابع CallMaster ارسال می شود.

این را هم تذکر بدم که موارد فوق Win32 هست ، برای MFC نیز توابع و کلاس های مشابه وجود دارد که در صورت نیاز خودتان بر روی آن ها کار کنید ، مثل EnableStatusCallback و OnStatusCallback

A_Salimi
دوشنبه 13 خرداد 1387, 23:12 عصر
با یک مشکل مواجه شدم :

ببینید لینکی رو که دادید یک برنامه هست که برای محیط c++ بیان شده است یعنی نتایج

خروجی در یک پنجره داس مانند نمایش داده خواهد شد حالا من که قرار است این برنامه را

در mfc پیاده سازی کنم با تابع CallMaster مشکل پیدا کردم چرا که فعلا میخواهم پیغام ها را

با MessageBox و یا نمایش در یک کادر ویرایشی نمایش دهم ولی با قرار دادن MessageBox

در برنامه مثلا بعد از پیاده سازی قسمتی از کد به این صورت ، دچار خطای زیر میشود :





switch (dwInternetStatus)
{
case INTERNET_STATUS_CLOSING_CONNECTION:

MessageBox("My Message");
.
.
.


error C2660: 'MessageBoxW' : function does not take 1 arguments


در صورتی که استفاده از تابع MessageBox اشتباه نیست .

پس تنها نتیجه ای که گرفتم این بود که این CallMaster عضو کلاس من نیست و به این صورت

نوشتم :



void __stdcall CTestDlg::CallMaster(
.
.
.



این کار چه اشکالی داره ؟

من با این خطا مواجه شدم :


error C2039: 'CallMaster' : is not a member of 'CTestDlg'


خوب پس تنها نتیجه ای که گرفتم تعریف تابع در فایل هدر بود که من اون رو به برنامه اضافه

کردم :

یعنی به این صورت :



public:
CString output;
void __stdcall CconnecttimeDlg::CallMaster(
HINTERNET hInternet,
DWORD_PTR dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
);



اما با اشکالهای بدتری مواجه شدم مثل :

error C2061: syntax error : identifier 'HINTERNET'
error C2440: 'type cast' : cannot convert from 'overloaded-function' to

'INTERNET_STATUS_CALLBACK'

در هر حال این تابع رو چطور در برنامه پیاده سازی کنم که سایر توابع (مثلا تابعی مثل

UpdateData() )را در آن بتوانم بدرستی پیاده کنم ؟

ممنون

Nima_NF
سه شنبه 14 خرداد 1387, 01:45 صبح
این را هم تذکر بدم که موارد فوق Win32 هست ، برای MFC نیز توابع و کلاس های مشابه وجود دارد که در صورت نیاز خودتان بر روی آن ها کار کنید ، مثل EnableStatusCallback و OnStatusCallback
اگرمی خواهید نهایت سازگاری را با MFC داشته باشید باید از کلاس های MFC استفاده کنید که راحت تر هست و در فوق چند متد ذکر شد، مثلا متد OnStatusCallback را باید override کنید که اطلاعات چندان زیادی برای کار با MFC ندارم.

اگر هم هنوز می خواهید از win32 استفاده کنید کتابخانه Wininet.lib را به لینکر اضافه کنید و Wininet.h و Windows.h فراموش نشود. در این صورت دیگر نمی توانید از همه امکانات MFC استفاده کنید و برای set کردن متغیر ها باید از توابع دریافتو ارسال مثل SetWindowText و غیره استفاده کنید.
ضمنا تابع callback در win32 نباید داخل کلاسی تعریف شود ، خارج از آن.