网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月08日漏签0天
vb吧 关注:156,129贴子:1,166,130
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1回复贴,共1页
<<返回vb吧
>0< 加载中...

求助Vb调用timegettime api函数返回0

  • 只看楼主
  • 收藏

  • 回复
  • 双鱼毛球
  • 求过二级
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Vb调用timegettime api函数返回0,有人遇到过吗


  • sunruisunrui
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在使用 VB 调用 `timeGetTime` API 函数时,如果它返回 `0`,可能是由于以下原因造成的:
---
### 1. **API 函数声明问题**
VB(VB6)代码调用 Windows API 函数时,需要正确声明这个函数。如果声明中写错,`timeGetTime` 的结果可能会异常。请确保你的 API 声明如下:
```vb
Declare Function timeGetTime Lib "winmm.dll" () As Long
```
确保这个声明与系统的 `winmm.dll` 匹配。
---
### 2. **未正确加载 `winmm.dll`**
`timeGetTime` 是 Windows 的多媒体 API 提供的函数,由包含在 `winmm.dll` 中的 `timeBeginPeriod` 和 `timeEndPeriod` 配合使用。请确保在调用之前,`winmm.dll` 正常加载。
如果你的代码运行环境没有正确加载 DLL 文件,有可能导致 `timeGetTime` 返回错误值。确保 Windows 系统的 `winmm.dll` 文件存在且可用。
---
### 3. **计时精度问题**
在调用 `timeGetTime` 前,通常需要通过 `timeBeginPeriod` 调整系统的计时器分辨率。如果没有调用 `timeBeginPeriod` 或设置错误,有可能会导致返回值异常。
参考如下代码:
```vb
Declare Sub timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long)
Declare Sub timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long)
```
在程序最开始时,设置分辨率为 1 毫秒:
```vb
timeBeginPeriod 1
Dim t As Long
t = timeGetTime()
Debug.Print t ' 调试输出 t 的值
```
在程序结束时,恢复默认分辨率:
```vb
timeEndPeriod 1
```
---
### 4. **可能遇到溢出问题**
`timeGetTime` 返回一个以毫秒为单位的 32 位整数,表示自 Windows 系统启动以来经过的总毫秒数。一旦返回值超出 2^31(约 49.7 天后),它将回绕到 `0`(即重置为 0)。所以如果系统已运行超过 49.7 天,调用 `timeGetTime` 可能会返回 0。
解决办法是检查系统运行的时间,并使用比较逻辑来处理回绕问题。
```vb
Static lastTime As Long
Dim currentTime As Long
currentTime = timeGetTime()
If currentTime < lastTime Then
' 计时器回绕,处理溢出逻辑
Debug.Print "Timer has wrapped around"
Debug.Print currentTime
Else
Debug.Print "Elapsed time: " & currentTime - lastTime
End If
lastTime = currentTime
```
---
### 5. **系统权限问题**
在极少数情况下,由于用户权限不足(例如,某些受限环境下运行的应用程序或虚拟机中),可能无法正确访问相关的 API 计时服务。
尝试确保你的程序具有正常权限,并在非虚拟化环境中运行测试代码。
---
### 6. **其他调试建议**
- **建议打印并检查返回值。**
判断是否总是返回 0 还是某种特殊条件下返回 0。
- **检查操作系统版本和兼容性。**
过于老旧的 Windows 版本可能对 `winmm.dll` 或 `timeGetTime` API 的支持不一致。
---
### 示例完整代码
这里提供一个完整的 VB 示例代码以供测试:
```vb
Declare Function timeGetTime Lib "winmm.dll" () As Long
Declare Sub timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long)
Declare Sub timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long)
Sub TestTimeGetTime()
Dim t As Long
' 设置计时分辨率为 1 毫秒
timeBeginPeriod 1
' 检查时间
t = timeGetTime()
Debug.Print "TimeGetTime: "; t
' 恢复默认分辨率
timeEndPeriod 1
End Sub
```
运行以上代码,观察返回值是否正常。如果仍然返回 0,请仔细检查前文列出的可能原因。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1回复贴,共1页
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示