はじめまして。
GetComputerNameについて教えてください。
今GetComputerNameを使って、マシン名を取得しているのですが、
Win98SEだと、うまく取得できないようです。
このAPIはOSに依存するのでしょうか?
いろいろサイトを見て調べてみたのですが、「OSに依存する」等の
記述は見当たりませんでした。
ご存知の方がおりましたら、教えてください。
> このAPIはOSに依存するのでしょうか?
私も調べてみましたが、それらしい記述は無かったです。
問題解決のために、GetComputerNameを使用している部分のソースコードを
提示された方がよいのではないでしょうか?
ふぐちゃんさんからのアドバイスにより、ソースを載せてみました。
このプログラムをWin98SEで実行すると、エラーメッセージが表示されます。
何か、間違っている点はあるでしょうか?
==================================================================
if Not GetComputerName(pcComputer, dwComputerSize) then begin
sErrMsg := 'ユーザ情報の保存に必要な情報の取得に失敗しました。';
Application.MessageBox(PChar(sErrMsg), 'ユーザ情報書込エラー', + MB_OK+MB_ICONERROR);
Result := false;
exit;
end;
==================================================================
pcComputerとdwComputerSizeの設定はちゃんとされていますか?
pcComputerは MAX_COMPUTERNAME_LENGTH + 1 バイトの領域が必要です。
dwComputerSizeは MAX_COMPUTERNAME_LENGTH + 1 です。
MAX_COMPUTERNAME_LENGTHは Windows.pas で定義されています。
pcComputerは、「GetMem(pcComputer, 255);」をしていますが、
これでは不十分でしょうか?
また、dwComputerSizeは特に設定していませんが、
これだとやはりまずいですか?
今まで、これらの設定をしていなくても普通に動作していたのは、
偶然なのでしょうか?
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;
> 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;
スタテツさん、ふぐちゃんさん、
アドバイス、ありがとうございました。
アドバイス通りにやると、正常に動作するのが確認できました。
私、まだまだ勉強不足ですね。
これでまた1つ、知識が身につきました。
本当にありがとうございます。
感謝してます。
ツイート | ![]() |