2011/01/12

access2010 access2007 GUID取得

以前から使ってたのはちょっとなんだから、見直し。
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 件のコメント: