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の起動時に自動実行する企みをおいおい実現していきます。
コメント
[…] 前記事https://ghost.mydns.jp/wordpress/c-builder-ce-code-fragment/の続編です。TNotificationCenterコンポーネントを使いますが、山本博さんのところに簡潔にまとまったコードがあるのでそれを参考にして作ります。 […]