SAK 図書館
VS.NET C 言語編5 - win32 DLL、PC 情報取得、winsock、gethostbyname
ホスト名取得(コンピュータ名取得) や IP アドレス取得の質問が割りとあった ので、C で DLL を作成してみた。 PC 情報、その他 sakinfo.dll - sakif110.lzh のダウンロードは、次のリンクから 行って下さい。『sakif110.lzh 22,247 bytes』 VB からの呼び出しについては、 『VB テクニック編38 - PC 情報取得、OS 種別、ユーザ名、ホスト名、IP アドレス』 を参照して下さい。 ■sakinfo.dll - GetPcInfo() ・PC 情報取得 - GetPcInfo() は、次のように呼び出します。 一部の情報取得に問題があった場合は、戻り値に FALSE が返りますが、 取得できた項目に対してはデータがセットされています。 戻り値が FALSE のとき、errmsg にエラー内容がセットされます。 C の TRUE と VB の TRUE は違うので、VB で戻り値を判定する場合は注意 して下さい。 rcd = GetPcInfo(osinfo, username, hostname, ipaddress, errmsg); | | | | | | | | | | | |_ エラーメッセージ格納文字列ポインタ(LPTSTR) | | | | |_ IP アドレス格納文字列ポインタ(LPTSTR) | | | |_ ホスト名格納文字列ポインタ(LPTSTR) | | |_ ユーザ名格納文字列ポインタ(LPTSTR) | |_ OS 種別格納文字列ポインタ(LPTSTR) |_ 戻り値(BOOL) TRUE 正常 FALSE エラー ・引数に渡す文字列ポインタの実態には十分な領域を確保しておく必要があり ます。GetPcInfo() 関数内でバッファが足りるかチェックしていません。 C なら TCHAR buf[300]; 程度、VB なら、dim buf as string の後、 buf = space(300) 程度を確保して下さい。 ■モジュール定義ファイル(sakinfo.def) LIBRARY sakinfo EXPORTS GetPcInfo = GetPcInfo ■C ソース(sakinfo.cpp) /* ======================================================================== sakinfo.dll - PC 情報 ======================================================================== */ // インクルードヘッダ #include <windows.h> #include <winsock.h> // 定数宣言 #define DllExport __declspec(dllexport) #define MAX_STR 256 // 文字列最大数 /* ======================================================================== メイン ======================================================================== */ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } /* ======================================================================== PC 情報取得 ======================================================================== */ DllExport BOOL WINAPI GetPcInfo(LPTSTR osinfo, LPTSTR username, LPTSTR hostname, LPTSTR ipaddress, LPTSTR errmsg) { WSADATA ws; PHOSTENT he; IN_ADDR ip; int ln; OSVERSIONINFO oi; TCHAR s[MAX_COMPUTERNAME_LENGTH + 1]; BOOL rcd = TRUE; // 準備 lstrcpy(osinfo , ""); lstrcpy(username , ""); lstrcpy(hostname , ""); lstrcpy(ipaddress, "0.0.0.0"); lstrcpy(errmsg , ""); // OS 取得 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx(&oi)) { lstrcat(errmsg, "OS 取得エラー "); rcd = FALSE; } else { switch (oi.dwPlatformId) { case VER_PLATFORM_WIN32s: lstrcpy(osinfo, "3.1 win32s"); break; case VER_PLATFORM_WIN32_WINDOWS: lstrcpy(osinfo, "95, 98, Me"); break; default: lstrcpy(osinfo, "NT, 2000, XP"); } } // ユーザ名取得 ln = MAX_STR; if (!GetUserName(username, (LPDWORD)&ln)) { lstrcat(errmsg, "ユーザ名取得エラー "); rcd = FALSE; } // コンピュータ名取得 ln = MAX_COMPUTERNAME_LENGTH + 1; if (!GetComputerName(hostname, (LPDWORD)&ln)) { lstrcat(errmsg, "コンピュータ名取得エラー "); rcd = FALSE; } // WinSock 初期化 if (WSAStartup(MAKEWORD(1, 1), &ws) != 0) { lstrcat(errmsg, "WinSock 初期化エラー "); rcd = FALSE; } else { // ホスト名取得 if (gethostname(s, sizeof(s)) != 0) { lstrcat(errmsg, "ホスト名取得エラー "); rcd = FALSE; } else { lstrcpy(hostname , s); } // IP アドレス取得 if ((he = gethostbyname(hostname)) == NULL) { lstrcat(errmsg, "IP アドレス取得エラー "); rcd = FALSE; } else { memcpy(&ip, he->h_addr, 4); lstrcpy(ipaddress, inet_ntoa(ip)); } // WinSock 後始末 WSACleanup(); } // 戻り値セット return rcd; } ■パソコン基礎知識 C 言語編資料
■プログラミング言語資料
■パソコン基礎知識 ハード編資料
■パソコン基礎知識 画像編資料
■パソコン基礎知識 Windows 編資料
■コンピュータシステム導入編資料