我正在尝试重新创建一个程序,该程序使用 javascript 打开与 PLC 的连接,然后在网页上显示各种信息。由于各种原因,我宁愿在 MS Access 中以某种形式使用它,并且一直在努力寻找正确的 dll 来使用(Jet32X.dll,如果有人好奇的话)。我最终将在 javascript 中调用的 CLSID 跟踪到 PLC 的注册类,并且我正在尝试在 VB 代码中创建该对象。但是,它不会比 Dim As New 行更进一步,但会引发运行时错误 429:“Active X 组件无法创建对象”。真的希望我有更多关于原因的信息。
我知道该课程已注册,因为这就是我首先找到它的方式。我知道 DLL 文件没有损坏,因为程序从 JS 版本运行良好。我偷偷怀疑这里发生了某种不兼容,因为 PLC 和支持软件已经很老了,而且我正在使用 Microsoft Access 2013(及其相关的 VBA)。但是,我真的想不出一个好的方法来验证这一点。有没有人有任何其他想法?有什么其他原因会导致这个问题吗?
2 回答
我发送一个新的回复只是为了回顾一下信息,并避免在我浪费了宝贵的时间之后再次遇到同样问题的人。所涉及的所有步骤都假定您已经正确注册了您尝试使用的 dll。
如何使 32 位 COM Dll 在 64 位应用程序中工作
“简单”的解决方案包括使用 Dll Surrogate 方法,该方法运行 dllhost.exe 并作为 64 位的中间进程来公开底层的 32 位 dll。如果正确完成,则无需在 32 位 dll 或 64 位应用程序中采取任何特殊措施即可无缝工作。
有两种主要方法:
使用 Oleview.exe(即使用 GUI)
Oleview 可以通过下载 Window 10 SDK 获得。为了使用 Oleview,您必须:
- 在以下链接下载 Window 10 SDK: https ://developer.microsoft.com/en-us/windows/downloads/windows-sdk/
- 去
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86找到oleview.exe的32位版本 - 仅第一次:以管理员身份运行,以避免看到与无法加载 iviewer.dll 相关的消息
- 在左窗格中,
Object Classes -> All Objects找到您的 dll 名称。
- 警告:您可能会为您的 dll 找到许多条目。特别是每个类都有自己的条目,例如 YourProjectName.YourClassName
- 在右侧窗格中,转到
Implementation -> Inproc Server并勾选Use Surrogate Process。留空Path to Custom Surrogate以使用系统默认代理,即 dllhost.exe。
- 您可以通过返回
Registry选项卡来检查过程是否正确,始终在 Oleviewer 的右窗格中,并确保现在在CLSID = {yourAppIdHere} [DllSurrogate] =条目中列出。
手动编辑 Windows 注册表
推荐使用 Oleview 方法,但如果您只需要执行一次,手动方法可能没问题。NickGlowsinDark 提到的教程已移至https://techtalk.gfi.com/32bit-object-64bit-environment/。为了避免将来页面脱机时出现问题,我在此处复制并粘贴所涉及的最重要的步骤。所有功劳归于本教程的原作者 Emmanuel Carabott,我添加了前两个步骤以便在此过程中为您提供便利。
打开注册表编辑器(Windows+R -> regedit),然后按照以下步骤操作:
- 您首先需要找到您的 dll GUID。您可能会有许多 GUID,一个用于您的 dll 导出的每个类。我发现如果您转到
HKEY_CLASSES_ROOT\YourProjectName.YouClassName. 它是您在键(Default)下找到的字符串值。Clsid
- 我建议您首先找到所有 GUID 并记下它们,以便更轻松地执行此步骤之后的步骤。
然后,正如 Emmanuel Carabott 在他的文章中所解释的那样,您必须对找到的每个 GUID 执行以下操作:
- 在下面找到您的 COM 对象 GUID
HKey_Classes_Root\Wow6432Node\CLSID\[GUID] - 找到后添加一个新的
REG_SZ (string) Value. 名称AppID和数据应该与您刚刚搜索的 COM 对象 GUID 相同。
- 在新密钥下添加一个新
HKey_Classes_Root\Wow6432Node\AppID\密钥应该与com对象GUID相同 - 在刚刚添加的新键下,添加一个新的
REG_SZ (string) Value,然后调用它DllSurrogate。将该值留空。
- 在下面创建一个新键
HKey_Local_Machine\Software\Classes\AppID\,新键的名称应与 COM 对象的 GUID 相同。无需在此键下添加任何值。
就是这样,您的 COM 对象现在应该可以从 64 位环境访问,并且可以像常规 COM 对象一样使用。






