Events VB 6中的COM对象:未定义用户定义的类型

Events VB 6中的COM对象:未定义用户定义的类型,events,object,com,vb6,event-handling,Events,Object,Com,Vb6,Event Handling,在VB6项目中,我添加了对COM dll的引用:c:\windows\system32\locationapi.dll 以下代码运行良好,可以正确访问对象的方法/属性: Public civicfactory Set civicfactory = CreateObject("LocationDisp.CivicAddressReportFactory") 然而,它的事件不起作用-我无法捕捉它们。我想我需要像这样声明对象: Public WithEvents civicfactory As Lo

在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中工作,但我无法使其在VB6中工作-事件处理程序从未被调用

提前谢谢

这条线

Public WithEvents civicfactory As LocationDisp.CivicAddressReportFactory 
如果您添加对COM类型库的引用(在“项目”菜单上,选择“引用”,然后添加对您的类型库的引用),则此行将起作用

Public WithEvents civicfactory As LocationDisp.CivicAddressReportFactory 

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

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

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

这是可行的,并且需要使用许多新的COM库,因为它们将斜视功能放在VB6和其他ActiveX主机上。例如,为了在XP和更高版本中使用UPnP库,为了使用MSXMLHelper对象等异步请求,您必须做一些像这样愚蠢的事情

应该受到谴责,这是真的。但是你对Microsoft.Net有什么期望呢


一旦你解决了这个问题,就把它看作是一种竞争优势。这就是我要做的。

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

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

这是可行的,并且需要使用许多新的COM库,因为它们将斜视功能放在VB6和其他ActiveX主机上。例如,为了在XP和更高版本中使用UPnP库,为了使用MSXMLHelper对象等异步请求,您必须做一些像这样愚蠢的事情

应该受到谴责,这是真的。但是你对Microsoft.Net有什么期望呢


一旦你解决了这个问题,就把它看作是一种竞争优势。这就是我要做的。

我做到了:在Project |引用中我添加了“LocationApi 1.0类型库”,它指向C:\Windows\System32\LocationApi.dll。我想这是正确的COM类型库,它是WinPlatformSDK v7.1安装的一部分。我做到了:在Project |引用中我添加了“LocationApi 1.0类型库”它指向C:\Windows\System32\LocationApi.dll。我想这是正确的COM类型库,它是WinPlatformSDK v7.1安装的一部分。请参阅上面“ListenForReports”后面插入的IDE空间?它对您说:“这里不应该有括号,您知道您在做什么吗?”正确的名称应该类似于LocationApiLib.civicAddressReportFactory看到IDE在上面的“ListenForReports”后面插入的空格了吗?它对您说:“这里不应该有括号,您知道自己在做什么吗?”正确的名称应该类似于LocationApiLib.CivicAddressReportFactory