SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
■コンピュータシステム導入編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK