« 【よみもの】もーりおのつぶやき 第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
口臭チェッカー市場