2

私は少し問題を抱えています:

OSのアーキテクチャを取得しようとしていますが、問題は私のプログラミング言語がそのような機能をサポートしていないことです。したがって、この情報を Windows dll (kernel32.dll など) から読み取る必要があります。
関数を使用して情報を取得しようとしましたGetNativeSystemInfo/GetVersionEx/GetSystemInfo
残念ながら、アーキテクチャを取得できませんでした:/

Windows dll のアーキテクチャを読み取る関数が他にいくつかありますか?
(kernel32 である必要はありません。任意の dll を使用できますが、win XP+ に存在する必要があります)

情報として:Guptaを使用しています(SQLWindows / Team devoloper)

編集1:

typedef struct _SYSTEM_INFO {
  union {
    DWORD  dwOemId;
    struct {
      WORD wProcessorArchitecture;
      WORD wReserved;
    } ;
  } ;
  DWORD     dwPageSize;
  LPVOID    lpMinimumApplicationAddress;
  LPVOID    lpMaximumApplicationAddress;
  DWORD_PTR dwActiveProcessorMask;
  DWORD     dwNumberOfProcessors;
  DWORD     dwProcessorType;
  DWORD     dwAllocationGranularity;
  WORD      wProcessorLevel;
  WORD      wProcessorRevision;
} SYSTEM_INFO;

これはMSDNからの情報です。10 個と 12 個のパラメーターを指定してこの関数を呼び出そうとしました (Gupta は構造体をサポートしていません)。
32Bit で取得:
alt テキスト http://img714.imageshack.us/img714/1954/32bit.gif

64Bit で取得:
alt テキスト http://img691.imageshack.us/img691/8978/64bit.gif

032 ビットで OemID を取得するたびに取得できますか? 64 ビット バージョンの Windows では OemID がすべて満たされていますか?

助けてくれてありがとう!!

挨拶
オーロ

4

2 に答える 2

3

GetNativeSystemInfo間違いなく使用する機能です。アプリがネイティブ 64 ビット アプリの場合、GetNativeSystemInfoは と同じGetSystemInfoです。それ以外の場合、WOW64 で実行すると、エミュレートされた 32 ビット環境で実行されている場合でも、真のシステム プロパティが返されます。

GetNativeSystemInfoシステムが 32 ビット (おそらく) か 64ビット (おそらく ) かを示すSYSTEM_INFO構造体のwProcessorArchitectureメンバを指定します。PROCESSOR_ARCHITECTURE_INTELPROCESSOR_ARCHITECTURE_AMD64

あなたの言語にこの Win API 関数のラッパーがない場合、それを使用するには、通常どおりLoadLibraryandを使用できます。もちろん、構造GetProcAddressを定義する必要があります。SYSTEM_INFO

アップデート

私は定義します

typedef struct _SYSTEM_INFO {
  WORD      wProcessorArchitecture;
  WORD      wReserved;
  DWORD     dwPageSize;
  LPVOID    lpMinimumApplicationAddress;
  LPVOID    lpMaximumApplicationAddress;
  DWORD_PTR dwActiveProcessorMask;
  DWORD     dwNumberOfProcessors;
  DWORD     dwProcessorType;
  DWORD     dwAllocationGranularity;
  WORD      wProcessorLevel;
  WORD      wProcessorRevision;
} SYSTEM_INFO;

次にwProcessorArchitecture = 0、(共通の) 32 ビット システム、およびwProcessorArchitecture = 9(共通の) 64 ビット システム。これらは、それぞれ定数PROCESSOR_ARCHITECTURE_INTELPROCESSOR_ARCHITECTURE_AMD64です。これらは、一般的な 32 ビットおよび 64 ビット アーキテクチャです。PROCESSOR_ARCHITECTURE_IA64 = 6確かにそうであるように、少し珍しいですPROCESSOR_ARCHITECTURE_UNKNOWN = 65535

アップデート

はい、私はあなたの問題を理解しています。C では、一度に1 つunionのオプションを選択することを意味します。つまり、構造は次のいずれかです。

DWORD     dwOemId;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

また

WORD      wProcessorArchitecture;
WORD      wReserved;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

1 つの DWORD は 2 ワード (2×2) と同じ数のバイト (4) で構成されているため、構造全体のデータをアドレス指定 (および命名) する方法は 2 つしかありません。私たちの場合、私たちはwProcessorArchitecture、拡張やまったく興味のない単語よりも、その単語に関心dwOemIdがあります。wProcessorArchitecturewReserved

于 2010-07-05T13:47:55.717 に答える