- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个引用 COMSVCSLib 的 VB6 项目,其中一种方法调用 COMSVCSLib 的 SharedPropertyGroupManager.CreatePropertyGroup 传递 锁定方法 和 进程作为参数。
清理 VB6 代码:
Dim groupName As String
Dim spmMgr As COMSVCSLib.SharedPropertyGroupManager
Dim spmGroup As COMSVCSLib.SharedPropertyGroup
Dim bGroupExists As Boolean
Set spmMgr = New COMSVCSLib.SharedPropertyGroupManager
With spmMgr
Set spmGroup = .CreatePropertyGroup(groupName, LockMethod, Process, bGroupExists)
End With
typedef enum {
LockSetGet = 0,
LockMethod = 1
} __MIDL___MIDL_itf_autosvcs_0469_0002;
最佳答案
免责声明 :我不是 IDL(接口(interface)定义语言,它是用于定义 COM 类型的语言)或 Microsoft IDL 编译器 (MIDL) 的专家,但在玩弄 scrrun 的类型库后,我得出了以下结论。 dll,它与枚举有类似的问题。从快速浏览这篇关于 IDL 和 VB6 的 DevX 文章中收集到的一些信息:IDL for VB Tutorial
VB6 期望实际的枚举具有名称,而不仅仅是 typedef
的枚举。想要一个名字。 __MIDL___MIDL_itf_autosvcs_0469_0002
name 是一个占位符,因为原始类型库没有在同一个 typedef
中定义枚举名称。其中定义了枚举常量。
当您在 OLE 查看器中查看类型库时,enum
大概是这样的:
typedef [public] __MIDL___MIDL_itf_autosvcs_0469_0002 LockModes;
typedef enum {
LockSetGet = 0,
LockMethod = 1
} __MIDL___MIDL_itf_autosvcs_0469_0002;
typedef
创建公共(public)名称
LockModes
作为自动生成
MIDL___MIDL_itf_autosvcs_0469_0002
的别名
enum
的名称.编译原始类型库时,
midl
编译器生成了长
__MIDL
原名
enum
并自动创建了一个
typedef
别名指向它。
typedef enum {
LockSetGet = 0,
LockMethod = 1
} LockModes;
midl
编译器处理
enum
以这种方式编写的定义,它会自动为
enum
生成一个名称。 (因为它丢失了 - 它应该出现在
enum
关键字之后)。这是什么
__MIDL
name 是您在 OLE 查看器中查看类型库时看到的名称。
midl
编译器还会自动生成第二个
typedef
别名
typedef
自动生成的名称
enum
姓名。
typedef
中(即你给
enum
一个名字,以及命名
typedef
):
typedef enum LocksMode {
LockSetGet = 0,
LockMethod = 1
} LocksMode;
typedef
与 C 或 C++ 的方式相同:您不必为枚举本身命名,因为
typedef
已经有一个名字,但如果你愿意,你可以给枚举一个名字。换句话说,
typedef
和
enum
实际上是两个独立的实体。 VB6 恰好能识别
typedef
和
enum
因为是两个不同但关联模糊的事物,所以在您的情况下,它会看到
typedef
命名
__MIDL___MIDL_itf_autosvcs_0469_0002
,它看到这是一个未命名枚举的别名,它也看到了
typedef
为
LockModes
,这是另一个
typedef
的公共(public)别名.
typedef
是公开的,您将看到
LockModes
的条目在对象浏览器中,并且因为它是枚举的别名,您还将在对象浏览器中看到枚举常量。但是,实际的枚举本身没有名称(因此它会在浏览器中获得分配给它的时髦的自动生成的名称),并且 VB6 无法使用该枚举,因为自动生成的名称在 VB6 中恰好是非法的(带有双下划线的名称在 VB6 中自动隐藏)。
MsgBox COMSVCSLib.[__MIDL___MIDL_itf_autosvcs_0469_0002].LockMethod
enum
关联的实际名称。 (记住另一个
typedef
只是这个“真实”的别名,但自动生成的名称,VB6 显然不能把所有的部分放在一起来实现这两个名称指的是同一个
enum
)。
enum
以库名作为前缀来定义常量,例如,
COMSVCSLib.LockMethod
应该管用。我不太清楚为什么这实际上有效,而且我不确定如果两个不同的
enum
会发生什么情况's 定义具有相同名称的常量。
enum
。带有单个
typedef
的 typedef每个
enum
这只是给出了
enum
和
typedef
相同的名称(即
typedef enum LockModes { ... } LockModes;
),但由于 OLE 查看器不一定生成有效的 IDL,因此您可能需要对其进行更多调整才能使其实际编译。如果你可以让它工作,那么你可以引用你的自定义
.tlb
来自您的 VB6 项目(而不是
COMSVCSLib
库)和
enum
's 将像您期望的那样工作。
midl.exe
: 这个工具可以从 .idl
生成一个 typelib 文件 (*.tlb)文件。因此,您可以将 IDL 从 OLE 查看器复制到记事本中,如上所述修改枚举定义,将其保存为 .idl
文件,并将其传递给 midl.exe
制作一个新的类型库:midl my-custom-typelib.idl
regtlib.exe
:此工具可以注册一个 .tlb 文件,如果您希望能够将其添加为对 VB6 项目的引用,则需要该文件:regtlib.exe my-custom-typelib.tlb
关于vb6 - 为什么 TypeLib 枚举不在 Visual Basic 6.0 中公开为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3764124/
尝试解析TypeLib注册表项下的文件路径时,我看到了几个(并非全部)注册表值,如下所示: HKEY_CLASS_ROOT\TypeLib\\{EE9CFA8C-F997-4221-BE2F-85A5
这个问题已经有答案了: MS Access VBA Error: Run time error '70' Permission Denied (3 个回答) 已关闭 6 年前。 我的代码有一个问题,似
我有一个 Delphi7。 我用这篇文章:http://www.delphidabbler.com/articles?article=22&part=2/步骤2 现在,我用 LoadTypeLib 创
在 asking about what Visual Studio does to register a COM Library 之后,很明显 VS 为 COM 注册做了两件事: 注册 COM 库 创
我最近需要制作一个互操作程序集。经过一番谷歌搜索后,我发现 tlbimp.exe .我的下一个问题是我的 COM 库没有提供 .tlb文件。进一步的谷歌搜索显示,类型 lib 通常作为资源包含在 ex
即使 TypeLib 完全为空,是否可以找到通常使用组件对象模型 (COM) TypeLib 注册的所有接口(interface)(类、参数等)?如果是这样,你会怎么做?我相信另一个术语是“匿名 CO
我有一些进口: gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk
使用 VC2005,我有 3 个项目要构建: libA(包含类型库,生成 libA.dll):IDL 有一行 library libA { ... libB(包含导入 libA 的类型库,生成 lib
我正在编写 XPCOM 组件。我有我的 idl 文件,它非常简单,仅包含以下内容: #include "nsISupports.idl" [scriptable, uuid(4ead-ba5c-49c
我将“更好”放在引号中,因为这是一个定性问题。几年来我一直在编写 COM DLL,直到最近才发现并成功使用了带有 Typelib 概念的标准 DLL。 使用 COM DLL 代替 DLL+Typeli
我正在我的树莓派上构建 gstreamer 最新版本。我想要 python 绑定(bind),因此在编译 gstreamer 及其插件之前安装了 gobject-introspection-1.0 和
首先声明,我不是 COM 开发人员。我了解标准的 C++、C# 和 Java。 我有一个将从托管 C++ 调用的 C# 库。我使用 Visual Studio 2010 添加了 C++ 类 --> 来
我的公司已经创建了几个 COM 对象,并且他们在 .NET 中愉快地使用它们。但是现在,我们的客户想换成Java。我认为将 JACOB 或 j-interop(我不确定是哪一个)用于某些任务会很有趣,
我已经为我的 VS-2019 Porfessional 安装了所有 MFC 的东西。 我想念以前版本中用于创建简单 IDispatch 包装器的添加新项“来自 Tyspelib 的 MFC 类”。 我
我希望有人能指出我正确的方向。我分几个步骤列出了问题,希望能澄清问题。 我使用 将 C++ DLL 注册到 COM regsvr32 . 然后我使用 tlbimp 与 /主要 C++ DLL 上的属性
我有一个引用 COMSVCSLib 的 VB6 项目,其中一种方法调用 COMSVCSLib 的 SharedPropertyGroupManager.CreatePropertyGroup 传递 锁
我目前正在将 ASP 平台从 Windows 2003 R2 IIS 6 网络服务器迁移到 Windows 2012 R2 IIS 8.5 网络服务器。我正处于将多个站点迁移到两个独立的 2012 年
2010 年之前的 Delphi 版本在 Delphi 环境中有一个可以设置的选项:“所有 v-table 接口(interface)”。这将改变导入类型库时的调用约定。 2010年,这个选项消失了。
我正在尝试为来自 https://bugzilla.gnome.org/show_bug.cgi?id=680569 的 meld 应用补丁我自己,我遇到了这个问题: $ git clone git:
我有一个仅 64 位的 COM DLL,我想使用 heat.exe 从中获取 typelib 信息。但是当我尝试这样做时,我收到错误 193(错误的可执行格式)。 heat.exe 是否仅限 32 位
我是一名优秀的程序员,十分优秀!