none
名称取得 RRS feed

  • 質問

  • コンピュータに付与された名称(コントロールパネルのシステムで開いたシステムプロパティ)を取得したいのですが一般的にはどのような関数を使用するのでしょうか?

    現在GetComputerName関数にて取得していますが本関数の説明を見るとNetBIOSにある・・・・となっており今一自信がありません。どなたかご存知でしたらご教示いただけないでしょうか。

     

    2006年12月12日 0:03

回答


  • > 他にもこうした変数(_WIN32_xxxxxx)がありますがこれらの指定値を変更した場合の影響を調べるための方法をご存知でしたらご教示いただけませんでしょうか?

    基本的には、WINVER, _WIN32_WINDOWS, _WIN32_WINNT, _WIN32_IEの
    4つを押さえておけばよいかと思います。

    _WIN32_WINNTに限りませんが、まずはMSDNで関数仕様を調べましょう。
    GetComputerNameEx APIをMSDNで調べると、以下のように書いてあります。

    ---
    対応情報
    Windows NT/2000:Windows 2000
    Windows 95/98:対応していません
    Windows CE:対応していません
    ヘッダー:winbase.h 内で宣言
    インポートライブラリ:kernel32.lib を使用
    Unicode: Windows NT/2000 は Unicode 版と ANSI 版を実装
    ---

    Windows NT系の対応は、Windows 2000ということが分りますよね。
    よって、このAPIを使いたい場合には、_WIN32_WINNTを0x0500
    (Windows 2000)以上の値にする必要があることが分かります。

    あとは、ヘッダファイルを調べてみても分かるかと思います。
    以下が、実際のGetComputerNameEx API の定義部分です。

    ---
    // WinBase.h

    #if (_WIN32_WINNT >= 0x0500)

    // 省略。。

    WINBASEAPI
    __success(return != 0)
    BOOL
    WINAPI
    GetComputerNameExA (
        __in    COMPUTER_NAME_FORMAT NameType,
        __out_ecount_part_opt(*nSize, *nSize + 1) LPSTR lpBuffer,
        __inout LPDWORD nSize
        );
    WINBASEAPI
    __success(return != 0)
    BOOL
    WINAPI
    GetComputerNameExW (
        __in    COMPUTER_NAME_FORMAT NameType,
        __out_ecount_part_opt(*nSize, *nSize + 1) LPWSTR lpBuffer,
        __inout LPDWORD nSize
        );
    #ifdef UNICODE
    #define GetComputerNameEx  GetComputerNameExW
    #else
    #define GetComputerNameEx  GetComputerNameExA
    #endif // !UNICODE

    // 省略。。

    #endif // _WIN32_WINNT
    ---

    #回答になってるかな?

    2006年12月15日 4:38
  • とっちゃんです。

     qakappa さんからの引用
    他にもこうした変数(_WIN32_xxxxxx)がありますがこれらの指定値を変更した場合の影響を調べるための方法をご存知でしたらご教示いただけませんでしょうか?

    影響がなにへの影響を指しているかによって変わりますけど、定義した場合とそうではない場合での出来上がりでいえば、特になにがあるというわけではありません。コンパイル時に見える情報に差がある(結果的に、使えないものまで見えてしまい、それを使ってしまったために、誤動作するという可能性はありますが)というくらいでしょうか。

    GetComputerNameEx に関して言えば、NT4までおよび、9x系OS上では関数そのものが存在していないため、それを利用するEXEなりを実行しようと思っても直接呼び出している限り実行することはできません。

    こういった場合は、GetProcAddress API を利用して、実行時に関数アドレスを取得してそれを呼び出すという方法をとります。

    そうではない(2000/XP あるいは、Vista/2003 でしか実行しないし、できなくてよい)のであれば、特に意識する必要はありません。というより、あるものが正しく見えるように、適切に定義してあげる必要があるといえるかと。

    2006年12月15日 10:06

