64位Access 2010下的StringFromGUID2

Posted

技术标签:

【中文标题】64位Access 2010下的StringFromGUID2【英文标题】:StringFromGUID2 under 64 bit Access 2010 【发布时间】:2012-07-23 08:06:53 【问题描述】:

我以前使用过:

Public Declare Function StringFromGUID2 Lib "ole32.dll" _
    (rclsid As GUID, ByVal lpsz As Long, ByVal cbMax As Long) As Long

在 32 位和 64 位 Windows 上的 Access 2007 下为我生成 GUID。

其中 GUID 定义为:

Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

(因为 VBA 不支持变体的 VT_GUID)

我现在有一台安装了 Access 2010 64 位的新机器,但这些东西现在坏了。

在 Access 2010 64 位下执行此操作的等效代码是什么?

我已按要求添加了 PtrSafe 属性:

Public Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" _
    (rclsid As GUID, ByVal lpsz As Long, ByVal cbMax As Long) As Long

这会导致实际调用中的类型不匹配:

Dim rc As Long
Dim stGuid As String
' 39 chars  for the GUID plus room for the Null char
stGuid = String$(40, vbNullChar)
rc = StringFromGUID2(rclsid, StrPtr(stGuid), Len(stGuid) - 1)

这是意料之中的,因为 StrPtr 将在 64 位系统上返回 LongPtr,在 32 位系统上返回 Long。

我不是全职开发人员,因此我不确定在 32 位和 64 位系统上创建 GUID 字符串的最合适方法是什么。

【问题讨论】:

【参考方案1】:

StringFromGUID 可用于 Access 应用程序。

Application.StringFromGUID Method (Access)

您甚至可以在查询中使用它。

【讨论】:

嗨 Remou,我如何定义 GUID?如果我使用之前使用的 GUID 的定义,我会收到一条关于强制的错误消息:“只有在对象模块中定义的用户定义类型才能强制转换为变量或从变量强制转换或传递给后期绑定函数。 我完全不确定你在做什么,但看看这是否有兴趣:msdn.microsoft.com/en-us/library/aa172214(v=office.11).aspx 您不确定的是我必须生成 GUIDS,而不仅仅是读取它们。我见过的所有示例基本上都使用了已经有 GUID 的控件。我需要生成新的 GUID。 为此,我使用 CoCreateGUID 函数: Public Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" _ (vCLSID As GUID) As Long 需要在原始帖子中定义的 GUID(作为用户定义类型) 我在 Access 2010 x64 中使用了此代码 support.microsoft.com/kb/176790,它适用于我。

以上是关于64位Access 2010下的StringFromGUID2的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ODBC 驱动程序将 Java 程序连接到 Access 2010 数据库

使用 c# 在 32 位和 64 位窗口中打开 ms-access .mdb

关于Win7 64位系统通过ODBC访问Access的一点经验

win7 64位专业版下的x64编译问题

asp程序连接Access数据库网站打开“数据库连接出错,请检查连接字串!”

将 32 位 VB.Net 连接到 64 位 Access .ACCDB