问题标签 [typelib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2480 浏览

vb6 - 为什么 TypeLib 枚举在 Visual Basic 6.0 中不作为枚举公开?

我有一个引用 COMSVCSLib 的 VB6 项目,其中一种方法调用 COMSVCSLib 的 SharedPropertyGroupManager.CreatePropertyGroup,并将LockMethodProcess作为参数传递。

清理VB6代码:

几年来没有使用 VB6,起初我认为 LockMethod 和 Process 是在项目的其他地方定义的变量或常量。

在对对象浏览器进行了一些研究之后,我发现它们都在 COMSVCSLib 中作为常量公开。

对象浏览器

但是查看它们在 OLE/COM 对象查看器中的定义,它们似乎被定义为枚举的值:

为什么 COMSVCSLib 中的 IDL/TypeLib 枚举不作为枚举暴露给 Visual Basic 6.0?

0 投票
3 回答
4640 浏览

c++ - 有什么方法可以解决 C4772 错误而无需注册 DLL?

我正在维护一个 VS2010 项目,其中包含许多交叉引用的 COM 库。我正在尝试以可以从安装了 VS2010 的随机工作站构建的方式配置项目。工作站可以是 32 位和 64 位的,所以如果我将项目配置为“注册输出”,则构建将无法在 32 位机器上构建,因为无法加载 64 位 DLL 来调用 DllRegisterServer。

这是一个示例:项目 B 中的 Typelib 引用了项目 A 中的 typelib。项目 C 将通过以下语句引用项目 B:

由于库 B 引用 A,当 B.tlb 被导入时,编译器会尝试从 A 加载类型。因此,如果 A 未注册,编译将失败并显示:

我尝试使用 OleView 应用程序打开 B.tlb,如果使用 regsvr32 注册,它肯定只显示库 A 引用的正确文件名。

所以,我的问题是:是否有任何替代方法可以让库引用正确解析,而无需注册 TLB,只需将所有文件以某种方式放在同一目录中,或附加某种清单?例如,将库的 TLB 重命名为 .tlb 或类似的名称。

0 投票
1 回答
1053 浏览

delphi - 奇怪的错误“Tmyclass 类缺少类型信息”

在类似行的 Impl 单元的 Delphi 初始化部分内的调用中出现此错误。

类型定义为

并最终导致“运行时错误 217 at ....”在调试器之外运行它。

此类在 1 个项目中定义并且工作正常。在另一个使用它并且依赖它的项目中,它因这个错误而爆炸。

谁能告诉我要寻找什么?这是已经投入生产一段时间的代码,但自 01/2009 以来没有人的机器被设置为编译它,我第一次在 Delphi 7 中这样做,之前是 Delphi 6。

0 投票
1 回答
495 浏览

com - COM Outlook 插件功能区按钮在韩语 Outlook 2010 中没有响应

我有一个 COM Outlook 插件,它在 Outlook 2010 中实现了一个功能区按钮。它已经运行了很长一段时间。直到有人试图在韩语版 Outlook 中加载插件。功能区按钮显示,但单击时不执行任何操作。在调试器中,每当我单击功能区按钮“错误:无法加载 Typelibrary。(HRESULT = 0x8002801d)验证 TypelibID 和使用 IDispatchImpl、CStockPropImpl、IProvideClassInfoImpl 或 IProvideCLassInfo2Impl 指定的主要版本”时,我都会看到下面的错误消息。

我从来没有在这个按钮的回调中达到我的断点,所以我认为我的代码上方的事件层发生了一些事情。但我不知道是什么,也不知道为什么使用韩文版的 Outlook 会有什么不同。有人有想法么?

我认为它与定义我的主插件支持的接口时使用的 LIBID_Office 宏有关:

宏定义为

0 投票
1 回答
555 浏览

c++ - Visual C++ 错误:“标识符“IMSNMessenger”未定义” - 添加 tlb 文件后

我正在学习使用 MSN Messenger API。

添加 tlb 文件并复制/粘贴一些示例代码后,我注意到在 Visual c++ IDE 中它告诉我一个未定义的标识符。

虽然一旦我编译了代码,一切正常。

我看到了问题:问题在于 IDE(更具体地说是智能感知)无法识别 tlb 文件中的任何内容。

但是,编译器可以!

我这样添加了 tlb 文件:

这里有什么想法吗?谢谢!

编辑:我可以补充一点,IDE 确实可以识别以下内容:

但不仅仅是

0 投票
2 回答
402 浏览

.net - COM/.NET 接口名称中的非字母数字字符

我正在考虑使用字符#@!在我们的系统生成的一些 COM 接口中。COM 类型库也导出到 .NET。这些角色以后会给我带来麻烦吗?

我今天大部分时间都对其进行了测试,一切似乎都很好。我们的系统会像往常一样继续工作。

我谨慎的原因是这些字符在 MIDL 中是非法的,它使用 C 语法作为类型名称。但是我们不使用 MIDL - 我们使用 ICreateTypeInfo 和 ICreateTypeLib 构建我们的类型库。看起来这只是 MIDL 限制,COM 和 .NET 对非字母数字字符感到满意。但也许有一些我不知道的...

0 投票
1 回答
5912 浏览

com - 如何在命令行上从 COM exe 中提取 TypeLib

我最近需要生成一个互操作程序集。经过一番谷歌搜索后,我发现tlbimp.exe. 我的下一个问题是我的 COM 库没有附带.tlb文件。进一步的谷歌搜索显示类型库通常作为资源包含在 exe/dll 中。果然,在 VS2010 中打开 exe 显示它是 lib 类型,然后右键单击我有一个 tlb 文件可以与tlbimp. 惊人的。

然而,这不是一个很好的过程。我将来是否需要这样做,有没有办法使用命令行从 .exe 中提取类型库(.tlb 文件)?

0 投票
1 回答
171 浏览

com - 使用 #import 指令导入 COM 类型库时临时使用 #undef 宏

我正在尝试在 C++ 中使用 COM 库。我有一个#import "TheLibrary.dll",它使用库中的类创建 tlh 和 tli 文件。

现在,我的问题是 COM 对象公开了一些枚举,其中包含一些常量列表的值,这些常量列表也在 Windows SDK 标头中。我认为这是因为 Visual Basic 开发人员已经命名了这些常量的变体,而不必使用它们的数值。

但这对我来说是个问题,因为这些头文件是在我的 typelib 被 #import'ed 之前包含的;所以现在枚举成员声明被替换为 windows 头文件中的数字常量,导致我的编译失败。

例子:

windows头文件:

生成的 tlh:

所以问题很明显;tlh 中的枚举被扩展,结果是尝试将常量分配给数字。

现在我看到了几种解决方案,它们都没有吸引力:

  • 在#import 时对每个项目进行“重命名”。有数百个这样的常数,不期待。

  • 一起省略枚举。这会严重削弱我对 COM 对象的访问(我还没有尝试过,也许整个库甚至会变得不可用)。

  • 在#import 之前对所有这些常量执行#undef。同样,它们有数百个,除此之外,我以后将无法使用它们-除非我再次执行#define ...

所以我在这里有点不知所措。我希望有一种方法可以对枚举值进行大规模重命名,但#import 指令的文档并没有给我太多希望。

剩下的几个 COM 程序员有什么想法吗?谢谢。

0 投票
1 回答
1037 浏览

com - 从 TLB 导入的接口上的进程外 COM 服务器的 QueryInterface

我在 A.idl 文件中定义我的接口,我将其编译为 A.tlb

在 VS2005 ATL 项目“B”中,我在 B.idl 中使用 importlib(A.tlb),在 stdafx.h 中使用 #import“A.tlb”,并在 ATL COM 类中从 A.tlb 实现接口 IA。该项目输出一个 B.dll 和一个 B.tlb

我将 B.tlb 添加到 C# 应用程序的引用中,并在代码中实例化 COM 对象。

如果我使用任何一个,实例化工作没有问题

或者

两者都工作正常,对象实例化,我可以将其转换为 A.tlb 中定义的 IA 接口(实际上是从 tlb 生成的 RCW)并调用其方法。仍然没有问题。

然后我使用 OLEView 使用默认的 DllHost.exe 代理启用 COM 对象激活。

代理中 COM 对象的实例化(CoCreateInstance 中的参数 CLSCTX_LOCAL_SERVER)仍然没有问题,但是当我尝试将对象强制转换为 A.tlb 中定义的 IA 接口时,我得到 E_NOINTERFACE和一条消息说 QueryInterface 失败,因为“没有这样的支持接口”。

请帮忙。有什么问题?如果您需要任何其他信息,我会尽量提供。

0 投票
4 回答
101939 浏览

windows-7 - 如何在 Windows 7 上注册旧类型库 (.tlb)?

我有一台运行 Windows 7 和 Visual Studio 2010 的新 PC,需要注册一个旧的 typelib (.tlb) 以与现有的旧应用程序交互。但是,regtlib.exe 似乎不是 Windows 7 的一部分(我也不认为它是 Vista 的一部分),并且作为 Visual Studio 2005 的一部分提供的regtlibv12.exe 似乎在 Visual Studio 2008 中消失了(当然还有 Visual Studio 2010)。

Microsoft 论坛和知识库文章参考 RegAsm.exe。我已经尝试过 RegAsm.exe,但这只会从现有的 dll 或程序集(我没有)创建和注册类型库。我不敢相信没有办法在 Windows 7 上注册现有的类型库。任何帮助将不胜感激。