Tom Daydreamさん さんが書きました:> api_system.sbpのなかで、
> Type FILETIME
> dwLowDateTime As Long
> dwHighDateTime As Long
> End Type
> と定義されているためです。
(;゚⊿゚)
・・・そうきたかw
そこは考えもしませんでした。
しかし。(*)の部分を
コード: 全て選択
q = q + ft.dwLowDateTime '*
ではなくて
コード: 全て選択
q = q or ft.dwLowDateTime '*
にしておけば表面上は問題なかったり(bitをそのまま扱ってるから)。
念のためこっちに直した上でテストしてたので、気づきませんでした(爆)。
で、それ以外にも挙動の変な部分がありまして。
どうも悪さをしているのは、
コード: 全て選択
ql = Fix(q / 10000000) As Long
の部分みたいです。
Fix関数はDouble型→Long型の変換として作られているので、
QWord型では挙動が変です。
なので、
q = q / 10000000 '※
ql = q As Long
としてみましたが、今度は(※)の部分の挙動が信頼できませんでした。
(正常に除算されるときとされないときがありました。)
再現性がイマイチなので、もしかしたら私の勘違いの可能性もありますが・・・。
さらに、
ではなく
でも試してみましたが、めだった改善は見られず。
(環境:Win2000 + AB Ver.4.24.00)
うーん、問題の箇所(QWordのキャストと演算)は分かったけれど、
解決法が分からず・・・。
今日はもう時間が無いので、後日の時間のあるときにまたやってみます。
なお、解析のときに私が定義した関数です。
あると便利かと思い、載せておきます。参考までに。
DWord型のログを取るクラスと、QWord⇔DWord変換関数の定義 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'DWord型変数のログを記録するクラス
/*
クラス:LogDWord
Dim Obj As LogDWord( ログの記録最大数 )
Obj.Record( ログに保存するDWord型の値 ) ※失敗するとFALSE、成功するとTRUE。普通は成功なので無視してオッケー。
[DWord型変数のログが返る] = Obj.PlayLog( ログのインデックス )
インデックスの範囲は、[古い:0~(最大記録数-1):新しい] になります。
*/
Class LogDWord
pDWordArry As DWordPtr
hHeap As HANDLE
nIndex As DWord
nMaxIndex As DWord
Public
Sub LogDWord( nLog As DWord )
hHeap = HeapCreate( NULL, 0, 0 )
pDWordArry = HeapAlloc( hHeap, HEAP_ZERO_MEMORY, nLog*SizeOf(DWord) ) As DWordPtr
nIndex = 0
nMaxIndex = nLog
End Sub
Sub ~LogDWord()
HeapDestroy( hHeap )
End Sub
Function Record( nDWord As DWord ) As Long
Dim i As Long
If( pDWordArry=NULL )Then
Record = FALSE
ExitFunction
Else
Record = TRUE
End If
If( nIndex<nMaxIndex )Then
pDWordArry[ nIndex ] = nDWord
nIndex += 1
Else
i = 1
While( i<nIndex )
pDWordArry[ i-1 ] = pDWordArry[ i ]
i += 1
Wend
pDWordArry[ nIndex-1 ] = nDWord
End If
End Function
Function PlayLog( nIndex As DWord ) As DWord
If( nIndex<nMaxIndex )Then
PlayLog = pDWordArry[ nIndex ]
Else
PlayLog = 0
End If
End Function
End Class
'QWord型への変換
Function MakeQWord( LowDWord As DWord, HighDWord As DWord ) As QWord
Dim q As QWord
q = HighDWord
q = q << 32
q = q + LowDWord
MakeQWord = q
EndFunction
'DWord型への分解
Function HiDWord( q As QWord ) As DWord
q = q and &HFFFFFFFF00000000
q = q >> 32
HiDWord = q
EndFunction
Function LoDWord( q As QWord ) As DWord
LoDWord = q and &HFFFFFFFF
EndFunction
追記:
えっと。
インクルードファイルを修正+Fixを使わない方法に変更+qlをDWord型にする、
でこちらでも正常動作したようです。
10~20分ほど走らせてみましたが、エラーしませんでした。
・・・QWordの除算に関する部分は私の勘違いだったみたいですm(_ _)m