Zy910: enmity 兄代码中的TypeOfDrive函数即可判断某个盘符是什么驱动器(无、软盘、硬盘、光驱……),是否能够读取(比如光驱力是否有盘)可用以下代码Public Function DriveReady(ByVal strDrive As String) As Boolean Dim strNullFile As String On Error Resume Next
strDrive = Left(strDrive, 1) strNullFile = Dir(strDrive & ":\NUL") If strNullFile = "NUL" Then DriveReady = True Else DriveReady = False End IfEnd Function调用代码 Private Sub Form_Click() Dim strDrive As String
strDrive = "A" ' 测试软驱是否有效 If DriveReady(strDrive) Then MsgBox "Drive " & strDrive & " is ready!" Else MsgBox "Drive " & strDrive & " is not ready!" End IfEnd Sub
to:billj(小金) 不错的方法!懂得利用“NUL”的特性。我会额外加20分给你,呵呵。
enmity(灵感之源) : 小弟先谢了!
To billj(小金): QB有Dir函数吗?! 有GetDriveType这个API吗?!
to:zyl910(910:分儿,我来了!) QB有Dir这个函数,看来你对QB的认识还不深啊。
刚才查QB的帮助文件才发现: QBasic、QB4.5都没有Dir$函数 QB7.1中才有DIR$[(filespec$)] filespec$ A string expression that specifies a filename or path. The path and filename can include a drive and DOS wildcard characters.Returns A filename that matches the specified pattern. 这个Dir的功能太弱了 不可以指定属性(比如需要得到文件夹列表) 我曾经通过调用Dos中断的方法写了一个Dir函数
'FileList'如果是 Quick BASIC ,请用带库方式打开 '如: Qb /l Qb.qlb FileList.bas 'QB4.5 '或: Qbx /l Qbx.qlb FileList.bas 'QB7.1' Writer = ZYL910 'HomePage = http://zyl910.yeah.net ' E-Mail = [email protected]'############################################################################# '-- 调用终端 (R&W Int) ------------------------------------------------------- TYPE Regs386 AX AS INTEGER BX AS INTEGER CX AS INTEGER DX AS INTEGER SI AS INTEGER DI AS INTEGER DS AS INTEGER ES AS INTEGER Flags AS INTEGER BP AS INTEGER ' standard ^ FS AS INTEGER GS AS INTEGER EAX AS LONG EBX AS LONG ECX AS LONG EDX AS LONG ESI AS LONG EDI AS LONG EBP AS LONG ' extended ^ END TYPE DECLARE SUB Int386 (intNum AS INTEGER, RegIn AS Regs386, RegOut AS Regs386) DECLARE SUB FIXREGS (r AS Regs386)'== R&W Mem ================================================================== DECLARE FUNCTION GetGoodSeg% (SrcSeg AS INTEGER, SrcPtr AS INTEGER) DECLARE FUNCTION ReadCStr$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER) DECLARE FUNCTION ReadMem$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER, ReadLen AS INTEGER)'== (File) or (System) ======================================================= TYPE DateType Y AS INTEGER 'Year M AS INTEGER 'Month D AS INTEGER 'Day END TYPETYPE TimeType H AS INTEGER 'Hour M AS INTEGER 'Minute S AS INTEGER 'Second END TYPETYPE FileInfo FileName AS STRING * 12 Attrib AS INTEGER FileLen AS LONG FileDate AS DateType FileTime AS TimeType END TYPEDECLARE FUNCTION GetCurDrive$ () DECLARE FUNCTION GetDrvPath$ (DriveName AS STRING, AddDriveName AS INTEGER) DECLARE FUNCTION GetCurPath$ () DECLARE FUNCTION ZDir% (FindStr AS STRING, FindAttrib AS INTEGER, OutFileInfo AS FileInfo) DECLARE FUNCTION GetDrvSize& (DriveName AS STRING) DECLARE FUNCTION GetDrvFree& (DriveName AS STRING)CONST MaxFindStrLen = 256 '文件查找字符串的最大长度 CONST MaxPathStrLen = 256 '文件路径字符串的最大长度CONST vbNormal = 0 CONST vbReadOnly = 1 CONST vbHidden = 2 CONST vbSystem = 4 CONST vbVolume = 8 CONST vbDirectory = &H10 '16 CONST vbArchive = &H20 '32 CONST vbAlias = &H40 '64TYPE DOSVerInfo MainVer AS INTEGER SubVer AS INTEGER VerFlags AS INTEGER SerNum AS LONG END TYPEDECLARE FUNCTION GetPSP% () DECLARE FUNCTION GetExeFile$ () DECLARE FUNCTION GetFilePath$ (FileStr AS STRING) DECLARE FUNCTION GetFileName$ (FileStr AS STRING) DECLARE SUB GetDOSVer (OutDOSVer AS DOSVerInfo)'== (Num Type) or (String) =================================================== DECLARE FUNCTION Lng2Int% (LngNum AS LONG) DECLARE FUNCTION Int2Lng& (intNum AS INTEGER) DECLARE FUNCTION DQFS$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER) DECLARE FUNCTION DQFSEx$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER, FillStr AS STRING) DECLARE FUNCTION RightFindStr% (StrSrc AS STRING, StrFind AS STRING)DIM SHARED ReChar AS STRING * 1 '填充字符'#############################################################################'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DIM GetFI AS FileInfo DIM DOSVer AS DOSVerInfo DIM I AS INTEGER, J AS INTEGER DIM TempLng AS LONG DIM TempStr AS STRINGPRINTPRINT STRING$(2, "#"); " Info "; STRING$(72, "#"); PRINT STRING$(2, "="); " DOS "; STRING$(73, "="); GetDOSVer DOSVer PRINT "DOS Ver = "; LTRIM$(RTRIM$(STR$(DOSVer.MainVer))); "."; LTRIM$(RTRIM$(STR$(DOSVer.SubVer))) PRINT " Flags = "; DOSVer.VerFlags PRINT "Ser Num = "; DOSVer.SerNumPRINT STRING$(2, "="); " Exe "; STRING$(73, "="); TempStr = GetExeFile$ PRINT "ExePath = "; GetFilePath$(TempStr) PRINT "ExeName = "; GetFileName$(TempStr) PRINT STRING$(2, "="); " Drive "; STRING$(71, "="); TempStr = GetCurDrive$ + ":" PRINT " Drive = "; TempStr I = ZDir(TempStr + "\*.*", vbVolume, GetFI) PRINT " Volume = "; RTRIM$(GetFI.FileName) PRINT "DrvSize = "; GetDrvSize(GetCurDrive) PRINT "CurPath = "; GetCurPath$ PRINT STRING$(80, "-") IF COMMAND$ <> "" THEN WHILE INKEY$ = "": WENDI = ZDir("*.*", vbDirectory OR vbReadOnly OR vbArchive OR vbHidden OR vbSystem, GetFI) IF I THEN I = 0: J = 0: TempLng = 0 GOSUB EchoFileInfo DO WHILE ZDir("", 0, GetFI) IF COMMAND$ = "" THEN WHILE INKEY$ = "": WEND GOSUB EchoFileInfo LOOP END IFPRINT STRING$(80, "-") PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(I))), 5, " "); " File(s) "; PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(TempLng))), 10, " "); " Byte(s)" PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(J))), 5, " "); " Dir(s) "; PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetDrvFree(GetCurDrive)))), 10, " "); " Byte(s) Free" PRINTENDEchoFileInfo: 'IF GetFI.Attrib AND vbDirectory THEN PRINT GetFI.FileName; "| "; IF GetFI.Attrib AND vbDirectory THEN TempStr = DQFSEx$(1, "<Dir>", 10, " ") J = J + 1 ELSE TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileLen))), 10, " ") I = I + 1 TempLng = TempLng + GetFI.FileLen END IF PRINT TempStr; 'TempStr = HEX$(GetFI.Attrib) TempStr = "" 'IF GetFI.Attrib AND vbDirectory THEN TempStr = TempStr + "D" ELSE TempStr = TempStr + "-" IF GetFI.Attrib AND vbReadOnly THEN TempStr = TempStr + "R" ELSE TempStr = TempStr + "-" IF GetFI.Attrib AND vbArchive THEN TempStr = TempStr + "A" ELSE TempStr = TempStr + "-" IF GetFI.Attrib AND vbHidden THEN TempStr = TempStr + "H" ELSE TempStr = TempStr + "-" IF GetFI.Attrib AND vbSystem THEN TempStr = TempStr + "S" ELSE TempStr = TempStr + "-" PRINT " | "; TempStr; " | "; TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.Y))), 4, "0") TempStr = TempStr + "-" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.M))), 2, "0") TempStr = TempStr + "-" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.D))), 2, "0") 'TempStr = TempStr + (SPACE$(10 - LEN(TempStr))) PRINT TempStr; " | "; TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.H))), 2, "0") TempStr = TempStr + ":" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.M))), 2, "0") TempStr = TempStr + ":" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.S))), 2, "0") TempStr = TempStr + (SPACE$(8 - LEN(TempStr))) PRINT TempStr; " | "; PRINT'END IF RETURN
FUNCTION DQFS$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER) '字符串对齐 'FSNum : 对齐方式 'DQStr : 源字符串 'StrLen: 长度 DIM TempNum AS INTEGER DIM TempStr AS STRING TempNum = LEN(DQStr) IF TempNum = StrLen THEN DQFS$ = DQStr: EXIT FUNCTION IF FSNum > 0 THEN 'Left IF TempNum > StrLen THEN DQFS$ = LEFT$(DQStr, StrLen) ELSE DQFS$ = DQStr + STRING$(StrLen - TempNum, ReChar) END IF ELSEIF FSNum = 0 THEN 'Center DIM LeftNum AS INTEGER LeftNum = ABS(StrLen - TempNum) \ 2 IF TempNum > StrLen THEN DQFS$ = MID$(DQStr, LeftNum, StrLen) ELSE DQFS$ = STRING$(LeftNum, ReChar) + DQStr + STRING$(StrLen - LeftNum, ReChar) END IF ELSE 'Right IF TempNum > StrLen THEN DQFS$ = RIGHT$(DQStr, StrLen) ELSE DQFS$ = STRING$(StrLen - TempNum, ReChar) + DQStr END IF END IFEND FUNCTIONFUNCTION DQFSEx$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER, FillStr AS STRING) '字符串对齐加强版 'FSNum : 对齐方式 'DQStr : 源字符串 'StrLen : 长度 'FillStr: 填充字符 DIM OldReChar AS STRING * 1 OldReChar = ReChar ReChar = FillStr DQFSEx$ = DQFS$(FSNum, DQStr, StrLen) ReChar = OldReCharEND FUNCTIONSUB FIXREGS (r AS Regs386) '把32位寄存体转为16位寄存体 IF (r.AX = 0) AND (r.EAX <> 0) THEN r.AX = Lng2Int(r.EAX AND &HFFFF) IF (r.BX = 0) AND (r.EBX <> 0) THEN r.BX = Lng2Int(r.EBX AND &HFFFF) IF (r.CX = 0) AND (r.ECX <> 0) THEN r.CX = Lng2Int(r.ECX AND &HFFFF) IF (r.DX = 0) AND (r.EDX <> 0) THEN r.DX = Lng2Int(r.EDX AND &HFFFF) IF (r.SI = 0) AND (r.ESI <> 0) THEN r.SI = Lng2Int(r.ESI AND &HFFFF) IF (r.DI = 0) AND (r.EDI <> 0) THEN r.DI = Lng2Int(r.EDI AND &HFFFF) IF (r.BP = 0) AND (r.EBP <> 0) THEN r.BP = Lng2Int(r.EBP AND &HFFFF) END SUBFUNCTION GetCurDrive$ '取得当前盘符 DIM Regs AS Regs386 Regs.AX = &H1900 CALL Int386(&H21, Regs, Regs) GetCurDrive$ = CHR$((Regs.AX AND &HFF) + ASC("A"))END FUNCTIONFUNCTION GetCurPath$ '取得当前路径 GetCurPath$ = GetDrvPath$(GetCurDrive$, -1)END FUNCTIONSUB GetDOSVer (OutDOSVer AS DOSVerInfo) DIM Regs AS Regs386 Regs.AX = &H3000 CALL Int386(&H21, Regs, Regs) OutDOSVer.MainVer = Regs.AX AND &HFF OutDOSVer.SubVer = (Int2Lng(Regs.AX) AND &HFF00&) \ &H100 OutDOSVer.VerFlags = (Int2Lng(Regs.BX) AND &HFF00&) \ &H100 OutDOSVer.SerNum = Int2Lng(Regs.CX) OutDOSVer.SerNum = OutDOSVer.SerNum OR (Regs.BX AND &HFF) * &H10000END SUBFUNCTION GetDrvFree& (DriveName AS STRING) '取得剩余磁盘空间 'DriveName : 盘符 DIM Regs AS Regs386 DIM TempStr AS STRING DIM TempDBL AS DOUBLE Regs.AX = &H3600 TempStr = UCASE$(MID$(DriveName, 1, 1)) 'PRINT TempStr IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION Regs.DX = ASC(TempStr) - ASC("A") + 1 CALL Int386(&H21, Regs, Regs) TempDBL = 1 TempDBL = TempDBL * Regs.ECX TempDBL = TempDBL * Regs.EAX TempDBL = TempDBL * Regs.EBX GetDrvFree& = TempDBLEND FUNCTION
FUNCTION GetDrvPath$ (DriveName AS STRING, AddDriveName AS INTEGER) '取得指定盘符的路径 'DriveName : 盘符 'AddDriveName : 输出时是否加上盘符 DIM Regs AS Regs386 DIM DataStr AS STRING * MaxPathStrLen DIM TempStr AS STRING DIM I AS INTEGER Regs.AX = &H4700 TempStr = UCASE$(MID$(DriveName, 1, 1)) 'PRINT TempStr IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION Regs.DX = ASC(TempStr) - ASC("A") + 1 Regs.SI = VARPTR(DataStr) Regs.DS = VARSEG(DataStr) CALL Int386(&H21, Regs, Regs) TempStr = DataStr I = INSTR(TempStr, CHR$(0)) IF I > 0 THEN TempStr = LEFT$(TempStr, I - 1) IF AddDriveName THEN TempStr = DriveName + ":\" + TempStr GetDrvPath$ = TempStrEND FUNCTIONFUNCTION GetDrvSize& (DriveName AS STRING) '取得磁盘大小 'DriveName : 盘符 DIM Regs AS Regs386 DIM TempStr AS STRING DIM TempDBL AS DOUBLE Regs.AX = &H3600 TempStr = UCASE$(MID$(DriveName, 1, 1)) 'PRINT TempStr IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION Regs.DX = ASC(TempStr) - ASC("A") + 1 CALL Int386(&H21, Regs, Regs) TempDBL = 1 TempDBL = TempDBL * Regs.ECX TempDBL = TempDBL * Regs.EAX TempDBL = TempDBL * Regs.EDX GetDrvSize& = TempDBLEND FUNCTIONFUNCTION GetExeFile$ '取得程序所在目录与文件名 DIM TempSeg AS INTEGER DIM I AS INTEGER TempSeg = GetPSP TempSeg = CVI(ReadMem(TempSeg, &H2C, 2))
DEF SEG = TempSeg DO IF PEEK(I) + PEEK(I + 1) = 0 THEN EXIT DO IF I = &H7FFE THEN EXIT FUNCTION I = I + 1 LOOP DEF SEG 'PRINT I + 4;hex$(I + 4) 'STOP GetExeFile$ = ReadCStr(TempSeg, I + 4)END FUNCTIONFUNCTION GetFileName$ (FileStr AS STRING) '取得“目录与文件名”字符串中的文件名 'FileStr : “目录与文件名”字符串 DIM TempNum AS INTEGER TempNum = RightFindStr(FileStr, "\") IF TempNum THEN GetFileName$ = MID$(FileStr, TempNum + 1)END FUNCTIONFUNCTION GetFilePath$ (FileStr AS STRING) '取得“目录与文件名”字符串中的目录 'FileStr : “目录与文件名”字符串 DIM TempNum AS INTEGER TempNum = RightFindStr(FileStr, "\") IF TempNum THEN GetFilePath$ = LEFT$(FileStr, TempNum - 1)END FUNCTIONFUNCTION GetGoodSeg% (SrcSeg AS INTEGER, SrcPtr AS INTEGER) '计算最好的段地址 'SrcSeg : 段地址 'SrcPtr : 偏移地址 DIM OutSeg AS LONG OutSeg = Int2Lng(SrcSeg) OutSeg = OutSeg + Int2Lng(SrcPtr AND &HFFF0) \ &H10 OutSeg = Lng2Int(OutSeg) GetGoodSeg% = OutSegEND FUNCTIONFUNCTION GetPSP% '取得程序的 PSP 段地址 DIM Regs AS Regs386 Regs.AX = &H5100 CALL Int386(&H21, Regs, Regs) GetPSP% = Regs.BXEND FUNCTION
FUNCTION Lng2Int% (LngNum AS LONG) '长整型 转 整形 'LngNum : 长整型数据 DIM TempLng AS LONG TempLng = LngNum AND &H7FFF IF LngNum AND &H8000& THEN TempLng = TempNum - &H8000& Lng2Int = TempLng END FUNCTIONFUNCTION ReadCStr$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER) '在内存中读取一个 C语言字符串(以0结尾的字符串) 'ReadSeg : 读取的段地址 'ReadPtr : 读取的偏移地址 DIM I AS INTEGER ', SetSeg AS INTEGER DIM TempNum AS INTEGER DIM OutStr AS STRING 'PRINT HEX$(ReadSeg); ":"; HEX$(ReadPtr) I = ReadPtr AND &HF 'SetSeg = GetGoodSeg(ReadSeg, ReadPtr) 'PRINT HEX$(SetSeg); ":"; HEX$(I) DEF SEG = GetGoodSeg(ReadSeg, ReadPtr) 'SetSeg DO TempNum = PEEK(I) IF TempNum = 0 THEN EXIT DO OutStr = OutStr + CHR$(TempNum) IF I = &H7FFF THEN EXIT DO I = I + 1 LOOP DEF SEG ReadCStr$ = OutStrEND FUNCTIONFUNCTION ReadMem$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER, ReadLen AS INTEGER) '从内存中读取一串数据 'ReadSeg : 读取的段地址 'ReadPtr : 读取的偏移地址 'ReadLen : 读取的长度 DIM I AS INTEGER DIM TempNum AS INTEGER DIM OutStr AS STRING IF ReadLen < 1 THEN EXIT FUNCTION I = ReadPtr AND &HF DEF SEG = GetGoodSeg(ReadSeg, ReadPtr) 'SetSeg FOR I = 1 TO ReadLen TempNum = PEEK(I + (ReadPtr AND &HF) - 1) OutStr = OutStr + CHR$(TempNum) IF I = &H7FFF THEN EXIT FOR NEXT I DEF SEG ReadMem$ = OutStrEND FUNCTIONFUNCTION RightFindStr% (StrSrc AS STRING, StrFind AS STRING) '从右侧开始查找字符串 'StrSrc : 源字符串 'StrFind : 查找字符串 DIM I AS INTEGER, J AS INTEGER DIM TempNum AS INTEGER TempNum = LEN(StrFind) DO IF J THEN I = INSTR(J, StrSrc, StrFind) ELSE I = INSTR(StrSrc, StrFind) END IF 'PRINT I 'WHILE INKEY$ = "": WEND IF I THEN J = I + TempNum ELSE EXIT DO LOOP IF J THEN RightFindStr = J - TempNumEND FUNCTIONFUNCTION ZDir% (FindStr AS STRING, FindAttrib AS INTEGER, OutFileInfo AS FileInfo) '相当于 VB 的 Dir 函数 'FindStr : 查找字符串。为 空串 时,是继续查找 'FindAttrib : 查找的属性 'OutFileInfo : 输出 文件信息 DIM Regs AS Regs386 STATIC DataStr AS STRING * 44 DIM FStr AS STRING * MaxFindStrLen DIM TempStr AS STRING DIM I AS INTEGER IF FindStr <> "" THEN Regs.AX = &H1A00 Regs.DX = VARPTR(DataStr) Regs.DS = VARSEG(DataStr) CALL Int386(&H21, Regs, Regs) 'FStr = STRING$(MaxFindStrLen, 0) FStr = LEFT$(FindStr, MaxFindStrLen - 1) + CHR$(0) 'PRINT ReadCStr$(VARSEG(FStr), VARPTR(FStr)); "|" Regs.AX = &H4E00 Regs.CX = FindAttrib Regs.DX = VARPTR(FStr) Regs.DS = VARSEG(FStr) CALL Int386(&H21, Regs, Regs) ELSE Regs.AX = &H4F00 CALL Int386(&H21, Regs, Regs) END IF 'PRINT DataStr; "|"; 'PRINT Regs.ax IF Regs.AX THEN ZDir = 0 EXIT FUNCTION ELSE ZDir = -1 END IF I = ASC(MID$(DataStr, &H15 + 1, 1)) OutFileInfo.Attrib = I I = CVI(MID$(DataStr, &H16 + 1, 2)) OutFileInfo.FileTime.S = (I AND &H1F) * 2 OutFileInfo.FileTime.M = (I AND &H7E0) \ &H20 OutFileInfo.FileTime.H = (I AND &H7100) \ &H800 IF I AND &H8000 THEN OutFileInfo.FileTime.H = OutFileInfo.FileTime.H + &H10 I = CVI(MID$(DataStr, &H18 + 1, 2)) OutFileInfo.FileDate.D = (I AND &H1F) OutFileInfo.FileDate.M = (I AND &H1E0) \ &H20 OutFileInfo.FileDate.Y = (I AND &H7E00) \ &H200 IF I AND &H8000 THEN OutFileInfo.FileDate.Y = OutFileInfo.FileDate.Y + &H40 OutFileInfo.FileDate.Y = OutFileInfo.FileDate.Y + 1980 OutFileInfo.FileLen = CVL(MID$(DataStr, &H1A + 1, 4)) TempStr = MID$(DataStr, &H1E + 1, 12) I = INSTR(TempStr, CHR$(0)) IF I > 0 THEN TempStr = LEFT$(TempStr, I - 1) OutFileInfo.FileName = TempStrEND FUNCTION
他们说没有这个Dos中断功能
要我去查硬盘中断
靠!我要是有硬盘中断的资料,还会去问吗
On Error Resume Next
strDrive = Left(strDrive, 1)
strNullFile = Dir(strDrive & ":\NUL")
If strNullFile = "NUL" Then
DriveReady = True
Else
DriveReady = False
End IfEnd Function调用代码
Private Sub Form_Click() Dim strDrive As String
strDrive = "A" ' 测试软驱是否有效
If DriveReady(strDrive) Then
MsgBox "Drive " & strDrive & " is ready!"
Else
MsgBox "Drive " & strDrive & " is not ready!"
End IfEnd Sub
QB有Dir函数吗?!
有GetDriveType这个API吗?!
QBasic、QB4.5都没有Dir$函数
QB7.1中才有DIR$[(filespec$)] filespec$ A string expression that specifies a filename or path. The path and filename can include a drive and DOS wildcard characters.Returns
A filename that matches the specified pattern.
这个Dir的功能太弱了
不可以指定属性(比如需要得到文件夹列表)
我曾经通过调用Dos中断的方法写了一个Dir函数
'如: Qb /l Qb.qlb FileList.bas 'QB4.5
'或: Qbx /l Qbx.qlb FileList.bas 'QB7.1' Writer = ZYL910
'HomePage = http://zyl910.yeah.net
' E-Mail = [email protected]'#############################################################################
'-- 调用终端 (R&W Int) -------------------------------------------------------
TYPE Regs386
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
SI AS INTEGER
DI AS INTEGER
DS AS INTEGER
ES AS INTEGER
Flags AS INTEGER
BP AS INTEGER
' standard ^
FS AS INTEGER
GS AS INTEGER
EAX AS LONG
EBX AS LONG
ECX AS LONG
EDX AS LONG
ESI AS LONG
EDI AS LONG
EBP AS LONG
' extended ^
END TYPE
DECLARE SUB Int386 (intNum AS INTEGER, RegIn AS Regs386, RegOut AS Regs386)
DECLARE SUB FIXREGS (r AS Regs386)'== R&W Mem ==================================================================
DECLARE FUNCTION GetGoodSeg% (SrcSeg AS INTEGER, SrcPtr AS INTEGER)
DECLARE FUNCTION ReadCStr$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER)
DECLARE FUNCTION ReadMem$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER, ReadLen AS INTEGER)'== (File) or (System) =======================================================
TYPE DateType
Y AS INTEGER 'Year
M AS INTEGER 'Month
D AS INTEGER 'Day
END TYPETYPE TimeType
H AS INTEGER 'Hour
M AS INTEGER 'Minute
S AS INTEGER 'Second
END TYPETYPE FileInfo
FileName AS STRING * 12
Attrib AS INTEGER
FileLen AS LONG
FileDate AS DateType
FileTime AS TimeType
END TYPEDECLARE FUNCTION GetCurDrive$ ()
DECLARE FUNCTION GetDrvPath$ (DriveName AS STRING, AddDriveName AS INTEGER)
DECLARE FUNCTION GetCurPath$ ()
DECLARE FUNCTION ZDir% (FindStr AS STRING, FindAttrib AS INTEGER, OutFileInfo AS FileInfo)
DECLARE FUNCTION GetDrvSize& (DriveName AS STRING)
DECLARE FUNCTION GetDrvFree& (DriveName AS STRING)CONST MaxFindStrLen = 256 '文件查找字符串的最大长度
CONST MaxPathStrLen = 256 '文件路径字符串的最大长度CONST vbNormal = 0
CONST vbReadOnly = 1
CONST vbHidden = 2
CONST vbSystem = 4
CONST vbVolume = 8
CONST vbDirectory = &H10 '16
CONST vbArchive = &H20 '32
CONST vbAlias = &H40 '64TYPE DOSVerInfo
MainVer AS INTEGER
SubVer AS INTEGER
VerFlags AS INTEGER
SerNum AS LONG
END TYPEDECLARE FUNCTION GetPSP% ()
DECLARE FUNCTION GetExeFile$ ()
DECLARE FUNCTION GetFilePath$ (FileStr AS STRING)
DECLARE FUNCTION GetFileName$ (FileStr AS STRING)
DECLARE SUB GetDOSVer (OutDOSVer AS DOSVerInfo)'== (Num Type) or (String) ===================================================
DECLARE FUNCTION Lng2Int% (LngNum AS LONG)
DECLARE FUNCTION Int2Lng& (intNum AS INTEGER)
DECLARE FUNCTION DQFS$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER)
DECLARE FUNCTION DQFSEx$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER, FillStr AS STRING)
DECLARE FUNCTION RightFindStr% (StrSrc AS STRING, StrFind AS STRING)DIM SHARED ReChar AS STRING * 1 '填充字符'#############################################################################'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DIM GetFI AS FileInfo
DIM DOSVer AS DOSVerInfo
DIM I AS INTEGER, J AS INTEGER
DIM TempLng AS LONG
DIM TempStr AS STRINGPRINTPRINT STRING$(2, "#"); " Info "; STRING$(72, "#");
PRINT STRING$(2, "="); " DOS "; STRING$(73, "=");
GetDOSVer DOSVer
PRINT "DOS Ver = "; LTRIM$(RTRIM$(STR$(DOSVer.MainVer))); "."; LTRIM$(RTRIM$(STR$(DOSVer.SubVer)))
PRINT " Flags = "; DOSVer.VerFlags
PRINT "Ser Num = "; DOSVer.SerNumPRINT STRING$(2, "="); " Exe "; STRING$(73, "=");
TempStr = GetExeFile$
PRINT "ExePath = "; GetFilePath$(TempStr)
PRINT "ExeName = "; GetFileName$(TempStr)
PRINT STRING$(2, "="); " Drive "; STRING$(71, "=");
TempStr = GetCurDrive$ + ":"
PRINT " Drive = "; TempStr
I = ZDir(TempStr + "\*.*", vbVolume, GetFI)
PRINT " Volume = "; RTRIM$(GetFI.FileName)
PRINT "DrvSize = "; GetDrvSize(GetCurDrive)
PRINT "CurPath = "; GetCurPath$
PRINT STRING$(80, "-")
IF COMMAND$ <> "" THEN WHILE INKEY$ = "": WENDI = ZDir("*.*", vbDirectory OR vbReadOnly OR vbArchive OR vbHidden OR vbSystem, GetFI)
IF I THEN
I = 0: J = 0: TempLng = 0
GOSUB EchoFileInfo
DO WHILE ZDir("", 0, GetFI)
IF COMMAND$ = "" THEN WHILE INKEY$ = "": WEND
GOSUB EchoFileInfo
LOOP
END IFPRINT STRING$(80, "-")
PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(I))), 5, " "); " File(s) ";
PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(TempLng))), 10, " "); " Byte(s)"
PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(J))), 5, " "); " Dir(s) ";
PRINT DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetDrvFree(GetCurDrive)))), 10, " "); " Byte(s) Free"
PRINTENDEchoFileInfo:
'IF GetFI.Attrib AND vbDirectory THEN
PRINT GetFI.FileName; "| ";
IF GetFI.Attrib AND vbDirectory THEN
TempStr = DQFSEx$(1, "<Dir>", 10, " ")
J = J + 1
ELSE
TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileLen))), 10, " ")
I = I + 1
TempLng = TempLng + GetFI.FileLen
END IF
PRINT TempStr; 'TempStr = HEX$(GetFI.Attrib)
TempStr = ""
'IF GetFI.Attrib AND vbDirectory THEN TempStr = TempStr + "D" ELSE TempStr = TempStr + "-"
IF GetFI.Attrib AND vbReadOnly THEN TempStr = TempStr + "R" ELSE TempStr = TempStr + "-"
IF GetFI.Attrib AND vbArchive THEN TempStr = TempStr + "A" ELSE TempStr = TempStr + "-"
IF GetFI.Attrib AND vbHidden THEN TempStr = TempStr + "H" ELSE TempStr = TempStr + "-"
IF GetFI.Attrib AND vbSystem THEN TempStr = TempStr + "S" ELSE TempStr = TempStr + "-"
PRINT " | "; TempStr; " | "; TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.Y))), 4, "0")
TempStr = TempStr + "-" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.M))), 2, "0")
TempStr = TempStr + "-" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileDate.D))), 2, "0")
'TempStr = TempStr + (SPACE$(10 - LEN(TempStr)))
PRINT TempStr; " | "; TempStr = DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.H))), 2, "0")
TempStr = TempStr + ":" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.M))), 2, "0")
TempStr = TempStr + ":" + DQFSEx$(-1, LTRIM$(RTRIM$(STR$(GetFI.FileTime.S))), 2, "0")
TempStr = TempStr + (SPACE$(8 - LEN(TempStr)))
PRINT TempStr; " | "; PRINT'END IF
RETURN
FUNCTION DQFS$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER)
'字符串对齐
'FSNum : 对齐方式
'DQStr : 源字符串
'StrLen: 长度 DIM TempNum AS INTEGER
DIM TempStr AS STRING TempNum = LEN(DQStr)
IF TempNum = StrLen THEN DQFS$ = DQStr: EXIT FUNCTION
IF FSNum > 0 THEN 'Left
IF TempNum > StrLen THEN
DQFS$ = LEFT$(DQStr, StrLen)
ELSE
DQFS$ = DQStr + STRING$(StrLen - TempNum, ReChar)
END IF
ELSEIF FSNum = 0 THEN 'Center
DIM LeftNum AS INTEGER
LeftNum = ABS(StrLen - TempNum) \ 2
IF TempNum > StrLen THEN
DQFS$ = MID$(DQStr, LeftNum, StrLen)
ELSE
DQFS$ = STRING$(LeftNum, ReChar) + DQStr + STRING$(StrLen - LeftNum, ReChar)
END IF
ELSE 'Right
IF TempNum > StrLen THEN
DQFS$ = RIGHT$(DQStr, StrLen)
ELSE
DQFS$ = STRING$(StrLen - TempNum, ReChar) + DQStr
END IF
END IFEND FUNCTIONFUNCTION DQFSEx$ (FSNum AS INTEGER, DQStr AS STRING, StrLen AS INTEGER, FillStr AS STRING)
'字符串对齐加强版
'FSNum : 对齐方式
'DQStr : 源字符串
'StrLen : 长度
'FillStr: 填充字符 DIM OldReChar AS STRING * 1 OldReChar = ReChar
ReChar = FillStr
DQFSEx$ = DQFS$(FSNum, DQStr, StrLen)
ReChar = OldReCharEND FUNCTIONSUB FIXREGS (r AS Regs386)
'把32位寄存体转为16位寄存体 IF (r.AX = 0) AND (r.EAX <> 0) THEN r.AX = Lng2Int(r.EAX AND &HFFFF)
IF (r.BX = 0) AND (r.EBX <> 0) THEN r.BX = Lng2Int(r.EBX AND &HFFFF)
IF (r.CX = 0) AND (r.ECX <> 0) THEN r.CX = Lng2Int(r.ECX AND &HFFFF)
IF (r.DX = 0) AND (r.EDX <> 0) THEN r.DX = Lng2Int(r.EDX AND &HFFFF)
IF (r.SI = 0) AND (r.ESI <> 0) THEN r.SI = Lng2Int(r.ESI AND &HFFFF)
IF (r.DI = 0) AND (r.EDI <> 0) THEN r.DI = Lng2Int(r.EDI AND &HFFFF)
IF (r.BP = 0) AND (r.EBP <> 0) THEN r.BP = Lng2Int(r.EBP AND &HFFFF)
END SUBFUNCTION GetCurDrive$
'取得当前盘符 DIM Regs AS Regs386 Regs.AX = &H1900
CALL Int386(&H21, Regs, Regs)
GetCurDrive$ = CHR$((Regs.AX AND &HFF) + ASC("A"))END FUNCTIONFUNCTION GetCurPath$
'取得当前路径 GetCurPath$ = GetDrvPath$(GetCurDrive$, -1)END FUNCTIONSUB GetDOSVer (OutDOSVer AS DOSVerInfo)
DIM Regs AS Regs386 Regs.AX = &H3000
CALL Int386(&H21, Regs, Regs)
OutDOSVer.MainVer = Regs.AX AND &HFF
OutDOSVer.SubVer = (Int2Lng(Regs.AX) AND &HFF00&) \ &H100
OutDOSVer.VerFlags = (Int2Lng(Regs.BX) AND &HFF00&) \ &H100
OutDOSVer.SerNum = Int2Lng(Regs.CX)
OutDOSVer.SerNum = OutDOSVer.SerNum OR (Regs.BX AND &HFF) * &H10000END SUBFUNCTION GetDrvFree& (DriveName AS STRING)
'取得剩余磁盘空间
'DriveName : 盘符 DIM Regs AS Regs386
DIM TempStr AS STRING
DIM TempDBL AS DOUBLE Regs.AX = &H3600
TempStr = UCASE$(MID$(DriveName, 1, 1))
'PRINT TempStr
IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION
Regs.DX = ASC(TempStr) - ASC("A") + 1
CALL Int386(&H21, Regs, Regs) TempDBL = 1
TempDBL = TempDBL * Regs.ECX
TempDBL = TempDBL * Regs.EAX
TempDBL = TempDBL * Regs.EBX
GetDrvFree& = TempDBLEND FUNCTION
FUNCTION GetDrvPath$ (DriveName AS STRING, AddDriveName AS INTEGER)
'取得指定盘符的路径
'DriveName : 盘符
'AddDriveName : 输出时是否加上盘符 DIM Regs AS Regs386
DIM DataStr AS STRING * MaxPathStrLen
DIM TempStr AS STRING
DIM I AS INTEGER Regs.AX = &H4700
TempStr = UCASE$(MID$(DriveName, 1, 1))
'PRINT TempStr
IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION
Regs.DX = ASC(TempStr) - ASC("A") + 1
Regs.SI = VARPTR(DataStr)
Regs.DS = VARSEG(DataStr)
CALL Int386(&H21, Regs, Regs) TempStr = DataStr
I = INSTR(TempStr, CHR$(0))
IF I > 0 THEN TempStr = LEFT$(TempStr, I - 1) IF AddDriveName THEN TempStr = DriveName + ":\" + TempStr
GetDrvPath$ = TempStrEND FUNCTIONFUNCTION GetDrvSize& (DriveName AS STRING)
'取得磁盘大小
'DriveName : 盘符 DIM Regs AS Regs386
DIM TempStr AS STRING
DIM TempDBL AS DOUBLE Regs.AX = &H3600
TempStr = UCASE$(MID$(DriveName, 1, 1))
'PRINT TempStr
IF ASC(TempStr) < ASC("A") OR ASC(TempStr) > ASC("Z") THEN EXIT FUNCTION
Regs.DX = ASC(TempStr) - ASC("A") + 1
CALL Int386(&H21, Regs, Regs) TempDBL = 1
TempDBL = TempDBL * Regs.ECX
TempDBL = TempDBL * Regs.EAX
TempDBL = TempDBL * Regs.EDX
GetDrvSize& = TempDBLEND FUNCTIONFUNCTION GetExeFile$
'取得程序所在目录与文件名 DIM TempSeg AS INTEGER
DIM I AS INTEGER TempSeg = GetPSP
TempSeg = CVI(ReadMem(TempSeg, &H2C, 2))
DEF SEG = TempSeg
DO
IF PEEK(I) + PEEK(I + 1) = 0 THEN EXIT DO
IF I = &H7FFE THEN EXIT FUNCTION
I = I + 1 LOOP
DEF SEG
'PRINT I + 4;hex$(I + 4)
'STOP
GetExeFile$ = ReadCStr(TempSeg, I + 4)END FUNCTIONFUNCTION GetFileName$ (FileStr AS STRING)
'取得“目录与文件名”字符串中的文件名
'FileStr : “目录与文件名”字符串 DIM TempNum AS INTEGER TempNum = RightFindStr(FileStr, "\")
IF TempNum THEN GetFileName$ = MID$(FileStr, TempNum + 1)END FUNCTIONFUNCTION GetFilePath$ (FileStr AS STRING)
'取得“目录与文件名”字符串中的目录
'FileStr : “目录与文件名”字符串 DIM TempNum AS INTEGER TempNum = RightFindStr(FileStr, "\")
IF TempNum THEN GetFilePath$ = LEFT$(FileStr, TempNum - 1)END FUNCTIONFUNCTION GetGoodSeg% (SrcSeg AS INTEGER, SrcPtr AS INTEGER)
'计算最好的段地址
'SrcSeg : 段地址
'SrcPtr : 偏移地址 DIM OutSeg AS LONG OutSeg = Int2Lng(SrcSeg)
OutSeg = OutSeg + Int2Lng(SrcPtr AND &HFFF0) \ &H10
OutSeg = Lng2Int(OutSeg) GetGoodSeg% = OutSegEND FUNCTIONFUNCTION GetPSP%
'取得程序的 PSP 段地址 DIM Regs AS Regs386 Regs.AX = &H5100
CALL Int386(&H21, Regs, Regs)
GetPSP% = Regs.BXEND FUNCTION
'整型 转 长整形
'intNum : 整型数据 DIM TempLng AS LONG TempLng = intNum AND &H7FFF
IF intNum AND &H8000 THEN TempLng = TempLng + &H8000&
Int2Lng& = TempLngEND FUNCTIONSUB Int386 (intNum AS INTEGER, RegIn AS Regs386, RegOut AS Regs386)
'386中断调用
'intNum : 中断号
'RegIn : 输入寄存体
'RegOut : 输出寄存体 DIM ASM.Int386 AS STRING * 129
DIM ASMStr AS STRING FIXREGS RegIn '#########################################################################
'<insert code here>
ASMStr = ASMStr + CHR$(&H55) '0000 PUSH BP 55
ASMStr = ASMStr + CHR$(&H8B) + CHR$(&HEC) '0001 MOV BP, SP 8BEC
ASMStr = ASMStr + CHR$(&H1E) '0003 PUSH DS 1E
'0004 ADD BP, 06 81C50600
ASMStr = ASMStr + CHR$(&H81) + CHR$(&HC5) + CHR$(&H6) + CHR$(&H0)
'** Change Segment ***************************
'0008 MOV SI, ---- BE----
ASMStr = ASMStr + CHR$(&HBE) + MKI$(VARPTR(RegIn.AX))
'=============================================
'000B MOV CX, 0C B90C00
ASMStr = ASMStr + CHR$(&HB9) + CHR$(&HC) + CHR$(&H0)
'000E MOV DX, 02 BA0200
ASMStr = ASMStr + CHR$(&HBA) + CHR$(&H2) + CHR$(&H0)
'next2push:
ASMStr = ASMStr + CHR$(&HFF) + CHR$(&H34) '0011 PUSH [SI] FF35
ASMStr = ASMStr + CHR$(&H3) + CHR$(&HF2) '0013 ADD SI, DX 03FA
ASMStr = ASMStr + CHR$(&HE2) + CHR$(&HFA) '0015 LOOP next2push E2FA
'=============================================
'0017 MOV CX, 07 B90700
ASMStr = ASMStr + CHR$(&HB9) + CHR$(&H7) + CHR$(&H0)
'001A MOV DX, 04 BA0400
ASMStr = ASMStr + CHR$(&HBA) + CHR$(&H4) + CHR$(&H0)
'next4push:
ASMStr = ASMStr + CHR$(&H66) '001D NOP 66
ASMStr = ASMStr + CHR$(&HFF) + CHR$(&H34) '001E PUSH [SI] FF35
ASMStr = ASMStr + CHR$(&H3) + CHR$(&HF2) '0020 ADD SI, DX 03FA
ASMStr = ASMStr + CHR$(&HE2) + CHR$(&HF9) '0022 LOOP next4push E2F9
'=============================================
ASMStr = ASMStr + CHR$(&H66) '0024 NOP 66
ASMStr = ASMStr + CHR$(&H5D) '0025 POP BP 5D
ASMStr = ASMStr + CHR$(&H66) '0026 NOP 66
ASMStr = ASMStr + CHR$(&H5F) '0027 POP DI 5F
ASMStr = ASMStr + CHR$(&H66) '0028 NOP 66
ASMStr = ASMStr + CHR$(&H5E) '0029 POP SI 5E
ASMStr = ASMStr + CHR$(&H66) '002A NOP 66
ASMStr = ASMStr + CHR$(&H5A) '002B POP DX 5A
ASMStr = ASMStr + CHR$(&H66) '002C NOP 66
ASMStr = ASMStr + CHR$(&H59) '002D POP CX 59
ASMStr = ASMStr + CHR$(&H66) '002E NOP 66
ASMStr = ASMStr + CHR$(&H5B) '002F POP BX 5B
ASMStr = ASMStr + CHR$(&H66) '0030 NOP 66
ASMStr = ASMStr + CHR$(&H58) '0031 POP AX 58
'=============================================
ASMStr = ASMStr + CHR$(&HF) '0049 NOP 0F
ASMStr = ASMStr + CHR$(&HA9) '004A POP GS A9
ASMStr = ASMStr + CHR$(&HF) '004B NOP 0F
ASMStr = ASMStr + CHR$(&HA1) '004C POP FS A1
'=============================================
ASMStr = ASMStr + CHR$(&H5D) '0036 POP BP 5D
ASMStr = ASMStr + CHR$(&H9D) '0037 POPF 9D
ASMStr = ASMStr + CHR$(&H7) '0038 POP ES 07
ASMStr = ASMStr + CHR$(&H1F) '0039 POP DS 1F
ASMStr = ASMStr + CHR$(&H5F) '003A POP DI 5F
ASMStr = ASMStr + CHR$(&H5E) '003B POP SI 5E
ASMStr = ASMStr + CHR$(&H5A) '003C POP DX 5A
ASMStr = ASMStr + CHR$(&H59) '003D POP CX 59
ASMStr = ASMStr + CHR$(&H5B) '003E POP BX 5B
ASMStr = ASMStr + CHR$(&H58) '003F POP AX 58
'** Int **************************************
ASMStr = ASMStr + CHR$(&HCD) + CHR$(intNum) '0039 INT -- CD--
'=============================================
ASMStr = ASMStr + CHR$(&H66) '0042 NOP 66
ASMStr = ASMStr + CHR$(&H55) '0043 PUSH BP 55
ASMStr = ASMStr + CHR$(&H66) '0044 NOP 66
ASMStr = ASMStr + CHR$(&H57) '0045 PUSH DI 57
ASMStr = ASMStr + CHR$(&H66) '0046 NOP 66
ASMStr = ASMStr + CHR$(&H56) '0047 PUSH SI 56
ASMStr = ASMStr + CHR$(&H66) '0048 NOP 66
ASMStr = ASMStr + CHR$(&H52) '0049 PUSH DX 52
ASMStr = ASMStr + CHR$(&H66) '004A NOP 66
ASMStr = ASMStr + CHR$(&H51) '004B PUSH CX 51
ASMStr = ASMStr + CHR$(&H66) '004C NOP 66
ASMStr = ASMStr + CHR$(&H53) '004D PUSH BX 53
ASMStr = ASMStr + CHR$(&H66) '004E NOP 66
ASMStr = ASMStr + CHR$(&H50) '004F PUSH AX 50
'=============================================
ASMStr = ASMStr + CHR$(&HF) '0049 NOP 0F
ASMStr = ASMStr + CHR$(&HA8) '004A PUSH GS A1
ASMStr = ASMStr + CHR$(&HF) '004B NOP 0F
ASMStr = ASMStr + CHR$(&HA0) '004C PUSH FS A0
'=============================================
ASMStr = ASMStr + CHR$(&H55) '0054 PUSH BP 55
ASMStr = ASMStr + CHR$(&H9C) '0055 PUSHF 9C
ASMStr = ASMStr + CHR$(&H6) '0056 PUSH ES 06
ASMStr = ASMStr + CHR$(&H1E) '0057 PUSH DS 1E
ASMStr = ASMStr + CHR$(&H57) '0058 PUSH DI 57
ASMStr = ASMStr + CHR$(&H56) '0059 PUSH SI 56
ASMStr = ASMStr + CHR$(&H52) '005A PUSH DX 52
ASMStr = ASMStr + CHR$(&H51) '005B PUSH CX 51
ASMStr = ASMStr + CHR$(&H53) '005C PUSH BX 53
ASMStr = ASMStr + CHR$(&H50) '005D PUSH AX 50
ASMStr = ASMStr + CHR$(&H8C) + CHR$(&HD0) '005E MOV AX, SS 8CD0
ASMStr = ASMStr + CHR$(&H8E) + CHR$(&HD8) '0060 MOV DS, AX 8ED8
'*********************************************
'0062 MOV DI, ---- BF----
ASMStr = ASMStr + CHR$(&HBF) + MKI$(VARPTR(RegOut.AX))
'=============================================
'0065 MOV CX, 0C B90C00
ASMStr = ASMStr + CHR$(&HB9) + CHR$(&HC) + CHR$(&H0)
'0068 MOV DX, 02 BA0200
ASMStr = ASMStr + CHR$(&HBA) + CHR$(&H2) + CHR$(&H0)
'next2pop:
ASMStr = ASMStr + CHR$(&H8F) + CHR$(&H5) '006B POP [DI] 8F05
ASMStr = ASMStr + CHR$(&H3) + CHR$(&HFA) '006D ADD DI, DX 03FA
ASMStr = ASMStr + CHR$(&HE2) + CHR$(&HFA) '006F LOOP next2pop E2FA
'=============================================
'0071 MOV CX, 07 B90700
ASMStr = ASMStr + CHR$(&HB9) + CHR$(&H7) + CHR$(&H0)
'0074 MOV DX, 04 BA0400
ASMStr = ASMStr + CHR$(&HBA) + CHR$(&H4) + CHR$(&H0)
'next4pop:
ASMStr = ASMStr + CHR$(&H66) '0077 NOP 66
ASMStr = ASMStr + CHR$(&H8F) + CHR$(&H5) '0078 POP [DI] 8F05
ASMStr = ASMStr + CHR$(&H3) + CHR$(&HFA) '007A ADD DI, DX 03FA
ASMStr = ASMStr + CHR$(&HE2) + CHR$(&HF9) '007C LOOP next4pop E2F9
'=============================================
ASMStr = ASMStr + CHR$(&H1F) '007E POP DS 1F
ASMStr = ASMStr + CHR$(&H5D) '007F POP BP 5D
ASMStr = ASMStr + CHR$(&HCB) '0080 RETF CB
'######################################################################### 'PRINT LEN(ASMStr); HEX$(LEN(ASMStr))
'END
ASM.Int386 = ASMStr DEF SEG = VARSEG(ASM.Int386)
CALL ABSOLUTE(VARPTR(RegIn), VARPTR(RegOut), VARPTR(ASM.Int386))
DEF SEGEND SUB
'长整型 转 整形
'LngNum : 长整型数据 DIM TempLng AS LONG TempLng = LngNum AND &H7FFF
IF LngNum AND &H8000& THEN TempLng = TempNum - &H8000& Lng2Int = TempLng
END FUNCTIONFUNCTION ReadCStr$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER)
'在内存中读取一个 C语言字符串(以0结尾的字符串)
'ReadSeg : 读取的段地址
'ReadPtr : 读取的偏移地址 DIM I AS INTEGER ', SetSeg AS INTEGER
DIM TempNum AS INTEGER
DIM OutStr AS STRING 'PRINT HEX$(ReadSeg); ":"; HEX$(ReadPtr)
I = ReadPtr AND &HF
'SetSeg = GetGoodSeg(ReadSeg, ReadPtr)
'PRINT HEX$(SetSeg); ":"; HEX$(I)
DEF SEG = GetGoodSeg(ReadSeg, ReadPtr) 'SetSeg
DO
TempNum = PEEK(I)
IF TempNum = 0 THEN EXIT DO
OutStr = OutStr + CHR$(TempNum)
IF I = &H7FFF THEN EXIT DO
I = I + 1
LOOP
DEF SEG
ReadCStr$ = OutStrEND FUNCTIONFUNCTION ReadMem$ (ReadSeg AS INTEGER, ReadPtr AS INTEGER, ReadLen AS INTEGER)
'从内存中读取一串数据
'ReadSeg : 读取的段地址
'ReadPtr : 读取的偏移地址
'ReadLen : 读取的长度 DIM I AS INTEGER
DIM TempNum AS INTEGER
DIM OutStr AS STRING IF ReadLen < 1 THEN EXIT FUNCTION
I = ReadPtr AND &HF
DEF SEG = GetGoodSeg(ReadSeg, ReadPtr) 'SetSeg
FOR I = 1 TO ReadLen
TempNum = PEEK(I + (ReadPtr AND &HF) - 1)
OutStr = OutStr + CHR$(TempNum)
IF I = &H7FFF THEN EXIT FOR
NEXT I
DEF SEG
ReadMem$ = OutStrEND FUNCTIONFUNCTION RightFindStr% (StrSrc AS STRING, StrFind AS STRING)
'从右侧开始查找字符串
'StrSrc : 源字符串
'StrFind : 查找字符串 DIM I AS INTEGER, J AS INTEGER
DIM TempNum AS INTEGER TempNum = LEN(StrFind)
DO
IF J THEN
I = INSTR(J, StrSrc, StrFind)
ELSE
I = INSTR(StrSrc, StrFind)
END IF
'PRINT I
'WHILE INKEY$ = "": WEND
IF I THEN J = I + TempNum ELSE EXIT DO
LOOP IF J THEN RightFindStr = J - TempNumEND FUNCTIONFUNCTION ZDir% (FindStr AS STRING, FindAttrib AS INTEGER, OutFileInfo AS FileInfo)
'相当于 VB 的 Dir 函数
'FindStr : 查找字符串。为 空串 时,是继续查找
'FindAttrib : 查找的属性
'OutFileInfo : 输出 文件信息 DIM Regs AS Regs386
STATIC DataStr AS STRING * 44
DIM FStr AS STRING * MaxFindStrLen
DIM TempStr AS STRING
DIM I AS INTEGER IF FindStr <> "" THEN
Regs.AX = &H1A00
Regs.DX = VARPTR(DataStr)
Regs.DS = VARSEG(DataStr)
CALL Int386(&H21, Regs, Regs) 'FStr = STRING$(MaxFindStrLen, 0)
FStr = LEFT$(FindStr, MaxFindStrLen - 1) + CHR$(0)
'PRINT ReadCStr$(VARSEG(FStr), VARPTR(FStr)); "|" Regs.AX = &H4E00
Regs.CX = FindAttrib
Regs.DX = VARPTR(FStr)
Regs.DS = VARSEG(FStr)
CALL Int386(&H21, Regs, Regs) ELSE
Regs.AX = &H4F00
CALL Int386(&H21, Regs, Regs) END IF 'PRINT DataStr; "|";
'PRINT Regs.ax
IF Regs.AX THEN
ZDir = 0
EXIT FUNCTION
ELSE
ZDir = -1
END IF I = ASC(MID$(DataStr, &H15 + 1, 1))
OutFileInfo.Attrib = I
I = CVI(MID$(DataStr, &H16 + 1, 2))
OutFileInfo.FileTime.S = (I AND &H1F) * 2
OutFileInfo.FileTime.M = (I AND &H7E0) \ &H20
OutFileInfo.FileTime.H = (I AND &H7100) \ &H800
IF I AND &H8000 THEN OutFileInfo.FileTime.H = OutFileInfo.FileTime.H + &H10
I = CVI(MID$(DataStr, &H18 + 1, 2))
OutFileInfo.FileDate.D = (I AND &H1F)
OutFileInfo.FileDate.M = (I AND &H1E0) \ &H20
OutFileInfo.FileDate.Y = (I AND &H7E00) \ &H200
IF I AND &H8000 THEN OutFileInfo.FileDate.Y = OutFileInfo.FileDate.Y + &H40
OutFileInfo.FileDate.Y = OutFileInfo.FileDate.Y + 1980
OutFileInfo.FileLen = CVL(MID$(DataStr, &H1A + 1, 4)) TempStr = MID$(DataStr, &H1E + 1, 12)
I = INSTR(TempStr, CHR$(0))
IF I > 0 THEN TempStr = LEFT$(TempStr, I - 1)
OutFileInfo.FileName = TempStrEND FUNCTION
相当于VB的App.Path+"\"+App.ExeName
我是从一个汇编资料上得到的
http://asm.hyedu.com/program/x86-exec-dir.htm
不过希望自己的程序“绿色”(不带或尽量少带控件)的话,这个应该是不错的选择。另外问一句,大家都是怎么了解到那些API的用法呀?从微软?