HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0214
panda64bit 環境での sysinfo8解決


panda

リンク

2010/2/14(Sun) 22:12:05|NO.30613

Windows 7 x64 を使ってますが sysinfo(34),sysinfo(35) の取得がうまく行かないようです。
メモリは 4GB つんでいます。

値のオーバーなのでしょうか?
もしそうでしたら、HSPでunsignedみたいなのは使えるのでしょうか。



この記事に返信する


tsuka

リンク

2010/2/14(Sun) 22:17:16|NO.30615

HSPのバージョンは何でしょう。

HSP3.2a未満であるなら、
http://hsp.tv/make/downlist.html
(hsp32upd.zip)
を試してみてください。



panda

リンク

2010/2/15(Mon) 17:39:16|NO.30630

回答ありがとうございます。
スミマセン、大事なところ書いてなかったですね。

少し調べてみました。

OS : Windows 7 (x64)
Memory : 4GB
HSPVer : HSP3.21(RC)

WinAPI で実行してみたところ同じく正しく取得できませんでした。
いつも値がマイナスになります。

メモリ使用率は正しく取得できます。(たぶん)

※サンプルは Windows 95/98/Me は動きません


#uselib "kernel32" #func GlobalMemoryStatus "GlobalMemoryStatus" sptr #func GlobalMemoryStatusEx "GlobalMemoryStatusEx" sptr dim get,8 dim getex,8 ; -- メモリ情報取得 GlobalMemoryStatus varptr(get) GlobalMemoryStatusEx varptr(getex) ; -- 物理メモリの搭載容量 mes "メモリ搭載容量" mes "sysinfo(34)\t"+sysinfo(34) mes "WinAPI\t\t"+get(2) mes "WinAPI(Ex)\t"+getex(2) ; -- メモリ使用率(%) mes "メモリ使用率" mes "sysinfo(33)\t"+sysinfo(33) mes "WinAPI\t\t"+get(1) mes "WinAPI(Ex)\t"+getex(1) if(sysinfo(34) < 0){ dialog "あなたの Windows は 64bit (メモリ4GB以上?)" }

下記URLを見る限り、メモリが4GB以上の場合は ...Ex の関数が必要だそうです。
ただ、32bit Windows の場合は メモリが 3GBちょっとしか扱えないので Ex なしでもいけるようです。

また、Ex関数を使っても値が常にゼロになってしまいます。

GlobalMemoryStatus での数値取得は SIZE_T型
GlobalMemoryStatusEx での数値取得は DWORDLONG型のようです。

DWORDLONG型は HSP に対応しているのでしょうか。

http://msdn.microsoft.com/ja-jp/library/cc430087.aspx



ANTARES

リンク

2010/2/16(Tue) 01:37:40|NO.30642

 64ビット環境がないので、32ビットWinXPのみで動作確認しています。

#if 0 dim getex,8 #else dim getex,16 getex(0)=64 #endif メモリが2GBしかないので、 以下の動作確認はGetFileSizeEx関数でやっています #if 0 mes "WinAPI(Ex)\t"+getex(2) #else size=double(getex(2)&$7FFFffff) if getex(2)&$80000000 { size+=double($7FFFffff)+1 } size+=(double($7FFFffff)+1)*2*getex(3) mes "WinAPI(Ex)\t"+size #endif



ANTARES

リンク

2010/2/16(Tue) 01:49:00|NO.30643

 64ビット整数を扱うプラグインがあったはずなので、
必要なら探してください。



ANTARES

リンク

2010/2/16(Tue) 01:58:56|NO.30644

 あ、64ビット環境だからといって、HSPの整数型が64ビットになったりはしない
という前提で書いてますが、あってますよね?



SELIA

リンク

2010/2/17(Wed) 01:35:28|NO.30668

HSP開発Wikiの方に、64ビット整数を使えるモジュールがありました。
これを使えば、GlobalMemoryStatusExで正常に取得できましたよ。

http://hspdev-wiki.net/?64bit%20%C0%B0%BF%F4%A4%F2%BA%C6%B8%BD



エイジ

リンク

2010/2/17(Wed) 22:19:31|NO.30681

なんか、ごちゃごちゃしてるので整理しときます。
>Windows 7 x64 を使ってますが sysinfo(34),sysinfo(35) の取得がうまく行かないようです
HSPは32ビットの整数しか対応してないので、その範囲を超える分はうまくいかないです。
>Ex関数を使っても値が常にゼロになってしまいます。
GlobalMemoryStatusExの使い方が間違ってます。
MEMORYSTATUSEXのサイズをセットしてないのでエラーになってます。
>DWORDLONG型は HSP に対応しているのでしょうか
DWORDLONG型は64ビットの整数なので標準では対応してません。
64ビット整数を扱うためのプラグインやモジュールを使うか、小数に変換してから扱う方法があります。


#uselib "kernel32" #func GlobalMemoryStatus "GlobalMemoryStatus" sptr #func GlobalMemoryStatusEx "GlobalMemoryStatusEx" sptr dim get,8 dim getex,16 getex=64 dupptr getex2,varptr(getex),64,3 ; -- メモリ情報取得 GlobalMemoryStatus varptr(get) GlobalMemoryStatusEx varptr(getex) ; -- 物理メモリの搭載容量 mes "メモリ搭載容量" mes "sysinfo(34)\t"+sysinfo(34) mes "WinAPI\t\t"+get(2) mes "WinAPI(Ex)\t"+strf("%I64u",getex2(1)) ; double(strf("%I64u",getex2(1)) で小数に変換できる ; -- メモリ使用率(%) mes "メモリ使用率" mes "sysinfo(33)\t"+sysinfo(33) mes "WinAPI\t\t"+get(1) mes "WinAPI(Ex)\t"+getex(1) if(sysinfo(34) < 0){ dialog "あなたの Windows は 64bit (メモリ4GB以上?)" }



panda

リンク

2010/2/18(Thu) 16:22:13|NO.30707

pandaです。

ご回答ありがとうございます。
ご指摘どおり構造体のサイズの指定を忘れておりました…。
また、64bit整数値には対応してないようですね。符号ありなしも指定できないようですし。

みなさんの提示していただいたサンプルは私の環境で動作しました。ありがとうございます。

また、なにか不明なことがあればよろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.