PDA

View Full Version : اتصال به اينترنت



saleh_fartash
شنبه 25 خرداد 1387, 14:36 عصر
سلاممن مي خواستم وضعیت اینكه كاربر به ايتترنت وصل يا قطع شده را بفهمم .این رو در تاپیک کدهای دلفی دیدم ولی نمی دونم چرا یک صفحه تکراری رو می آورد.

B-Vedadian
یک شنبه 26 خرداد 1387, 09:09 صبح
کامپوننت های RAS زیادی وجود داره از یکیشون استفاده کن.

babak_delphi
یک شنبه 26 خرداد 1387, 12:53 عصر
من با یک جستجوی ساده این 3 مورد رو پیدا کردم
امید وارم مشکلتون حل بشه

http://barnamenevis.org/forum/showthread.php?t=83737&highlight=disconnect+%D8%A7%DB%8C%D9%86%D8%AA%D8%B 1%D9%86%D8%AA

http://delphi.about.com/cs/adptips2002/a/bltip1102_2.htm

http://barnamenevis.org/forum/showthread.php?t=33418&highlight=disconnect+%D8%A7%DB%8C%D9%86%D8%AA%D8%B 1%D9%86%D8%AA


در این مورد سوم کدها هم وجود دارد

ضمنا لازم نیست که فقط برنامه نویسی را تمرین کنید
2 چیز دیگه هم نیاز دارید
1 - جستجو
2 - با لحن درست صحبت کردن



بابا من بايد به چه زبونی بگم گشتم نبود

لازم نیست از زبون خاصی استفاده کنید
اینجا همه زبون بلدند

saleh_fartash
یک شنبه 26 خرداد 1387, 16:13 عصر
من می خوام وقتی کاربر به اینترنت وصل شد .ویندوز به من این رو بگه نه من از ویندوز بپرسم(شبیه به سرویس ها در ویندوز).

saleh_fartash
دوشنبه 27 خرداد 1387, 21:51 عصر
با تشکر از آقا بابک
تونستم سرویس کردن رو یاد بگیرم.آموزش رو برای دیگران می ذارم.

من مطالب رو جمع آوري کردم و اينجوري تونستم يه ServiceApplication يسازم که هر 10 ثانيه يه پيغام رو نشون بدهد:

براي نوشتن يک Service Application که بتواند هر 10 ثانيه يک پيغام نشان دهد:
ابتدا از منوي file گزينه New را انتخاب کرده و سپس روي گزينه Other کليک کنيد بعد در پنجره باز شده از سربرگ New گزينه ServiceApplication را انتخاب کنيد. با انجام اين کار يک کلاس با نام TService1 ايجاد مي شود که مي توانيد با قرار دادن هر شيء مورد دلخواه بر روي فرم آن برنامه خود را بنويسيد. براي برنامه ما از سربرگ System يک Timer بر روي سرويس گذاشته و خاصيت Interval آن را 10000 بگذاريد. حال در رويداد OnTimer کد زير را بنويسيد:
Showmessage('My Service is worked currently');
خاصيت DisplayName مربوط به Service1 را به MyTstSrv تغيير دهيد. اين نام بعد از اجراي سرويس در ليست سرويسها ظاهر مي شود.
خاصيت Interactive مربوط به Service1 را به True تغيير دهيد.
در رويداد OnExecute مربوط به Service1 کد زير را بنويسيد:
while not Terminated do
ServiceThread.ProcessRequests(True);// wait for termination
حال موقع نصب سرويس بر روي ويندوز رسيده است. براي اينکار بايد برنامه را با پارامتر/install اجرا کنيد. پس در دلفي به منوي Run رفته و روي گزينه Parameters کليک کنيد. در اين پنجره در کادر مربوط به Parameters عبارت /install را تايپ کنيد و روي Ok کليک کنيد. حال برنامه را اجرا کنيد. اگر همه مراحل را بدرستي انجام داده باشيد پيغام Service installed successfully ظاهر مي شود.
حال بايد به ليست سرويسهاي ويندوز برويد و سرويس خود را Start کنيد. (اين سرويس مي تواند با restart شدن ويندوز نيز Start شود) براي اين کار به Control Panel رفته و پنجره Administrative Tools را باز کنيد. در اين پنجره روي گزينه Services دابل کليک کنيد. با انجام اين کار يک پنجره باز مي شود که نام تمامي سريسهاي نصب شده برروي ويندوز وجود دارند. نام MyTstSrv را پيدا کرده و روي آن کليک راست کنيد و سپس گزينه Start را انتخاب کنيد. با انجام اين کار سرويس شما Start شده و بايد هر 10 ثانيه يکبار پيام شمار را نمايش دهد.
براي حذف کردن سرويس از روي ويندوز بايد برنامه را با پارامتر /Uninstall اجرا کنيد. با انجام اين کار پيام Service Uninstalled Successfully ظاهر مي شود.