すべての返信

  • qakappa さん、こんにちは。

     qakappa さんからの引用
    コンピュータに付与された名称(コントロールパネルのシステムで開いたシステムプロパティ)を取得したいのですが一般的にはどのような関数を使用するのでしょうか?

    現在GetComputerName関数にて取得していますが本関数の説明を見るとNetBIOSにある・・・・となっており今一自信がありません。どなたかご存知でしたらご教示いただけないでしょうか。

    [コンピュータ名] タブの 「フル コンピュータ名」 でしょうか?

    であれば、GetComputerNameEx 関数などで良いです。
    C++/CLI なら、System.Environment.MachineName プロパティでも良いですね。

    2006年12月12日 7:26
  •  じゃんぬねっと さん回答ありがとうございます。

    GetComputerNameEX関数を使用したら以下のコンパイルエラーが出て対処できません。

        ”errorC3861 引数依存の照合を使用しても見つかりません。”

    恐縮ですが以下のコーディングですが、ご指摘いただけませんか

      char Buff[1024];

      DWORD Bufflen = sizeof(Buff);

      GetComputerNameEX(ComputerNameDnsHostname, Buff, &Bufflen)

     

    2006年12月13日 2:37
  • 確認ですが、C++/CLI ではないのですよね?
    (特に、C++ のご質問の場合は、どのタイプの C++ なのかを書いた方が良いです)

    C++/CLI であれば、System.Environment.MachineName プロパティの方を使った方が良いです。

    2006年12月13日 4:31
  • とりあえず、どのバージョンのVCでコンパイルしているのでしょうか?

    > GetComputerNameEX
    単なるスペルミス?
    C言語は大文字小文字を区別しますから、転記するときはコードに書いたものそのものを載せましょう。
    2006年12月13日 4:36
  • 補足ですが、GetComputernameExはWindows2000からのサポートなので、
    _WIN32_WINNTを0x0500以上の値にする必要があるハズです。
    2006年12月13日 13:39
  • 杜本ワックさんありがとうございます。

    _WIN32_WINNTの変数を変更する事によりどこに影響するかわからないので今まで変更して使用することはしませんでした。

    たしかにこうするとコンパイルエラーも出ず、実行もただしく動作しました。

    他にもこうした変数(_WIN32_xxxxxx)がありますがこれらの指定値を変更した場合の影響を調べるための方法をご存知でしたらご教示いただけませんでしょうか?

     

    2006年12月15日 1:45

  • > 他にもこうした変数(_WIN32_xxxxxx)がありますがこれらの指定値を変更した場合の影響を調べるための方法をご存知でしたらご教示いただけませんでしょうか?

    基本的には、WINVER, _WIN32_WINDOWS, _WIN32_WINNT, _WIN32_IEの
    4つを押さえておけばよいかと思います。

    _WIN32_WINNTに限りませんが、まずはMSDNで関数仕様を調べましょう。
    GetComputerNameEx APIをMSDNで調べると、以下のように書いてあります。

    ---
    対応情報
    Windows NT/2000:Windows 2000
    Windows 95/98:対応していません
    Windows CE:対応していません
    ヘッダー:winbase.h 内で宣言
    インポートライブラリ:kernel32.lib を使用
    Unicode: Windows NT/2000 は Unicode 版と ANSI 版を実装
    ---

    Windows NT系の対応は、Windows 2000ということが分りますよね。
    よって、このAPIを使いたい場合には、_WIN32_WINNTを0x0500
    (Windows 2000)以上の値にする必要があることが分かります。

    あとは、ヘッダファイルを調べてみても分かるかと思います。
    以下が、実際のGetComputerNameEx API の定義部分です。

    ---
    // WinBase.h

    #if (_WIN32_WINNT >= 0x0500)

    // 省略。。

    WINBASEAPI
    __success(return != 0)
    BOOL
    WINAPI
    GetComputerNameExA (
        __in    COMPUTER_NAME_FORMAT NameType,
        __out_ecount_part_opt(*nSize, *nSize + 1) LPSTR lpBuffer,
        __inout LPDWORD nSize
        );
    WINBASEAPI
    __success(return != 0)
    BOOL
    WINAPI
    GetComputerNameExW (
        __in    COMPUTER_NAME_FORMAT NameType,
        __out_ecount_part_opt(*nSize, *nSize + 1) LPWSTR lpBuffer,
        __inout LPDWORD nSize
        );
    #ifdef UNICODE
    #define GetComputerNameEx  GetComputerNameExW
    #else
    #define GetComputerNameEx  GetComputerNameExA
    #endif // !UNICODE

    // 省略。。

    #endif // _WIN32_WINNT
    ---

    #回答になってるかな?

    2006年12月15日 4:38
  • とっちゃんです。

     qakappa さんからの引用
    他にもこうした変数(_WIN32_xxxxxx)がありますがこれらの指定値を変更した場合の影響を調べるための方法をご存知でしたらご教示いただけませんでしょうか?

    影響がなにへの影響を指しているかによって変わりますけど、定義した場合とそうではない場合での出来上がりでいえば、特になにがあるというわけではありません。コンパイル時に見える情報に差がある(結果的に、使えないものまで見えてしまい、それを使ってしまったために、誤動作するという可能性はありますが)というくらいでしょうか。

    GetComputerNameEx に関して言えば、NT4までおよび、9x系OS上では関数そのものが存在していないため、それを利用するEXEなりを実行しようと思っても直接呼び出している限り実行することはできません。

    こういった場合は、GetProcAddress API を利用して、実行時に関数アドレスを取得してそれを呼び出すという方法をとります。

    そうではない(2000/XP あるいは、Vista/2003 でしか実行しないし、できなくてよい)のであれば、特に意識する必要はありません。というより、あるものが正しく見えるように、適切に定義してあげる必要があるといえるかと。

    2006年12月15日 10:06
  • 杜本ワックさんご教示ありがとうございました。大変参考になりました。

     

    2006年12月20日 0:33
  • とっちゃん さんありがとうございました。大変参考になりました。

     

    2006年12月20日 0:34