难:当后台Service启动一个VB应用程序时,FileSystemObject不能用了?

kiko_l 2003-08-21 01:19:10
别人坐的一个Service程序,由他启动我VB应用程序(.exe的),后台运行,没有画面。VB应用程序利用到了FileSystemObject判断空间大小。本地的没有问题,可是如果是网络共享的话,FileSystemObject总是说无效的路径(本机手工的话,共享目录可以直接打开,有权限访问),可是程序里不行。如果不经过Service程序启动的话,VB应用程序可以用FileSystemObject。问题好像在Service上。有谁遇到过吗?Service是用VC++编的,就是用来启动VB的EXE文件的。
...全文
47 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2003-09-24
  • 打赏
  • 举报
回复
用api:
如何求出磁盘大小及剩余空间大小 (含大于 2GB 的正确算法)

在问题:如何求出磁盘大小及剩余空间大小
我们使用了 GetDiskFreeSpace API 来求出磁盘大小及剩余空间大小,
在问题:如何求出磁盘大小及剩余空间大小 (更简单的 VB6 新功能)
我们使用了 FileSystemObject 来求出磁盘大小及剩余空间大小,

如果网友自己曾经实际测试过这二个主题的程序码,而您的硬盘又大于 2GB 时,或许您会发现,只要大于 2GB 的部份都无法正确的显示!为什么会这样呢?这是因为目前 VB 只支持到 32 位的 Integer 资料型态,所以最大值就是 2GB!

要解决这个问题,您必须改用另一个 API GetDiskFreeSpaceEx,不过,在这个 API 中,有使用了一个新的 ULARGE_INTEGER Structure,所以在声明 GetDiskFreeSpaceEx API 之前,您也必须要先声明 ULARGE_INTEGER Type:

Type ULARGE_INTEGER
LowPart As Long
HighPart As Long
End Type

Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" _
(ByVal lpDirectoryName As String, _ '目录名称或磁盘代码
lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _ '剩余可用空间大小 (Bytes)
lpTotalNumberOfBytes As ULARGE_INTEGER, _ '磁盘总空间大小 (Bytes)
lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long '剩余总空间大小 (Bytes)

ULARGE_INTEGER Structure 是一个 VB 预设中尚未支持的 64 位的 Integer,它的范围是从 &H0 到 &HFFFFFFFFFFFFFFFF (也就是 2 的 64 次方),它可用于所有尚未支持 64 位的 Integer 的程序语言中。它将 64 位的值切割成二个 32 位的部份,也就是 LowPart 及 HighPart。如果那一天 VB 开始支持 64 位的 Integer 资料型态,ULARGE_INTEGER Structure 就用不到了,否则,您一定要记得声明!

在模组中声明了上面的 Type ULARGE_INTEGER 及 GetDiskFreeSpaceEx API 之后,我们来看看以下的范例程序:

Private Sub Command1_Click()
Dim userbytes As ULARGE_INTEGER ' 目前 User 可用磁盘空间
Dim totalbytes As ULARGE_INTEGER ' 磁盘总空间
Dim freebytes As ULARGE_INTEGER ' 磁盘剩余总空间
Dim retval As Long ' GetDiskFreeSpaceEx 的返回值

If Text1.Text = "" Then Text1.Text = "C"
retval = GetDiskFreeSpaceEx(Text1.Text & ":\", userbytes, totalbytes, freebytes)
'
If userbytes.LowPart < 0 Then
User 可用磁盘空间 = Format((userbytes.HighPart * (16 ^ 8)) + (userbytes.LowPart + (16 ^ 8)), "#,###")
Else
User 可用磁盘空间 = Format((userbytes.HighPart * (16 ^ 8)) + userbytes.LowPart, "#,###")
End If
'
If totalbytes.LowPart < 0 Then
磁盘总空间 = Format((totalbytes.HighPart * (16 ^ 8)) + (totalbytes.LowPart + (16 ^ 8)), "#,###")
Else
磁盘总空间 = Format((totalbytes.HighPart * (16 ^ 8)) + totalbytes.LowPart, "#,###")
End If
'
If freebytes.LowPart < 0 Then
磁盘剩余总空间 = Format((freebytes.HighPart * (16 ^ 8)) + (freebytes.LowPart + (16 ^ 8)), "#,###")
Else
磁盘剩余总空间 = Format((freebytes.HighPart * (16 ^ 8)) + freebytes.LowPart, "#,###")
End If
'
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
End Sub

注意:以上的功能有以下 OS 本身的限制

Windows 95 必须在 OSR2 或以后的版本才行!
Windows NT 必须在 4.0 以后的版本才行!
autoblue 2003-09-24
  • 打赏
  • 举报
回复
你运行你的VB程序是用CREATEPROCESS么,那里面要设置应用程序运行所在的用户及权限的
kiko_l 2003-08-21
  • 打赏
  • 举报
回复
UP?
hxy2003 2003-08-21
  • 打赏
  • 举报
回复
UP
kiko_l 2003-08-21
  • 打赏
  • 举报
回复
可是如果不用Service调用的话,FileSystemObject能识别网络的共享目录的。
有别的能处理的吗?
yijiansong 2003-08-21
  • 打赏
  • 举报
回复
FileSystemObject无法处理网络路

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