( باید بگم که"/" قبل از install , uninstall است)ز

MohsenTi
دوشنبه 27 خرداد 1387, 22:53 عصر
سلام دوست خوبم برای اینکه بتونی بدون پارامتر یک سرویس را نصب کنی می تونی از این کد در دلفی استفاده کنی .

winexec(Service_address.exe+' /install',sw_Show);
همچنین برای حذف سرویس از دستور زیر

winexec(Service_address.exe+' /uninstall',sw_Show);
یا میتونی از توی cmd این دو کد را برای نصب و حذف سرویس بنویسی

service_address.exe /install
service_address.exe /uninstall
امیدوارم به کارتان بیاید.

MohsenTi
دوشنبه 27 خرداد 1387, 23:37 عصر
دوستان من می خوام سوال دوستمون را کامل کنم .
چطوری میشه یک سرویس نوشت که ویندوز به ما اعلام کنه که به اینترنت متصل شده یا نه
آخه سرویس هم یه چیزی مثل یک فایل اجرایی و با نوشتن کد در اون باید هر لحظه چک کنه که
به اینترنت وصل هست یا نه که این خیلی وقت کامپیوتر رو می گیره .
من تو رویدادهای مختلف کلاس سرویس امتحان کردم ولی نشد چون من هم به نوشتن سرویس علاقه دارم می خواستم ببینم چطور میشه به ویندوز فهموند که وقتی یه اتفاق خواص (وصل شدن به اینترنت) رویداد برنامه ی خواصی را اجرا کنه .
کد چک اتصال به اینترنت هم اینه

{load dll}
function FuncAvail(_dllname, _funcname: string;
var _p: pointer): boolean;
{return True if _funcname exists in _dllname}
var _lib: tHandle;
begin
Result := false;
if LoadLibrary(PChar(_dllname)) = 0 then exit;
_lib := GetModuleHandle(PChar(_dllname)) ;
if _lib <> 0 then begin
_p := GetProcAddress(_lib, PChar(_funcname)) ;
if _p <> NIL then Result := true;
end;
end;

{
Call SHELL32.DLL for Win < Win98
otherwise call URL.dll
}
{button code:}
var
InetIsOffline : function(dwFlags: DWORD):
BOOL; stdcall;
begin
if FuncAvail('URL.DLL', 'InetIsOffline',
@InetIsOffline) then
if InetIsOffLine(0) = true
then ShowMessage('Not connected')
else ShowMessage('Connected!') ;
end;

aserfg
سه شنبه 28 خرداد 1387, 21:45 عصر
آقا صالح عزيز اين روشي كه بالا توضيح دادي رو انجام دادم سرويس هم نصب شد و بعد از start كردنش هيچ پيغامي نداد .

saleh_fartash
چهارشنبه 29 خرداد 1387, 00:42 صبح
خوش تیپ تو از کجا می دونی اسمم صالح است.
مطمعنا اگه روش بالا رو درست انجام داده باشی درست کار می کنه چون خودم بار ها انجام دادم تازه آقای mohsen ti هم انجام داده.

دوباره ودوباره با توجه کامل

saleh_fartash
چهارشنبه 29 خرداد 1387, 15:47 عصر
برای این کار رفتم روش ساخت سرویس رو پیدا کردم.
کد تشخیص به اتصال رو هم آقای mohsen ti گذاشتن ولی باید ویندوز چک کنه وخبر بده .آیا کسی هست که جواب رو بدونه؟

