« 【よみもの】もーりおのつぶやき 第36回 | メイン | HSPTV!メルマガ 第68号 »

2008年11月18日

【講座】「教えて!おにたま!!」

私のPCは物理メモリを3GB積んでいて,その全体物理メモリを
調べるため

mes "全体物理メモリ:"+sysinfo(34)

を実行したのですが,

全体物理メモリ:2147483647

と,表示されました.
本来なら,HSPの整数は符号付32bitだから$80000000でオーバー
フローして,$C0000000 = -1073741824が表示されるはずなのに,
$7fffffffff = 2147483647でカウントストップしているよう
です.
2GB以上の物理メモリサイズを正しく取得するにはどのように
すれば良いのか教えてください.
もしかして,WinAPIの仕様なのでしょうか?


<こたえ>

結論から言うと、sysinfo(34)で得られる物理メモリのサイズは
WinAPIの仕様により2GBまでとなっています。(2GB以上のメモリが
搭載されている場合は、すべて2GBとなります)
これは、HSP3内部で使用しているGlobalMemoryStatusという
APIの制限によるものです。
ただし、WinAPIで用意されているGlobalMemoryStatusExという
関数により、2GBを超えるメモリ情報を取得することができます。
以下がサンプルスクリプトになります。

; 2GB以上のメモリを取得する(NTカーネル専用)
#uselib "KERNEL32.DLL"
#func GlobalMemoryStatusEx "GlobalMemoryStatusEx" var
dim buf,16
buf(0)=64
GlobalMemoryStatusEx buf
mes strf("メモリ容量(下位)=%x",buf(2))
mes strf("メモリ容量(上位)=%x",buf(3))

この方法により、2GBを超える環境での物理メモリ容量や、使用
している量などを正確に知ることができます。
なぜHSP3でこの方法を使用していないのかと言うと、
このAPIは、Windows95や98系のカーネルでは使用できないため
互換性を重視した形になったと考えてください。
メモリの搭載量は、今後どんどん増える傾向にあるので、
将来的には改善していくべきですね。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 2008年11月18日 01:22

口臭チェッカー市場