03.ファイルオープンダイアログ(16)で複数拡張子に対応させる
08.保存ダイアログのファイル名の拡張子が消されていても強制的につける
11.ファイル属性取得モジュール (要llmod.as)
12.ファイル属性設定モジュール (要llmod.as)
13.INIファイルから情報取得するモジュール (要llmod.as)
14.INIファイルに情報設定するモジュール (要llmod.as)
15.ファイル移動(ファイル名置換)モジュール (要llmod.as)
17.ドライブ情報取得 (要llmod.as)
18.ドライブ一覧取得 (要llmod.as)
01.フォルダの有無チェック
ファイルでしたらexist命令にて調べることができますがフォルダはexistで調べることはできません。
dirlist命令を使用すればシステム変数statに結果が返ってきます。
0なら存在しない、1なら存在する、です。
(例)フォルダチェック
folder="d:\\HSP\\common"
dirlist buf,folder,5
if stat==0 : dialog"存在しません"
stop
02.フォルダ内の総ファイルサイズ
フォルダ内のサイズは命令を組み合わせることによって比較的簡単に調べることができます。
ただ、それはフォルダ直属のファイルサイズの話です。フォルダ内にフォルダがある場合は少々面倒です。
ここではフォルダ直属のファイルサイズ合計の取得をします。
フォルダの総サイズ取得は下記のサンプルを各自変更してご利用ください。
(例)ファイル合計サイズ取得
sdim folder,16000
sdim file,32000
width 400,245
title "ディレクトリサイズチェッカー"
objsize 200,25
pos 0,0 : button "ディレクトリ移動",chg
pos 200,0 : button "サイズ取得",size
objsize 400,25
dirlist folder,"*.*",5
pos 0,25 : listbox list,200,folder
stop
*chg
if list<0 : list=1
notesel folder
noteget chgdir,list
chdir chgdir
dirlist folder,"*.*",5
objprm 2,folder
stop
*size
notesel folder
noteget chgdir,list
tmpdir=curdir ; dirlist対象を変更するため後で戻せるように覚えておく
chdir chgdir
dirlist file,"*.*",1
notesel file
notemax max
allsize=0
repeat max
noteget tmp,cnt
exist tmp
allsize+=strsize
loop
dialog""+allsize+"バイト"
chdir tmpdir
stop
03.ファイルオープンダイアログ(16)で複数拡張子に対応させる
リファレンスでは複数の拡張子に対応させる方法が記述されていません。
「;」(セミコロン)を挟むことでいけるようです。
また初めに書く拡張子はそのままで、2つ目以降は「*.」+拡張子で指定します。
この方法はセーブダイアログでも使えます。
(例)bmp,jpg,mag形式を選択可能にする
dialog"bmp;*.jpg;*.mag",16
if stat==0 : end ;キャンセルした場合終了する
picload refstr
stop
04.特殊なフォルダを開く
以前はコントロールパネル一つだけ載せていたのですが、他のもCLSIDパスで開けてみましょう。
Takaさん(98SE)の情報によると、下のやり方では開けなかったようです。
「exec "explorer.exe ::{XXX}"」のようにすると動く、との情報を頂きました。ありがとうございます。
(例)起動
exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}",16 ; コントロールパネル
exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{BDEADF00-C265-11d0-BCED-00A0C90AB50F}",16 ; Webフォルダ
exec "::{645FF040-5081-101B-9F08-00AA002F954E}",16 ; ゴミ箱
exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",16 ; マイコンピュータ
exec "::{208D2C60-3AEA-1069-A2D7-08002B30309D}",16 ; ネットワークコンピュータ
exec "::{450D8FBA-AD25-11D0-98A8-0800361B1103}",16 ; マイドキュメント
stop
05.フォルダの削除
標準命令にフォルダを削除する命令がありません。
DOSコマンドを使うことで消すことが出来ますので、DOSプロンプトを立ち上げ消しましょう。
気をつけることが一点。DOSコマンドの「rmdir」は空のフォルダのみ削除が出来るものです。
もし空でないものを消したい場合はdeleteで消してから実行してください。
(例)フォルダ削除
dir="tempdir"
repeat -1,1
dirlist tmp,dir,5
if stat=0 : break
dir="tempdir"+cnt
loop
mkdir dir
dialog ""+curdir+"に"+dir+"フォルダを作成しました"
dialog ""+curdir+"\\"+dir+"フォルダを削除します\n実行してよろしいですか?",3
if stat=6 : exec "cmd.exe /c rmdir "+curdir+"\\"+dir
06.フルパスからファイル名を取り出す
dirlistの"ファイルマスク"の部分にフルパスを指定してやるとファイル名を取り出せるようです。
(例)オープンダイアログで開いたファイル名を取り出す
sdim pass,256 ; フルパス用のサイズ確保
sdim file,128 ; ファイル名用のサイズ確保
dialog "",16
v stat!=1 : end ; キャンセル又はエラーが出ると終了
pass=refstr
dirlist file,pass
mes "フルパス : "+pass
mes "ファイル名 : "+file
stop
07.ファイル名から拡張子を抜き出すモジュール
取り出し方は非常に簡単なのですが要望が多かったので載せておきます。
取り出し方はいろいろあります。後ろから○文字抜き出すとか「.」(ピリオド)まで抜き出すとか…
後ろから○文字というやり方では「*.as」のようなものから「*.jpeg」のような数の異なるものには対応できません。
ということで最後の文字から「.」(ピリオド)まで抜き出す方法を書きます。
ピリオドまではpeek命令で抜き出しています。ピリオドはASCIIコードで46です。
(例)拡張し抜き出し
;************************** 概要説明 ************************
;
; extension p1
;
; p1 : 文字列型変数
;
; 取り出された拡張子はrefstrに返ります
; 取得した場合はstatに1が入ります
;
;***********************************************************
#module "CardinalNumberChange"
#deffunc extension val
mref buf,24
mref stt,64
mref result,65
strlen len,buf
repeat len,1
peek tmp,buf,len-cnt
period=len-cnt
if tmp=46 : break
loop
if period : strmid result,buf,period+1,10 : else : stt=1
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim buf,256
buf="c:\\program files\\HSP\\hsed2.exe"
extension buf
if stat : dialog "拡張子が存在しません" : stop
mes "「"+buf+"」の拡張子は「"+refstr+"」です"
stop
08.保存ダイアログのファイル名の拡張子が消されていても強制的につける
21の拡張子抜き出しの応用(?)ですがほとんど同じですので書かなくても良かったのですが…。
一応掲示板で質問がありましたので載せておくことにします。
(例)必ず拡張子つきのファイル名にする
sdim file,256
buf="sample document"
dialog "txt",17
if stat=0 : dialog "保存に失敗またはキャンセルされて保存されませんでした"
file=refstr
strlen len,file
ichi=len-1
repeat len
peek tmp,file,ichi
if tmp='.' : break
ichi-
loop
strmid chk,file,ichi,len-ichi ; ファイル名「〜.xxx」内のピリオド以降「.xxx」を抜き出す
if chk!=".txt" : file+=".txt" ; 取り出した拡張子が指定のものでない場合はファイル名に拡張子付加
strlen len,buf
bsave file,buf,len
dialog "保存に成功しました"
09.標準命令でファイル名を変更するモジュール
hspext.dllにファイル名を変更する命令fxrenがありますが、
ファイル名変更だけするのにDLLの使用は使いたくないと言う人用です。
使い方等もfxren命令同様で正常終了するとstatに0,失敗で1が入ります。
(例)ファイル名置換
;************************** 概要説明 ************************
;
; fnren p1,"name"
;
; p1=変数 : オリジナルのファイル名が格納された文字列型変数名
; "new name" : 新規ファイル名
;
;***********************************************************
#module "change"
#deffunc fnren val,str
mref p1,24
mref p2,33
mref stt,64
skiperr 1
peek chk,p1,1
if chk!=':' : p1=curdir+"\\"+p1
peek chk,p2,1
if chk!=':' : p2=curdir+"\\"+p2
bcopy p1,p2
if err : stt=1 : return
skiperr 0
delete p1
stt=0
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim file,128
file="d:\\hsp\\hsptmp"
fnren file,"success.txt"
if stat : dialog"変更失敗" : else : dialog"変更完了"
10.変数の内容を外部に保存・呼び出す
ゲームのハイスコアを保存する、ツールの設定を保存する…これらのデータはHSPの終了とともに消えてしまいます。
次回起動した時にこれらのデータを使いたいのであればハードディスク等にファイルとして出力して次回読み込ませます。
保存する形と読み込む形が同じであればどんな風に保存してもかまいません。
データをカンマで区切る、1行が1データとする、数値データは0で桁を揃える、と言ったことも出来ます。
またデータが配列変数である場合、配列の状態を維持したまま保存できます。
(例)1行を1つのデータとして保存・読込
sdim buf,20,5
sdim savefile,128
exist "sample_save.dat" ; 外部に保存してあるか確認
if strsize>=0 {
bload "sample_save.dat",savefile ; 存在すれば読み込む
notesel savefile
repeat 5
noteget buf.cnt,cnt ; 1行ずつ読み込んでbufの0から順に入れていく
loop
}
repeat 5
input buf.cnt,200,25,20 ; inputを5個配置
loop
button "save",*save
stop
*save
exist "sample_save.dat" ; 上書き確認用
if strsize>=0 {
dialog"既にsample_save.datが存在します\n上書きしてよろしいですか?",3
if stat==7 : stop ; いいえを押したときストップ
}
savefile="" ; 必ず空にしておく
repeat 5
savefile+=""+buf.cnt+"\n"
loop
strlen size,savefile ; 変数のサイズを測る
bsave "sample_save.dat",savefile,size
dialog "保存完了"
stop
11.ファイル属性取得モジュール (要llmod.as)
hspext.dllにあるfxaget命令を真似たモジュールです。
指定の形・返ってくるものも同じにしてみました。
属性 内容
--------------------------
$1 : 書き込み禁止
$2 : 隠しファイル
$4 : システム
$10 : ディレクトリ
$20 : アーカイブ
$80 : 標準タイプ
(例)ファイル属性を取得
#include "llmod.as"
;************************** 概要説明 ************************
;
; getattribute v1,"file"
;
; v1=変数名 : 情報が格納される数値型変数名
; "file" : 情報を代入する変数
;
; 同時に複数の属性が設定されている場合は、それぞれの値を足した値になります。
; 命令の実行に失敗すると、システム変数statに1が代入されます。
; 正常に終了した場合は、システム変数statは0になります。
;
;***********************************************************
#module "fileinfo"
#deffunc getattribute val,str
mref type,16
mref dummy,33
mref stt,64
lpfilename=dummy
getptr prm,lpfilename
dllproc "GetFileAttributesA",prm,1,D_KERNEL@
if dllret@=-1 : stt=1 : else : stt=0
type=dllret@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim typename,20,6
dim type,6
dim info,6
typename="読み取り専用","隠しファイル","システムファイル","ディレクトリ","アーカイブ","無属性"
type=$1,$2,$4,$10,$20,$80
dialog"",16,"属性を取得するファイル"
if stat=0 : end
file=refstr
getattribute info,file
repeat 6
if type.cnt&info : mes typename.cnt
loop
stop
12.ファイル属性設定モジュール (要llmod.as)
hspext.dllにあるfxaset命令を真似たモジュールです。
複数指定したい時は指定したい属性の値をすべて足してください。
属性 内容
--------------------------
$1 : 書き込み禁止
$2 : 隠しファイル
$4 : システム
$10 : ディレクトリ
$20 : アーカイブ
$80 : 標準タイプ
(例)ファイル属性を設定
#include "llmod.as"
;************************** 概要説明 ************************
;
; setattribute "file",n1
;
; "file" : 情報を代入する変数
; n1=0〜(0) : 設定する属性
;
; 命令の実行に失敗すると、システム変数statに1が代入されます。
; 正常に終了した場合は、システム変数statは0になります。
;
;***********************************************************
#module "fileinfo"
#deffunc setattribute str,int
mref dummy,32
mref type,1
mref stt,64
lpfilename=dummy
getptr prm,lpfilename
dllproc "SetFileAttributesA",prm,1,D_KERNEL@
if dllret@=0 : stt=1 : else : stt=0
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim file,256
dim type,6
dim typenum,6
dim info,1
typenum=$1,$2,$4,$10,$20,$80
objsize 150,25
pos 50,50 : mes "指定ファイルパス"
pos 200,50 : input file,300
pos 200,100 : chkbox "読み取り専用",type
pos 200,150 : chkbox "隠しファイル",type.1
pos 200,200 : chkbox "システムファイル",type.2
pos 200,250 : chkbox "ディレクトリ",type.3
pos 200,300 : chkbox "アーカイブ",type.4
pos 200,350 : chkbox "無属性",type.5
pos 200,400 : button "設定",set
stop
*set
info=0
repeat 6
if type.cnt : info+=typenum.cnt
loop
setattribute file,info
if stat : dialog"設定失敗" : else : dialog"設定成功"
stop
13.INIファイルから情報取得するモジュール (要llmod.as)
「*.ini」ファイルの指定セクションのキーを取得するモジュールです。
返って来る型は文字列型ですが数値データでも取得できます。
当然文字列型の数値となっているわけですので数値として使用する場合int命令で数値化してください。
取得するためにはiniファイル名,セクション名([]で括られた文字列),キー名の3点指定しなければなりません。
これらはp2に指定する要素数3以上の配列変数に「ini,セクション,キー」の順番で指定してください。
取得成功するとstatに取得文字(バイト)数が入ります。
(例)ini取得
#include "llmod.as"
#define section "MCI Extensions.BAK"
#define key "mpeg"
#define ini "win.ini"
;************************** 概要説明 ************************
;
; inigetstr v1,v2
;
; v1=文字列型変数 : 取得した文字列
; v2=文字列型配列変数 : 取得するもの(要素0=INIファイル名,要素1=セクション名,要素2=キー名)
; 戻り値 : statに文字列の長さ
;
;***********************************************************
#module "ini"
#deffunc inigetstr val,val
mref lpretstr,24
mref key,57
mref stt,64
dim prm,6
getptr prm.0,key.1
getptr prm.1,key.2
prm.2=0
getptr prm.3,lpretstr
prm.4=255
getptr prm.5,key.0
dllproc "GetPrivateProfileStringA",prm,6,D_KERNEL@
if dllret@=-2 : stt=0 : else : stt=dllret@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim result,256
sdim info,128,3
info=ini,section,key
inigetstr result,info
mes ""+ini+"\n["+section+"] "+key+"="+result
stop
14.INIファイルに情報設定するモジュール (要llmod.as)
「*.ini」ファイルの指定セクションのキーに設定するモジュールです。
31で書き忘れていましたがINIファイルパスが絶対パスでない場合Windowsフォルダになります。
指定ファイル・セクションやキーがない場合は自動で作成されます。
(例)ini設定
#include "llmod.as"
#define section "SectionName1"
#define key "sample"
#define ini "writetest.ini"
;************************** 概要説明 ************************
;
; inisetstr v1,v2
;
; v1=文字列型変数 : 設定する文字列
; v2=文字列型配列変数 : 設定箇所(要素0=INIファイル名,要素1=セクション名,要素2=キー名)
; stat=戻り値 : 0=正常終了,1=失敗
;
;***********************************************************
#module "ini"
#deffunc inisetstr val,val
mref lpretstr,24
mref key,57
mref stt,64
dim prm,4
getptr prm.0,key.1
getptr prm.1,key.2
getptr prm.2,lpretstr
getptr prm.3,key.0
dllproc "WritePrivateProfileStringA",prm,4,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim param,16
sdim info,128,3
param="書き込みテスト"
info=ini,section,key
inisetstr param,info
if stat : dialog"書き込み失敗" : else : dialog"書き込み成功"
15.ファイル移動(ファイル名置換)モジュール (要llmod.as)
既存のファイルを移動・名前置換をするモジュールです。
元々はファイル移動用に作ったのですがファイル移動で移動元のファイルをフルパスで指定し、
移動先もフルパスで指定なので、同じフォルダに違う名前ですれば置換と同じだなと思って書いただけです。
移動に成功するとシステム変数statに0が、失敗すると1が入ります。
hspext.dllにあるファイルを移動できるfxcopy命令は同一ドライブ間でなければならないようですが、
このモジュールでは別のドライブであっても移動できます。
(例)ファイル移動
#include "llmod.as"
;************************** 概要説明 ************************
;
; fmove v1,v2
;
; v1=文字列型変数 : コピー元のファイル名(フルパス)
; v2=文字列型変数 : コピー先のファイル名(フルパス)
; stat=戻り値 : 0=正常終了,1=失敗
;
;***********************************************************
#module "file"
#deffunc fmove val,val
mref file,24
mref path,25
mref stt,64
mplace=path
getptr prm.0, file
getptr prm.1, mplace
dllproc "MoveFileA",prm,2,D_KERNEL@
stt=1-dllret@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim file,256
sdim newfile,256
pos 100,50 : mes "移動元ファイル名"
pos 250,50 : input file,200
pos 450,50 : button "参照",select
pos 100,80 : mes "移動先ファイル名"
pos 250,80 : input newfile,200
pos 300,150 : button "実行",move
stop
*select
dialog "",16
if stat : objprm 0,refstr
stop
*move
fmove file,newfile
if stat : dialog "失敗しました" : else : dialog "移動完了"
stop
16.ファイルを読み込んで中のテキストを命令として実行する
他所であった質問に答えた時のものです。
ノベルゲーム作成ツール等を作る時とかに必要になることでしょう。
(例)命令(独自の形式)の取得
sdim data,1024
exist "novel.txt"
if strsize<0 {
data ="size\"13\"\n"
data+="text\"はじめまして、\"\n"
data+="text\"自己紹介をさせていただきます。\"\n"
data+="text\"私の名前は\"\n"
data+="wait\"50\"\n"
data+="size\"20\"\n"
data+="color\"000000200\"\n"
data+="speed\"150\"\n"
data+="text\"アルティメット\"\n"
data+="size\"13\"\n"
data+="color\"000000000\"\n"
data+="speed\"0\"\n"
data+="text\"です。\"\n"
data+="wait\"100\"\n"
data+="text\"「http://www.rinku.zaq.ne.jp/ultimate/」に\"\n"
data+="color\"255000000\"\n"
data+="speed\"150\"\n"
data+="text\"HotSoupProcessorBeginner'sClub\"\n"
data+="color\"000000000\"\n"
data+="speed\"0\"\n"
data+="text\"というHSPに関するページを開いています。\"\n"
strlen size,data
bsave "novel.txt",data,size
}
bload "novel.txt",data
notesel data
notemax max
repeat max
noteget tmp,cnt
getstr command,tmp,0,'"'
if command="size" : getstr tmp,tmp,strsize,'"' : int tmp : ;font "MS ゴシック",tmp
if command="text" : getstr tmp,tmp,strsize,'"' : mes tmp
if command="color" : getstr tmp,tmp,strsize,'"' : strmid rr,tmp,0,3 : int rr : strmid gg,tmp,3,3 : int gg : strmid bb,tmp,6,3 : int bb : color rr,gg,bb
if command="speed": getstr tmp,tmp,strsize,'"' : int tmp : text tmp
if command="wait" : getstr tmp,tmp,strsize,'"' : int tmp : wait tmp
loop
stop
実行しなくてもわかるかと思いますがココでの命令説明。
「text」が文字列を表示する命令(mesのこと)。
「size」は文字サイズを変更する命令(fontのサイズ指定部分のみ)。
「color」は文字色の変更(colorのこと)。
「speed」は文字表示速度(textのこと)。
「wait」はそのままのwaitのことで、
形式は「ステートメント"パラメータ"」といったものです。
まず命令名を取得し、ダブルクォートから次のダブルクォートまでをその命令のパラメータとします。
そのまま「novel.txt」と言うファイルで書き出すため誰でもストーリー等を見ることが出来てしまいます。
ソレが嫌な方は保存時に暗号化し、ロード時に復号化すればだいぶマシかと思います。
17.ドライブ情報取得 HSP2.6以上
hspext.dllにあるfxinfo命令と同じようなことをするモジュールです。
ドライブ指定をfxinfoと同じにしようとしたけどカレントドライブ取得に失敗したのでドライブ名の直接指定にしました。
NULLを指定すればいけたはずなんですが(グチ
2GB以上のHDDをパラメータ4以下で取得しようとした場合fxinfoだと-1という結果になりますが
このモジュール(5以下)ではオーバーフローしたウソの結果がでてきます^^;
で、なぜ(0と32)2パターンもあるかというのはhspext.dll側の講座に書いてます。知りたい方はソチラをご覧ください。
それで32を指定すると大容量にも対応した結果が返ってくるようですがコレもうまくいきませんでしたので
勝手にKB単位で取得する形にしました。お詫びとして5と33の指定で総容量の指定をできるようにもしました^^;
肝心なこと忘れてました。fxinfoでは文字列型と数値型指定の2パターンありますが、
モジュールではできないので指定を文字列型変数にしてください。結果が数値でも文字列型となります。
p3 情報の内容
--------------------------------
0 : ドライブの残り容量(byte)
1 : 1クラスタあたりのセクタ数
2 : 1セクタあたりのバイト数
3 : 空きクラスタ数
4 : トータルのクラスタ数
5 : ドライブの総容量(byte)
8 : ドライブのタイプ
16 : ボリュームラベル名
17 : ファイルシステム名
18 : ボリュームシリアル番号
19 : 使用可能な最大ファイル文字数
20 : ファイルシステムフラグ
32 : ドライブの残り容量(Kbyte) (大容量対応)
33 : ドライブの総容量(Kbyte) (大容量対応)
タイプ 内容
--------------------------------
0 : 不明なドライブ
1 : ドライブなし
2 : リムーバブルディスク
3 : ハードディスク
4 : リモート(ネットワーク)ドライブ
5 : CD-ROMドライブ
6 : RAMディスク
(例)ドライブ情報取得
#include "llmod.as"
;************************** 概要説明 ************************
;
; driveinfo v1,"string",n3
;
; v1=文字列型変数 : 情報が格納される変数名
; "string" : ドライブ指定
; n3=数値 : 情報タイプ指定
;
;***********************************************************
#module "system"
#deffunc driveinfo val,str,int
mref var,24
mref root,33
mref type,2
mref stt,64
mref pval2,1024
sdim bufstr,pval2.2*4,2
dim bufnum,4
peek chk,root
if (chk<'A'|(chk>'Z'))&(chk<'a'|(chk>'z')) : return
root+=":\\"
if type>15&(type<21) {
dim prm,8
getptr prm.0,root
getptr prm.1,bufstr.0
prm.2=pval2.2*4
getptr prm.3,bufnum.0
getptr prm.4,bufnum.1
getptr prm.5,bufnum.2
getptr prm.6,bufstr.1
prm.7=pval2.2*4
dllproc "GetVolumeInformationA",prm,8,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
switch type
case 16 : var=bufstr.0 : swbreak
case 17 : var=bufstr.1 : swbreak
case 18 : var=""+bufnum.0 : swbreak
case 19 : var=""+bufnum.1 : swbreak
case 20 : var=""+bufnum.2
swend
} else {
if type=8 {
getptr prm.0,root
dllproc "GetDriveTypeA",prm,1,D_KERNEL@
var=""+dllret@
stt=0
} else {
if type>31 {
chk=0
getptr prm.0,root
getptr prm.1,chk
getptr prm.2,bufnum
getptr prm.3,bufnum.2
dllproc "GetDiskFreeSpaceExA",prm,4,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
switch type
case 32 : bufnum=bufnum.2>>10 & $3fffff + (bufnum.3<<22) : var=""+bufnum : swbreak
case 33 : bufnum=bufnum.0>>10 & $3fffff + (bufnum.1<<22) : var=""+bufnum
swend
} else {
getptr prm.0,root
getptr prm.1,bufnum.0
getptr prm.2,bufnum.1
getptr prm.3,bufnum.2
getptr prm.4,bufnum.3
dllproc "GetDiskFreeSpaceA",prm,5,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
switch type
case 0 : chk=bufnum.0*bufnum.1*bufnum.2 : var=""+chk : swbreak
case 1 : var=""+bufnum.0 : swbreak
case 2 : var=""+bufnum.1 : swbreak
case 3 : var=""+bufnum.2 : swbreak
case 4 : var=""+bufnum.3 : swbreak
case 5 : chk=bufnum.0*bufnum.1*bufnum.3 : var=""+chk
swend
}}}
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim info,16,7
sdim infotitle,32,7
infotitle.0="ボリュームラベル","ファイルシステム","シリアル番号","使用可能最大ファイル数"
infotitle.4="ファイルシステムフラグ","ドライブ空き容量","ドライブ総容量"
dim type,7
type=16,17,18,19,20,32,33
repeat 7
pos 50,cnt*50+50 : mes infotitle.cnt
driveinfo info,"C",type.cnt
pos 300,cnt*50+50 : mes info
loop
stop
18.ドライブ一覧取得 HSP2.6以上
17の応用です。自分の作成しているプログラムでこの処理が必要になったため、17を利用してやってみました。
タイトルから想像できるかと思いますが、言うなれば「マイコンピュータ」のようなドライブの一覧を知るものですね。
#include "llmod.as"
sdim all, 128
sdim drive, 4
sdim drivename, 16, 6
drivename = "Unknown", "NoDrive", "Removable", "HardDisk", "NetWorkDrive", "CD/DVD-ROM", "RamDisk"
repeat 26
poke drive, 0, cnt + 65
poke drive, 1, ':'
poke drive, 2, '\\'
getptr prm, drive
dllproc "GetDriveTypeA", prm, 1, D_KERNEL
if dllret < 2 : continue
if all != "" : all += "\n"
all += drive + " " + drivename.dllret
loop
font "MS ゴシック", 15
objmode 2
objsize 200, 25
stop