Dim lngMaxRecord As Long
Dim sngValue As Single
Dim i As Long
Dim l As Long
Dim Result As Long
ReDim m_nSendBuf(1 To 7) As Long
Dim dTICrecord As TICRecord2
If OpenPort Then
ProgressBar1.Value = 0
ReadClockRecordTotal hport, lngMaxRecord
sngValue = 100 / lngMaxRecord
Label4.Caption = "共有﹕" & lngMaxRecord & " 條記錄"
Call CopyMemory(m_nSendBuf(1), dTICrecord, 50)
Result = BatchReadRecord(hport, VarPtr(m_nSendBuf(1)))
Call CopyMemory(dTICrecord, m_nSendBuf(1), 50)
Debug.Print "讀取到數據﹕" & Result
Debug.Print dTICrecord.Card
Debug.Print dTICrecord.CardTimes
Debug.Print dTICrecord.Mark
Debug.Print dTICrecord.TimeString
Debug.Print dTICrecord.CardGroup
Debug.Print dTICrecord.Flag
Debug.Print dTICrecord.EmpID
我在運行以上代碼時沒有任何問題﹐但只運行一次能正常退出﹐多于一次時﹐退出就會出“該記憶體不能為"Written"的錯誤﹐請問各位大哥﹐是怎么回事來的﹖ End If
Dim sngValue As Single
Dim i As Long
Dim l As Long
Dim Result As Long
ReDim m_nSendBuf(1 To 7) As Long
Dim dTICrecord As TICRecord2
If OpenPort Then
ProgressBar1.Value = 0
ReadClockRecordTotal hport, lngMaxRecord
sngValue = 100 / lngMaxRecord
Label4.Caption = "共有﹕" & lngMaxRecord & " 條記錄"
Call CopyMemory(m_nSendBuf(1), dTICrecord, 50)
Result = BatchReadRecord(hport, VarPtr(m_nSendBuf(1)))
Call CopyMemory(dTICrecord, m_nSendBuf(1), 50)
Debug.Print "讀取到數據﹕" & Result
Debug.Print dTICrecord.Card
Debug.Print dTICrecord.CardTimes
Debug.Print dTICrecord.Mark
Debug.Print dTICrecord.TimeString
Debug.Print dTICrecord.CardGroup
Debug.Print dTICrecord.Flag
Debug.Print dTICrecord.EmpID
我在運行以上代碼時沒有任何問題﹐但只運行一次能正常退出﹐多于一次時﹐退出就會出“該記憶體不能為"Written"的錯誤﹐請問各位大哥﹐是怎么回事來的﹖ End If
erase m_nSendBuf
再請問一下﹐運行時有時會出“該記憶體不能為"Read"的錯誤﹐這個又是怎么引起的﹖
redim的数组空间释放掉,程序退出的时候
erase m_nSendBuf我使用這個后﹐雖不報不能為"Written"的錯誤﹐但現在變成了“該記憶體不能為"Read"的錯誤﹐請問怎么解決啊﹖
Call CopyMemory(m_nSendBuf(1), dTICrecord, LenB(dTICrecord))
Result = BatchReadRecord(hport, VarPtr(m_nSendBuf(1)))
Call CopyMemory(dTICrecord, m_nSendBuf(1), LenB(dTICrecord))但這樣也是會出這種錯誤﹐所以我換成了50
'批量讀數據(880 1.28以上版本)
Declare Function BatchReadRecord Lib "KN200.dll" (ByVal hport As Long, ByVal Records As Any) As Longhport是一個端口地址﹐這個沒有問題
Records 是取得的數據,是自定義結構類型﹐
Type TICRecord2
Card As String * 19
TimeString As String * 16
EmpID As String * 2
Mark As Long
Flag As Long
CardTimes As Long
CardGroup As Long
End TypeRecords 取得的數據只是一個內存地址
as string * n 都换成 as byteType TICRecord2
Card(18) As Byte
TimeString(15) As Byte
EmpID(1) As Byte
Mark As Long
Flag As Long
CardTimes As Long
CardGroup As Long
End Type
可能结构有问题
as string * n 都换成 as byteType TICRecord2
Card(18) As Byte
TimeString(15) As Byte
EmpID(1) As Byte
Mark As Long
Flag As Long
CardTimes As Long
CardGroup As Long
End Type
換了﹐還是不行
var
i: Integer;
Buf: array[0..$10] of TICRecord2;
begin
Result := 0;
if bFast and((pclk.bIs880 and(pclk.Fireware>=FW128))or(Is780(pclk.DeviceType))) then
begin
Flag := 0;
FillChar(Buf, SizeOf(Buf), 0);
Result := BatchReadRecord(hPort, Buf);
if Result>= then
...................
我依上面的代碼在Delphi調試是一點事都沒﹐我懷疑是
Buf: array[0..$10] of TICRecord2
FillChar(Buf, SizeOf(Buf), 0);
Result := BatchReadRecord(hPort, Buf);
這個調用的方式有點問題﹐BatchReadRecord這個是一次取16條記錄的﹐而我定義的是一次取一條﹐但在vb中定義時﹐我不知從何下手啊
结构体类型传参用Byref吧
FillChar(Buf, SizeOf(Buf), 0);//创建字符缓冲区,同const BufSize=sizeof(buf) buf=string(bufsize,0)
Result := BatchReadRecord(hPort, Buf);//那里有一次取16條記錄的啊????
Buf: array[0..$10] of TICRecord2
FillChar(Buf, SizeOf(Buf), 0);//创建字符缓冲区,同const BufSize=sizeof(buf) buf=string(bufsize,0)
Result := BatchReadRecord(hPort, Buf);//那里有一次取16條記錄的啊???? 不好意思﹐沒注明﹐我使用這個函數讀取數據時﹐就會讀取16條記錄
结构体类型传参用Byref
Call CopyMemory(m_nSendBuf(1), dTICrecord, LenB(dTICrecord))
Result = BatchReadRecord(hport, VarPtr(m_nSendBuf(1)))
Call CopyMemory(dTICrecord, m_nSendBuf(1), LenB(dTICrecord))
這樣子能取到值﹐但就是會常常來個“該記憶體不能為"Written"的錯誤
ReDim Buf(1 To 4) As TICRecord2 '定義四個結構
ReDim m_nSendBuf(1 To 28) As Long '每個結構有7組地址 4*7=28
BufSize = Len(Buf(1))
Buf = String(BufSize, 0)
Result = BatchReadRecord(hport, VarPtr(m_nSendBuf(1))) //將取得的記錄地址存入nSendBuf(1)
Call CopyMemory(Buf(1), m_nSendBuf(1), Len(Buf(1))) //從地址m_nSendBuf(1)中取出值存入Buf(1)中我定義了四個結構﹐只能取到一個結構的數據﹐本是將 m_nSendBuf(1 to 28)地址里面的值全給結構buf(1 to 4) 的,但現在只給到了結構Buf(1)裏面,我查過m_nSendBuf(1 to 28)裏面是有值的,CopyMemory不能將它們全部給多個結構嗎?