首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用API和CopyMemory的MS访问问题

使用API和CopyMemory的MS访问问题
EN

Stack Overflow用户
提问于 2013-11-13 09:48:43
回答 1查看 1K关注 0票数 0

我(再次)遇到了MS Access的问题。例如,如果出现vba代码中的错误,Access有一个有点奇怪的习惯,就是松散对象引用。我找到了一个很好的解决方案,解决了这个问题,这个问题在大多数情况下似乎可行,但有时会导致访问崩溃。

代码语言:javascript
复制
Public CurrentUser As CUser 'CUser is a class containing Userinformation

Private Const C_USER_STORAGENAME As String = "CURRENTUSER_HANDLEID"

Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (destination As Any, source As Any, ByVal length As LongPtr)

Private Const rbHandleProp = C_USER_STORAGENAME

Public Function InitUser() As Integer
    Dim lngUserPtr As LongPtr
    Set CurrentUser = New CUser                    'Cache a copy
    CurrentUser.InitializeUser
    lngUserPtr = ObjPtr(CurrentUser)                'HandleID
    WriteProjProperty rbHandleProp, lngUserPtr      'Write HandleID
End Function

Private Sub WriteProjProperty(key As String, Value As Variant)
    On Error Resume Next
    CurrentProject.Properties(key).Value = Value
    If err.Number = 2455 Then 'No Key!
        CurrentProject.Properties.Add key, Value
    End If
End Sub

Private Function GetCurrentUser(lngUserPtr As LongPtr) As Object
   Dim objUser As Object

   CopyMemory objUser, lngUserPtr, 4 'CRASHES HERE SOMETIMES
   Set GetCurrentUser = objUser
   Set objUser = Nothing
End Function

Public Function ReadProjProperty(key As String) As Variant
    On Error Resume Next
    ReadProjProperty = CurrentProject.Properties(key).Value
End Function

Property Get msCurrentUser() As CUser
    If CurrentUser Is Nothing Then
        Set CurrentUser = GetCurrentUser(CLng(ReadProjProperty(rbHandleProp)))
    End If
    Set msCurrentUser = CurrentUser
End Property

用户对象在启动时初始化一次,并保存句柄。可以通过属性msCurrentUser获取用户信息。正如我说过的,这在大多数情况下都是有效的,但在某些情况下,CopyMemory似乎失败了。任何帮助都将不胜感激。

提前感谢

琼恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-13 10:41:08

说真的,别那么做--这很痛苦,但你只需要根据需要重新创建这个对象。目前,您正在缓存对象引用,即指向内存(*)中特定位置的指针。当未处理的错误导致对象被销毁时,操作系统(或Access的内部内存管理器)不太可能立即重用该对象先前占用的内存(即引用所指向的内存),这就是为什么您的代码有时看起来工作正常。然而,即使当它“工作”时,实际上也是在推迟一个过时的指针。

(*)实际上有多个级别的间接方向,因为Access对象引用是帽下的一个COM/IUnun为人所知的指针,但是简化一个就足够说明问题了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19950462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档