vc中使用利用API-CreateFile创办,以API-WriteFile写入的文件不能再VBA中使用对应的API读取吗
vc中使用利用API-CreateFile创建,以API-WriteFile写入的文件不能再VBA中使用对应的API读取吗?
如:S20111108DD.His文件是在VC6.0中利用API-CreateFile创建,以API-WriteFile写入,其中写入的个数是以结构体中包含36个float数组形式写入,结构体:
在VBA中的使用
然后我在BVA中使用过CreateFile打开文件和ReadFile读取数据,但是经过调试发现data数据都为0.
注:S20111108DD.His以txt形式打开乱码
难道使用其他软件使用API就不能读取吗?,请各位给点意见。
vc中创建和写入代码:部分定义略
------解决方案--------------------
S20111108DD.His有乱码说明已经导出了。并且文件应该无论有什么程序只要按照格式都能读取,所以估计应该是读取的时候有些什么问题。
你可以调试一步步判断问题在哪,比如在输出前看看输出的缓冲区、缓冲区长度正确不正确,里面的内容是否正确
输出后看看文件里的内容,可以用有Hex显示的工具(Notepad++中Converter插件)看看里面的数据与设想的输出是否一致(对比输出时缓冲区内存内容和文件里的16进制文本),如果全部正确就说明是读取的问题。
------解决方案--------------------
D:\BDZHT\His\S20111108DD.His
是不是应该写成
D:\\BDZHT\\His\\S20111108DD.His
handle = INVALID_HANDLE_VALUE也表明失败
------解决方案--------------------
看了下 vc 和 vb 的代码都没有明显的问题
看看是不是你的 SetFilePointer 有问题(养成个习惯,程序不能达到自己所预期的效果时,把所有API函数的返回值都检查一下)
如果在vc写文件没问题的话,那就是你读文件的时候 SetFilePointer 设置的起始位置有误了
------解决方案--------------------
如:S20111108DD.His文件是在VC6.0中利用API-CreateFile创建,以API-WriteFile写入,其中写入的个数是以结构体中包含36个float数组形式写入,结构体:
struct HISKWHDD
{
float Value[36];
};
在VBA中的使用
Public Type DATA_SAVE
data(0 To 35) As Single
End Type
然后我在BVA中使用过CreateFile打开文件和ReadFile读取数据,但是经过调试发现data数据都为0.
注:S20111108DD.His以txt形式打开乱码
难道使用其他软件使用API就不能读取吗?,请各位给点意见。
vc中创建和写入代码:部分定义略
CString strHis;
strHis.Format("S%04d%02d%02dDD.His",year,month,day);
strHis=strPathHis+"His\\" +strHis;
HANDLE f;
f=NULL;
。。。
try
{
f=CreateFile(strHis,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (f!=NULL && f!=INVALID_HANDLE_VALUE)
{
。。。。
SetFilePointer(f,NULL,NULL,FILE_END);
WriteFile(f,buffer,dwSize*sizeof(HISKWHDD),&lBytesWritten,0);
FlushFileBuffers(f);
CloseHandle(f);
}
}
------解决方案--------------------
S20111108DD.His有乱码说明已经导出了。并且文件应该无论有什么程序只要按照格式都能读取,所以估计应该是读取的时候有些什么问题。
你可以调试一步步判断问题在哪,比如在输出前看看输出的缓冲区、缓冲区长度正确不正确,里面的内容是否正确
输出后看看文件里的内容,可以用有Hex显示的工具(Notepad++中Converter插件)看看里面的数据与设想的输出是否一致(对比输出时缓冲区内存内容和文件里的16进制文本),如果全部正确就说明是读取的问题。
------解决方案--------------------
D:\BDZHT\His\S20111108DD.His
是不是应该写成
D:\\BDZHT\\His\\S20111108DD.His
handle = INVALID_HANDLE_VALUE也表明失败
------解决方案--------------------
看了下 vc 和 vb 的代码都没有明显的问题
看看是不是你的 SetFilePointer 有问题(养成个习惯,程序不能达到自己所预期的效果时,把所有API函数的返回值都检查一下)
如果在vc写文件没问题的话,那就是你读文件的时候 SetFilePointer 设置的起始位置有误了
------解决方案--------------------
S20111108DD.His有乱码说明已经导出了。并且文件应该无论有什么程序只要按照格式都能读取,所以估计应该是读取的时候有些什么问题。
你可以调试一步步判断问题在哪,比如在输出前看看输出的缓冲区、缓冲区长度正确不正确,里面的内容是否正确
输出后看看文件里的内容,可以用有Hex显示的工具(Notepad++中Converter插件)看看里面的数据与设想的输出是否一致(对比输出时缓冲区内存内容和文件里的16进制文本),如果全部正确就说明是读取的问题。
在vc中读取文件是没问题,现在是向在vba中进行读取,我根据在vc中的读取API改变使用VBA,并进行单步调试时返回的句柄都有效,但就是缓存结构体data里的值都是0.Private Sub CommandButton1_Click()
'测试API使用
Dim temp As SECURITY_ATTRIBUTES
Dim data As DATA_SAVE
Dim handle As Long
' Dim data(0 To 36) As Byte
' Dim str As String
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:\BDZHT\His\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 * 2, 0, FILE_BEGIN)