VC6+MFCで開発しています。
Vistaでコンピュータ名を取得しているのですが
うまくいきません。
15バイト目で切り捨てられてしまいます。
うまく取得できないコンピュータ名は
「コンピュータ管理者アドミン」
というような日本語を含んでおり、
「コンピュータ管」で切り捨てられています。
正確に取得するにはどのようにすればいいのでしょうか?
分かる方いましたら、ご教授よろしくお願いします。
※以下ソースコード
//char name[MAX_COMPUTERNAME_LENGTH + 1];
char name[1000];
DWORD size = sizeof(name);
memset(name, '\0', size);
::GetComputerName(name, &size);
まず前提として、GetComputerNameで取得できるのは「NetBIOS名」なのね。
んで、NetBIOS名は15バイトで切り捨てられる。この辺は実際に自分のPCで
16バイト以上のコンピュータ名を設定してみると、その時点でNetBIOS名は
15文字で切り捨てられてるのがわかる(XPでは確認済み、Vistaは未確認)。
※マイコンピュータのプロパティ→コンピュータ名→変更→詳細
じゃあ16文字以上のコンピュータ名はどーすんだ?ということでMSDN見てみると
http://msdn.microsoft.com/ja-jp/library/cc429732.aspx
GetComputerNameExならDNSホスト名を取得できるとあるので試してみる。
//test.cpp
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
{ //GetComputerNameA()・・・NG
char name[1000 + 1] = ""; //確認のため大きめにする
DWORD length = (sizeof name) / (sizeof name[0]);
::GetComputerNameA(name, &length);
::OutputDebugStringA(name);
::OutputDebugStringA("\r\n");
}
{ //GetComputerNameExA()・・・NG
char name[1000 + 1] = ""; //確認のため大きめにする
DWORD length = (sizeof name) / (sizeof name[0]);
::GetComputerNameExA(ComputerNameDnsHostname, name, &length);
::OutputDebugStringA(name);
::OutputDebugStringA("\r\n");
}
{ //GetComputerNameExW()・・・OK
wchar_t name[1000 + 1] = L""; //確認のため大きめにする
DWORD length = (sizeof name) / (sizeof name[0]);
::GetComputerNameExW(ComputerNameDnsHostname, name, &length);
::OutputDebugStringW(name);
::OutputDebugStringW(L"\r\n");
}
{ //GetComputerNameW()・・・NG
wchar_t name[1000 + 1] = L""; //確認のため大きめにする
DWORD length = (sizeof name) / (sizeof name[0]);
::GetComputerNameW(name, &length);
::OutputDebugStringW(name);
::OutputDebugStringW(L"\r\n");
}
return 0;
}
---結果---
コンピュータ管
コンピュータ管
コンピュータ管理者アドミン
コンピュータ管
まず、GetComputerNameを確認(1つ目)。
次にGetComputerNameExを確認。ANSI版(2つ目)だとなぜか半分で切れる。
なんでだろ。Unicode版だときちんと取れる(3つ目)。
ん?ならGetComputerNameもUnicode版なら取れたり・・・しないね(4つ目)。
ってことで、16文字以上のコンピュータ名が欲しいならGetComputerNameExWで
DNSホスト名を取得するのが正解ぽい。
WMIを使ってWin32_ComputerSystemあたりから情報を取る手もあるかと。
とおりすgさんの案のようにスマートなソースにはなりにくいですが・・・
WMIを勉強するいい機会かも(笑)?
↑普通使わないですね(私は頻繁に使ってますが・・・)
参考URL: http://msdn.microsoft.com/en-us/library/aa390423(VS.85).aspx
私なら、日本語や長いコンピュータ名はつけないような運用にする方を優先し
ますけどね☆
> WMIを使ってWin32_ComputerSystemあたりから情報を取る手もあるかと。
ああ、なるほど。今ならそっちが真っ当なアプローチか。
システム情報としての「コンピュータ名」が欲しいならどら氏のやり方が
いいね。フォローありがとう。
COMで、しかもリファレンスが英語だから経験無い人だと涙目だけど。
> 私なら、日本語や長いコンピュータ名はつけないような運用にする方を優先し
> ますけどね☆
同感。でも何も知らない人はけっこう平気で日本語のクソ長い名前付け
るんだよね。ウチの客もフツーに付けてたし。
NetBIOS/DNS的に問題ないのかな???
・・・タブインデント消えててソース見づらいね。ごめん。orz
茶化すつもりはないけど、
>運用で何とかしろ
と言うのはどらさんの質問を見るたびにほぼ毎回思ってますよ・・・
ななしさん
私のスレの批判は、私のスレに書き込んでください。
ツイート | ![]() |