accessに StringFromGUIDってのがあるから使ってみる。
ふむふむ、StringFromGUIDの引数はByte配列だと。でこうなった。
Option Compare Database
Option Explicit
Private Type GUID
GUIDData(0 To 15) As Byte
End Type
#If VBA7 Then
Private Declare PtrSafe Function CoCreateGuid Lib "ole32" ( _
pGUID As GUID _
) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As LongPtr)
#Else
Private Declare Function CoCreateGuid Lib "ole32" ( _
pGUID As GUID _
) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long)
#End If
Function GetNewGUID() As String
Dim tmpGUID As GUID, tmpData(0 To 15) As Byte
If CoCreateGuid(tmpGUID) = 0 Then
CopyMemory tmpData(0), tmpGUID.GUIDData(0), 16
GetNewGUID = Mid(StringFromGUID(tmpData), 7, 38)
End If
End Function
これで速度はおよそ5倍になった。概ね満足。いっそのことCopyMemoryも無くしちゃえばいいんじゃね?
と、なってさらにこうなった。
Option Compare Database
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function CoCreateGuid Lib "ole32" ( _
ByVal pGUID As LongPtr _
) As Long
#Else
Private Declare Function CoCreateGuid Lib "ole32" ( _
ByVal pGUID As Long _
) As Long
#End If
Function GetNewGUID() As String
Dim aryGUID(0 To 15) As Byte
If CoCreateGuid(VarPtr(aryGUID(0))) = 0 Then
GetNewGUID = Mid(StringFromGUID(aryGUID), 7, 38)
End If
End Function
さらに速くなったということはない。そして、ふと、思った。
何の気なしに、VarPtrとかStrPtrとかLongPtrとか使ってるけど、これって本当に大丈夫なのだろうかと。32bitOS+32bitOfficeは問題なかろうと思うけど。
あえて際を行くことはやらなければよいのだろうな。きっと。
0 件のコメント:
コメントを投稿