GetComputerNameについて

解決


リリ  2004-05-28 04:05:21  No: 9179

はじめまして。

GetComputerNameについて教えてください。

今GetComputerNameを使って、マシン名を取得しているのですが、
Win98SEだと、うまく取得できないようです。
このAPIはOSに依存するのでしょうか?
いろいろサイトを見て調べてみたのですが、「OSに依存する」等の
記述は見当たりませんでした。

ご存知の方がおりましたら、教えてください。


ふぐちゃん  2004-05-28 04:27:20  No: 9180

> このAPIはOSに依存するのでしょうか?
私も調べてみましたが、それらしい記述は無かったです。

問題解決のために、GetComputerNameを使用している部分のソースコードを
提示された方がよいのではないでしょうか?


リリ  2004-05-28 04:33:08  No: 9181

ふぐちゃんさんからのアドバイスにより、ソースを載せてみました。
このプログラムをWin98SEで実行すると、エラーメッセージが表示されます。

何か、間違っている点はあるでしょうか?

==================================================================
  if Not GetComputerName(pcComputer, dwComputerSize) then begin
    sErrMsg := 'ユーザ情報の保存に必要な情報の取得に失敗しました。';
    Application.MessageBox(PChar(sErrMsg), 'ユーザ情報書込エラー', +                                  MB_OK+MB_ICONERROR);
    Result := false;
    exit;
  end;
==================================================================


ふぐちゃん  2004-05-28 05:07:54  No: 9182

pcComputerとdwComputerSizeの設定はちゃんとされていますか?
pcComputerは MAX_COMPUTERNAME_LENGTH + 1 バイトの領域が必要です。
dwComputerSizeは MAX_COMPUTERNAME_LENGTH + 1 です。
MAX_COMPUTERNAME_LENGTHは Windows.pas で定義されています。


リリ  2004-05-28 05:14:30  No: 9183

pcComputerは、「GetMem(pcComputer, 255);」をしていますが、
これでは不十分でしょうか?

また、dwComputerSizeは特に設定していませんが、
これだとやはりまずいですか?

今まで、これらの設定をしていなくても普通に動作していたのは、
偶然なのでしょうか?


スタテツ  2004-05-28 06:19:58  No: 9184

DelphiML過去ログからです。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=077450

procedure TForm1.Button1Click(Sender: TObject);
var
  bufSize:Cardinal;
  buf:array[0..MAX_COMPUTERNAME_LENGTH+1]of Char;
begin
  //winbase.h 定義済
  bufSize:=SizeOf(buf);
  Win32Check(GetComputerName(@buf[0] ,bufSize));
  ShowMessage('ComputerName='+StrPas(buf));
end;


ふぐちゃん  2004-05-28 07:38:52  No: 9185

> pcComputerは、「GetMem(pcComputer, 255);」をしていますが、
> これでは不十分でしょうか?
コンピュータ名の最大長は15バイトですので、Char型の配列を使って
16バイトを確保しておく方がよさそうです。(1つ多いのはヌルの分です)

> また、dwComputerSizeは特に設定していませんが、
> これだとやはりまずいですか?
ちょっとまずいかも。(笑)

> 今まで、これらの設定をしていなくても普通に動作していたのは、
> 偶然なのでしょうか?
XP上でバッファの長さを指定しないで実行してみると正常に動作しました。
APIの内部仕様が変更されたのかもわかりません。
ですが、98の場合はOSが第2引数の値を参照していると思います。
どちらにしてもバッファの長さは指定しておくべきでしょうね。

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer: array[0..MAX_COMPUTERNAME_LENGTH] of Char;
  nSize: DWORD;
begin
  nSize := SizeOf(Buffer);
  GetComputerName(Buffer, nSize);
  ShowMessage('現在のコンピュータ名は ' + Buffer + ' です。');
end;


リリ  2004-05-28 22:59:22  No: 9186

スタテツさん、ふぐちゃんさん、
アドバイス、ありがとうございました。

アドバイス通りにやると、正常に動作するのが確認できました。
私、まだまだ勉強不足ですね。
これでまた1つ、知識が身につきました。
本当にありがとうございます。
感謝してます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加