MFC, SDI です。
インターネットに接続しているかどうかを調べるコードを書きたいのですが、うまくい
きません。
http://www.cfanatic.com/topic49/
このページを見つけたのでやってみましたが、ビルドすると
「'InternetGetConnectedState' : 1 番目の引数を 'int' から 'LPDWORD' に変換でき
ません。」
となります。
Wininet.h や wininet.lib ファイルを入手する必要があるのでしょうか。
よろしくお願いいたします。
InternetGetConnectedState()の第一引数は、戻り値でもあるのでポインタを指定しな
ければなりません。
APIの詳細はMSDNを参照すると良いでしょう。
http://msdn.microsoft.com/ja-jp/library/aa384702
>Wininet.h や wininet.lib ファイルを入手する必要があるのでしょうか。
OSやMFCのバージョンにもよりますが、最近のVCがインストールされている環境なら、
インクルードファイルやライブラリファイルは含まれているはずです。
AR様、有り難うございます。
教えて戴いたMSDNの InternetGetConnectedState() は見ていたのですが、第1変数は
LPDWORDなのに取るべき値は INTERNET_CONNECTION_LAN 等の int が示されていて、理解
できずにいます。
LPDWORD lpdwFlags;
if (InternetGetConnectedState(lpdwFlags, 0) == FALSE)
{
// Don't attempt connection
}
としたとき、lpdwFlags に INTERNET_CONNECTION_LAN 等の値を代入する仕方が解りませ
ん。
初心者です。よろしくお願いいたします。
>としたとき、lpdwFlags に INTERNET_CONNECTION_LAN 等の値を代入する仕方が解りま
せん。
「LPDWORD」とは「DWORD*」と同じ意味を持ちます。
LPという接頭語は「LONG POINTER」の略だったかな。
ポインタの使い方はC言語の最低限の基本なので、しっかりマスターする事をお奨めし
ます。
DWORD lpdwFlags = INTERNET_CONNECTION_LAN;
if (InternetGetConnectedState(&lpdwFlags, 0) == FALSE)
{
// Don't attempt connection
}
ご教示ありがとうございました。
基本が解っていなくて恥ずかしいですが、ともかくやってみました。
DWORD dwFlags = INTERNET_CONNECTION_MODEM;
BOOL bOnline = InternetGetConnectedState(&dwFlags, 0);
if (bOnline) MessageBox(_T(TRUE));
else MessageBox(_T(FALSE));
自分のPCはモデムでインターネット接続していて、LAN接続はしていません。
上記を動作させると、インターネット接続を切断していても TRUE になります。
dwFlags に INTERNET_CONNECTION_LAN を入れても、INTERNET_CONNECTION_PROXY を入れ
ても同じく常に TRUE です。
困りました。
INTERNET_CONNECTION_MODEMって、電話回線に繋がってるものなのでADSLモデムなら
LANですよ。
InternetGetConnectedStateからのTRUEの返り値は、インターネットへの少なくとも1
つの接続が利用可能であることを示します。
また、このAPIは接続キャッシュの影響を受けるので、環境によってテストが難しかっ
たと記憶しています。
あと、MSDNの記述はきちんと読まれましたか?
MSDNの記述どおり、URL指定でアクセス可能か調べるInternetCheckConnection()など
手法もあります。
あと、似たような内容で悩んでいる方がいらっしゃったので紹介しておきます。
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200312/03120080.txt
こちらは、InternetOpenURL()で解決されたようです。
自分の環境は光接続なので LAN でしょう。
しかし、作っているソフトは不特定多数のユーザー向けということもあるので、
InternetGetConnectedState() は諦めます。
InternetCheckConnection() をやってみました。
BOOL bOnline = InternetCheckConnection(_T( http://www.google.com),
FLAG_ICC_FORCE_CONNECTION, 0);
if (bOnline) MessageBox(_T(TRUE));
else MessageBox(_T(FALSE));
これで TRUE と FALSE が正しく帰ってきますが、接続していないとき、接続を促す「ダ
イアルアップ接続」ダイアログが出るのが邪魔なのと、3回に1回くらい非常に長く
(約1分)フリーズしたみたいになった後 FALSE が帰ってくるのが問題です。
一応これで進めることにします。
InternetOpenURL() はコードがややこしそうなのでトライしていませんが、URLを指定す
る点で、結果は InternetCheckConnection() と同じになると思います。
一応解決ということにします。
ご親切にありがとうございました。