読者です 読者をやめる 読者になる 読者になる

The Grimoire of Nonsense

個人的なメモを残すブログ

DNSリゾルバキャッシュをクリアする

ipconfigコマンドならipconfig /flushdnsからクリアできるリゾルバキャッシュをAPIから削除する時は、
DnsAPI.dllのDnsFlushResolverCache()を用いる。
この関数、どうやら非公開っぽい*1ので直接DnsAPI.dllからLoadLibrary()してGetProcAddress()する方向で行く。


以下僕が書いたサンプルコード

#include <windows.h>

BOOL DnsFlush()
{
	// DnsFlushResolverCache()格納用
	BOOL (WINAPI *DnsFlush)() = NULL;
	
	// DnsAPI.dll読み込み
	HMODULE hModule = LoadLibrary(TEXT("DnsAPI.dll"));
	if(hModule == NULL) {
		MessageBox(NULL, TEXT("DnsAPI.dllの読み込みに失敗しました"), TEXT("LoadLibrary Error"), MB_OK | MB_ICONERROR);
		return FALSE;
	}
	
	// DnsFlushResolverCache()を読み込む
	DnsFlush = (BOOL (WINAPI*)())GetProcAddress(hModule, TEXT("DnsFlushResolverCache"));
	if(DnsFlush == NULL) {
		MessageBox(NULL, TEXT("DnsFlushResolverCache()の読み込みに失敗"), TEXT("GetProcAddress Error"), MB_OK | MB_ICONERROR);
		FreeLibrary(hModule);
		return FALSE;
	}
	
	// DNSキャッシュを消しちゃうよ~
	BOOL result = DnsFlush();
	FreeLibrary(hModule);
	
	return result;
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow)
{
	if(DnsFlush() == TRUE) {
		MessageBox(NULL, TEXT("DNSキャッシュを削除しました"), TEXT("Success"), MB_OK | MB_ICONINFORMATION);
	} else {
		MessageBox(NULL, TEXT("DNSキャッシュの削除に失敗しました"), TEXT("Error"), MB_OK | MB_ICONERROR);
	}
	
	return 0;
}

*1:MSDNにドキュメントないし……。