aserfg
چهارشنبه 29 خرداد 1387, 21:16 عصر
تو از كجا مي دوني خوش تيپم ولي اشتباه من اين بود كه فكر كردم وقتي سرويس ايجاد شد نيازي به اجراي فايل exe نيست و سرويس خودش كار و انجام ميده به هر حال ممنون.

saleh_fartash
پنج شنبه 30 خرداد 1387, 10:53 صبح
حس ششم.
منظور تو اینه که برنامه رو پلی نمی کردی ؟ توباید برنامه رو پلی کنی و اگر پیغام نصب رت به درستی داد اون وقت بری به آدرس که گفتم و اون رو پلی کنی (یا از راه آقای mohsen ti استفاده کنی که به صورت خودکار نصب بشه حتما بهجواب می رسی .

ولی کسی نیست که به من بگه چیکار کنم تا ویندوز خودش پیغام اتصال به اینترنت رو به من بده؟

vcldeveloper
پنج شنبه 30 خرداد 1387, 19:13 عصر
کسی نیست که به من بگه چیکار کنم تا ویندوز خودش پیغام اتصال به اینترنت رو به من بده؟
باید اول ببینی که آیا در ویندوز اصلا همچین پیامی وجود داره یا نه.

saleh_fartash
پنج شنبه 30 خرداد 1387, 22:03 عصر
منظورتون رو نفهمیدم .میشه بیشتر توضیح بدین.
من از ویندوز می خوام خودش بیاد بگه کاربر به اینترنت وصل شده نه من برم چک کنم .چون نمیدونم کی می خواد این کارو بکنه.

aserfg
جمعه 31 خرداد 1387, 11:12 صبح
دوست گرامي اگه بايد فايل اجرايي و سرويس هر دو اكتيو باشند كه براي مشكل شما نيازي به نصب سرويس نيست شما مي تونين به روش زير عمل كنين:



uses
WinInet;
function IsConnectedToInternet: Boolean;
var
dwConnectionTypes: DWORD;
begin
dwConnectionTypes :=
INTERNET_CONNECTION_MODEM +
INTERNET_CONNECTION_LAN +
INTERNET_CONNECTION_PROXY;
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;





procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IsConnectedToInternet then
ShowMessage('Connected.')
else
ShowMessage('Not Connected.')

end;
البته خاصيت interval رو جوري تنظيم كنين كه برنامه با مشكل مواجه نشه.

saleh_fartash
جمعه 31 خرداد 1387, 12:04 عصر
نه من این رو نمی خوام چون به نظر من اشتباه برای اینکه باید یه تایمر همین تور کار کنه که به نظر من خنده دار و تازه اگه اینتراول رو زیاد کنم چند ثانیه بعد از کاربر به من خبر می ده که این رو نمی خوام . برای همین رفتم سراغ سرویس رفتم که ویندوز به من خبر بده.

babak_delphi
شنبه 01 تیر 1387, 01:00 صبح
اگر با سرویس مشکلتون حل نشد و از تایمر هم نمی خواهید استفاده کنید ، برید سراغ thread

vcldeveloper
شنبه 01 تیر 1387, 01:04 صبح
نه من این رو نمی خوام چون به نظر من اشتباه برای اینکه باید یه تایمر همین تور کار کنه که به نظر من خنده دار و تازه اگه اینتراول رو زیاد کنم چند ثانیه بعد از کاربر به من خبر می ده که این رو نمی خوام . برای همین رفتم سراغ سرویس رفتم که ویندوز به من خبر بده.سرویس برای این نیست که اگر اتفاقی در ویندوز افتاد، ویندوز شما را خبر کنه! احتمالا مفهوم سرویس در ویندوز را درست متوجه نشدید.

همونطور که در پست قبل هم گفتم؛ باید ببینید آیا اصلا ویندوز در زمان اتصال به اینترنت پیامی برای ارسال به برنامه ها تولید میکنه یا نه، اگر نمیکنه، پس برنامه ها باید خودشون به طور مرتب وضعیت اتصال به اینترنت را بررسی کنند، یا اینکه تمامی توابعی که میتوانند به نوعی منجر به اتصال به اینترنت شوند را Hook کنند، که این مورد یک بحث جدا ست و می تونید برای آشنایی بیشتر با آن درباره API Hook تحقیق کنید.


اگر با سرویس مشکلتون حل نشد و از تایمر هم نمی خواهید استفاده کنید ، برید سراغ thread
Thread چه ربطی به این داشت که کاربر نمیخواد از تایمر استفاده کنه؟!

saleh_fartash
یک شنبه 28 تیر 1388, 10:45 صبح
دوستان من بعد از مدت ها هم به جواب نرسیدم.
من را هایی گفتن رو بررسی کردم.
درباره ی هوک کردن هم دوستی به من یک کتاب معرفی کرد که من نتونستم به جوابم برسم.
بعد از مدت ها کار من به این موضوع افتاد.
تو این مدت کسی به جواب نذسیده؟

Hamid.Kad
سه شنبه 06 مرداد 1388, 16:09 عصر
دوست عزیز. بنظرم حرف جناب کشاورز درسته. باید بگردید ببینید ویندوز پیامی ارسال میکنه. تنها روشی که برای مشکل شما وجود داره message oriented هست که اونم بستگی داره که آیا ویندوز پیامی ارسال میکنه یا نه. من جستجو کردم چیزی پیدا نکردم. شما خودت هم یه جستجو بکن. چون من خیلی وقت نذاشتم. شرمنده

ghasemshami
دوشنبه 16 شهریور 1388, 16:23 عصر
function INTERNETCONNECTED: Boolean;
CONST
// local system uses a modem to connect to the INTERNET.
INTERNET_CONNECTION_MODEM = 1;
// local system uses a local area network to connect to the INTERNET.
INTERNET_CONNECTION_LAN = 2;
// local system uses a proxy server to connect to the INTERNET.
INTERNET_CONNECTION_PROXY = 4;
// local system's modem is busy with a non-INTERNET connection.
INTERNET_CONNECTION_MODEM_BUSY = 8;
VAR
dwConnectionTypes : DWORD;
BEGIN
dwConnectionTypes :=
INTERNET_CONNECTION_MODEM +
INTERNET_CONNECTION_LAN +
INTERNET_CONNECTION_PROXY;
Result := INTERNETGetCONNECTEDState(@dwConnectionTypes,0);
END;

می تونی از function استفاده کنی و بهت برمی گردونه که آیا متصل است یا نه

saleh_fartash
چهارشنبه 18 شهریور 1388, 01:13 صبح
دوستان به طور مثال در یاهو مسنجر وقتی شما به اینتذنت وصل می شود به شما پیغام میدهد یا نرافزار های ویروس یاب.
من حتی یک نرمافزار ایرانی دیدم که هزینه اینترنت رو محاسبه می کرد که اون هم متوجه می شد.

Hamid.Kad
چهارشنبه 18 شهریور 1388, 11:11 صبح
شما چرا نمی خواید از تایمر و اون تابع استفاده کنید؟ من فکر نمی کنم اونجوری که فکر می کنید روش بدی باشه. درسته که با استفاده از تایمر، مرتباً این تست باید انجام بشه، ولی در خاطر داشته باشید که حتی اگر هم پیامی هر برای این کار وجود داشته باشه باز هم در سطح خود سیستم عامل تست دریافت پیامها با استفاده از یک Loop انجام میشه. اگه مشکل اینه که فرمودید ممکنه کاربر دیر متوجه اتصال به اینترنت بشه، می تونید زمان تایمر رو کوتاه انتخاب کنید. من خودم از این روش استفاده مبکنم (حتی با اینتروال 1 میلی ثانیه) و نتیجه بدی هم نگرفتم

saleh_fartash
پنج شنبه 26 شهریور 1388, 07:04 صبح
نه،تا زمانی که میدونم راه حل تمیزی هست که مثلا یاهو مسنجر استفاده می کنه ،سراغ این را حل ها نمیرم.

ghasemshami
چهارشنبه 01 مهر 1388, 11:00 صبح
اگه کارتون راه نیفتاد پیام بدید تا نمونه برنامه ای کامل و رایگان براتون ارسال کنم