【问题标题】:COM object in VB 6: user-defined type not definedVB 6 中的 COM 对象:未定义用户定义类型
【发布时间】:2011-08-15 03:43:07
【问题描述】:

在一个 VB6 项目中,我添加了对 COM dll 的引用:c:\windows\system32\locationapi.dll

以下代码运行良好,可以正确访问对象的方法/属性:

Public civicfactory
Set civicfactory = CreateObject("LocationDisp.CivicAddressReportFactory")

但是,它的事件不起作用 - 我无法捕捉它们。我想我需要像这样声明对象:

Public WithEvents civicfactory As LocationDisp.CivicAddressReportFactory

但这给了我错误“未定义用户定义的类型”。

谁能告诉我为什么它这样说,而第一个代码运行良好?

由于我的目的是让事件处理程序正常工作,您能否指出我的代码中的任何错误或缺失的任何内容:

Public civicfactory
Private Sub civicfactory_NewCivicAddressReport(report)
    MsgBox "New civic address report arrived"
    DisplayCivic (report)
End Sub
Set civicfactory = CreateObject("LocationDisp.CivicAddressReportFactory")
civicfactory.ListenForReports (1000)

类似的代码在 VBScript 中工作,但我无法让它在 VB 6 中工作 - 永远不会调用事件处理程序。

提前致谢!

【问题讨论】:

  • 看到上面“ListenForReports”之后IDE插入的那个空间了吗?它对你说:“这里不应该有括号,你知道你在做什么吗?”
  • 正确的名称应该类似于 LocationApiLib.CivicAddressReportFactory

标签: events object com vb6 event-handling


【解决方案1】:

这一行

Public WithEvents civicfactory As LocationDisp.CivicAddressReportFactory 

如果您添加对 COM 类型库的引用(在“项目”菜单上,选择“引用”,然后添加对您的类型库的引用),将起作用

【讨论】:

  • 我确实这样做了:在项目|参考中,我添加了指向 C:\Windows\System32\LocationApi.dll 的“LocationApi 1.0 类型库”。
  • 我想它是正确的 COM 类型库,它是 WinPlatformSDK v7.1 安装的一部分。
【解决方案2】:

我不在 Windows 7 上开发,所以无法测试,但我认为您需要实现 ILocationEvents 接口,然后创建此类的实例并将其传递给您的 ILocation 接口的 RegisterForReport 方法CivicAddressReportFactory 对象。

换句话说,他们根本不费心去实现事件,而是你得到 COM 回调,也就是“脚本事件”。

这是可行的,并且需要使用许多新的 COM 库,因为它们将斜视放在 VB6 和其他 ActiveX 主机上。例如,您必须执行类似这样的愚蠢操作才能在 XP 及更高版本中使用 UPnP 库,以及使用 MSXML Helper 对象的异步请求等。

应受谴责,确实如此。但是您对 Microsoft.Net 有什么期望?

一旦你把它想成是竞争优势。我就是这么做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2016-01-30
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多