VBA使用API-ReadFile读取自定义文件问题

asdjy123 2014-08-27 02:31:00
参照VC6.0中的读取API改写成在VBA中能够使用的API,但进行了几天之后还是没有解决此文题,望各位帮忙解决。再此先谢了。
VC中的写和读部分代码:主要使用CreateFile和WriteFile进行文件内容保存和使用ReadFile进行读取文件
注:创建和报文数据的文件是使用CreateFile和WriteFile API创建和保存的,格式为.His结尾
’读取
f=CreateFile(strHis,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,/*OPEN_ALWAYS*/OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (f!=NULL && f!=INVALID_HANDLE_VALUE)
{
SetFilePointer(f,sizeof(HISKWHDD)*saveno,NULL,FILE_BEGIN);
ReadFile(f,&his_dd,sizeof(HISKWHDD),&lBytesWritten,0);
}
‘结构体
struct HISKWHDD
{
float Value[36];
};
复制代码

我自己参照上面在vba改变的程序,为什么没显示数据

//实现函数
Private Sub CommandButton1_Click()
Dim PosL As Long
Dim PosH As Long
Dim SizeRead As Long
Dim Ret1 As Long, Ret2 As Long, Ret3 As Long
Dim temp As SECURITY_ATTRIBUTES
Dim data As DATA_SAVE
Dim handle As Long
handle = CreateFile("D:\BDZHT\His\S20140319DD.His", GENERIC_WRITE Or GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, temp, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0)

If handle <> 0 Then
Ret1 = SetFilePointer(handle, 144 * 2, 0, FILE_BEGIN)
Ret2 = ReadFile(handle, data, 144, SizeRead, 0)
Ret3 = CloseHandle(handle)
End If
End Sub
//对应结构体
Public Type DATA_SAVE
data(0 To 36) As Single
End Type
...全文
880 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitbug123 2017-02-15
  • 打赏
  • 举报
回复
版主,你的代码CreateFile返回 -1,不能用
dsd999 2014-09-01
  • 打赏
  • 举报
回复
你可以先试试读取别的文件。
dsd999 2014-09-01
  • 打赏
  • 举报
回复


Private Sub CommandButton1_Click()
'²âÊÔFileSystemObject
'Set fs = CreateObject("Scripting.FileSystemObject")
'Set a = fs.CreateTextFile("f:\testfile.HIS", True)
'a.WriteLine ("This is a test.")
'a.Close

'²âÊÔOpen
' Dim txt As String
 'Open "D:\BDZHT\His\S20140319DD.His" For Input As #1
' Do While Not EOF(1)
 'Line Input #1, txt
 'MsgBox txt
' Loop
' Close #1

    '²âÊÔAPIʹÓÃ
    Dim temp As SECURITY_ATTRIBUTES
    Dim data As DATA_SAVE
    Dim handle As Long
    Dim Buffer(1000) As Byte
    Dim loc As Long
   ' Dim data(0 To 36) As Byte
  ' Dim str As String
  Dim i As Integer
    
    Dim PosL As Long
    Dim PosH As Long
    Dim SizeRead As Long
    Dim Ret1 As Long, Ret2 As Long, Ret3 As Long
    handle = CreateFile("D:\S20111108DD.His", GENERIC_WRITE Or GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, temp, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0)
    
    
    If handle <> 0 Then
      Ret1 = SetFilePointer(handle, 144 * 10, 0, FILE_BEGIN)
      loc = SetFilePointer(handle, 0, 0, FILE_CURRENT)
      For i = 0 To 10
      Ret2 = ReadFile(handle, data, 144, SizeRead, 0)
      loc = SetFilePointer(handle, 144 * 10 + (i + 1) * 144, 0, FILE_BEGIN)
      Next
      Ret3 = CloseHandle(handle)
    End If
End Sub


Private Sub UserForm_Click()

End Sub
dsd999 2014-09-01
  • 打赏
  • 举报
回复
我用的是2007版。 修改的地方就两个,“测试HIS读取2”和“全局变量”。

Public TabType As Integer '±¨±íµÄ״̬£º1±íʾÖÆ×÷ÈÕ±¨±í£¬2±íʾÖÆ×÷Ô±¨±í
Public TimeId  As Integer 'ʱ¼äµÄµÄСʱ»òÌ죬µ«ÐèÒªÏòÏÂÌî³äʱÔòµ±×öÌî³äÆðʼµØÖ·
Public StepLengh  As Integer '²½³¤£¬Ö»Óе±ÏòÏÂÌî³äÑ¡ÔñÖ®ºó²ÅÓÐЧ
Public IsFull  As Integer 'ÅжÏÊÇ·ñÐèÒªÏòÏÂÌî³ä£¬0ʱÔò²»ÐèÒª£¬1ʱÔòÐèÒª
Public HisDate  As Integer 'ÀúÊ·ÈÕÆÚ£¬ÓÃÓÚ±£´æ
Public AccseeDataId  As Integer '±£´æÊý¾ÝµÄId£¬ÓÃÓÚ¶¨Î»ÄǸöµç¶È
Public tableDate As Date '¶¨Ò屨±íÊä³öʱµÄʱ¼ä
Public fastTableCount  As Integer '¿ìËÙÖÆ×÷±¨±íÖÐÑ¡Ôñ±¨±íÊý¾ÝÌõÊý

'¶¨ÒåAPI
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
'Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
 Public Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long

'¶¨ÒåʹÓÃAPIµÄ²ÎÊý¶¨Òå
Public Const GENERIC_WRITE = &H40000000
Public Const GENERIC_READ = &H80000000
Public Const CREATE_NEW = 1
Public Const OPEN_EXISTING = 3
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2

Public Const FILE_BEGIN = 0
Public Const FILE_CURRENT = 1

'¶¨Òå½á¹¹ÌåSECURITY_ATTRIBUTES (°²È«ÊôÐÔ)
Public Type SECURITY_ATTRIBUTES
  nLength As Long
  bInheritHandle As Long
  lpSecurityDescriptor As Long
End Type

Public Type DATA_SAVE
   data(0 To 35) As Single
End Type


asdjy123 2014-09-01
  • 打赏
  • 举报
回复
引用 7 楼 dsd999 的回复:
已给你回邮件,已能读出数据。 关键是ReadFile的声明, 应该为 Public Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
帮主,感谢你的帮忙! 您给的DrawYun.xls的文件打开之后出现“模块未找到”的错误,在进行别的版本、系统以及网上改变区域语言之后还是这个错误,里面没有工程,也没源码。 在进行修改之后ReadFile的定义之后也没有读出非0数据,您是否还修改了其他地方,您能否给下修改的源码,或者您有别的方法解决“模块未找到”的错误
asdjy123 2014-09-01
  • 打赏
  • 举报
回复
引用 11 楼 dsd999 的回复:
你可以先试试读取别的文件。
非常感谢版主的版主,使用您的代码之后问题已经解决了。您的DrawYun.xls最后在excel2010中打开时得到了源码。 进行测试之后发现问题的关键就是就如您说的定义API时的第二个参数、第四核第五个参数时指明了的值传递还是地址传递的问题
asdjy123 2014-08-29
  • 打赏
  • 举报
回复
引用 4 楼 dsd999 的回复:
返回值都没问题,能不能把文件发给我,我看看。 dsd999@163.com
前面的一两组数据可能会没有
asdjy123 2014-08-29
  • 打赏
  • 举报
回复
引用 4 楼 dsd999 的回复:
返回值都没问题,能不能把文件发给我,我看看。 dsd999@163.com
已经发送,谢谢版主帮忙
dsd999 2014-08-29
  • 打赏
  • 举报
回复
返回值都没问题,能不能把文件发给我,我看看。 dsd999@163.com
dsd999 2014-08-29
  • 打赏
  • 举报
回复
已给你回邮件,已能读出数据。 关键是ReadFile的声明, 应该为 Public Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
asdjy123 2014-08-28
  • 打赏
  • 举报
回复
没人了解吗?现在能够读取数据,暂时显示的数据都是一样,难道读取方式不对?
asdjy123 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 dsd999 的回复:
Ret1, Ret2, Ret3分别返回多少?
分别:288、1、1
dsd999 2014-08-28
  • 打赏
  • 举报
回复
Ret1, Ret2, Ret3分别返回多少?

5,139

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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