C++ Builder CE code fragment

TIdDNSResolverでDNSからアドレスを引く

Domain Name Serverに問い合わせて、Domain NameからIPアドレスを引くという作業をIndyのTIdDNSResolverを使って行います。別記事で扱っているiobb.netのサービス停止を監視するという意図もあります。TIdDNSResolverの使い方は充分な情報がDelphi版でもないので、一応動いたC++ Builder版を公開します。

またcode fragmentというくくりで、短く再利用しやすいコードを示して行けたらと思います。短いながらも完結したコードということで、使わざるを得ない場合でもコンポーネントはなるべく動的割り付けで使います。さて、まず必要なヘッダ群は、

#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdDNSResolver.hpp>
#include <IdTCPConnection.hpp>

で、コードは、

String target = "whereis.mysite.jp";

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
 	try
	{

		TIdDNSResolver* resol = new TIdDNSResolver(this);

		resol->Host = "8.8.8.8"; // Google's public DNS server
		resol->QueryType = resol->QueryType << qtA;
		resol->Resolve(target);

		for (int i = 0; i < resol->QueryResult->Count; i++){
			TResultRecord* const Rec = dynamic_cast<TResultRecord*>(resol->QueryResult->Items[i]);
			if (Rec)
			{
			   if( Rec->RecType == qtA ) {
				String address =  ((TARecord*)(Rec))->IPAddress;
				Label1->Caption = address;
			   }
			}
        }

	}
    catch (const Exception &E)
    {
        ShowMessage("Error: " + E.Message);
    }

}

もちろん、

String target = "whereis.mysite.jp";

は具体的なホスト名を入れてください。また結果表示のためのTLabelも配置してください。それも動的に置けって?このまま実行すると、DNS引けませんので、

IDEが先にエラートラップしましたね。IDEを抜けてファイルエクスプローラーからProject1.exeをダブルクリックで起動すると、

と期待通りの結果となります。さて、この結果をWindowsの通知で表示しつつ、Windowsの起動時に自動実行する企みをおいおい実現していきます。

コメント

  1. […] 前記事https://ghost.mydns.jp/wordpress/c-builder-ce-code-fragment/の続編です。TNotificationCenterコンポーネントを使いますが、山本博さんのところに簡潔にまとまったコードがあるのでそれを参考にして作ります。 […]