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 件のコメント:
コメントを投稿