2011-04-29 113 views
1

在我已经加入参考COM DLL一个VB6项目:C:\ Windows \ System32下\ locationapi.dllCOM对象:用户定义的类型没有定义

下面的代码工作得很好且对象的方法/属性可以正确访问:

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个工作 - 事件处理程序永远不会被调用。

在此先感谢!

+0

看到IDE在上面的“ListenForReports”之后插入的空格?它对你说:“这里不应该有括号,你知道你在做什么吗?” – Bob77 2011-04-29 05:19:09

+0

正确的名称应该类似于LocationApiLib.CivicAddressReportFactory – 2011-04-30 19:46:01

回答

1

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

换句话说,他们根本没有执行任何事件,而是获得COM回调,也就是“脚本事件”。

这是可行的,并且需要使用很多新的COM库,因为他们把斜视放在VB6和其他ActiveX主机上。例如,你必须做这样的愚蠢事情才能在XP和更高版本中使用UPnP库,使用MSXML Helper对象进行异步请求等。

可以理解,足够正确。但是,您对Microsoft.Net有什么期望?

认为它是竞争优势一旦你得到它的工作。我就是做这个的。

0

此行

Public WithEvents civicfactory As LocationDisp.CivicAddressReportFactory 

如果添加了一个参考COM类型库(在项目菜单,选择引用,并添加引用到你的类型库)将工作

+0

我做到了这一点:在Project | References中添加了指向C:\ Windows \ System32 \ LocationApi.dll的“LocationApi 1.0类型库”。 – Charlie 2011-04-29 03:51:17

+0

我想这是正确的COM类型库,它是WinPlatformSDK v7.1安装的一部分。 – Charlie 2011-04-29 03:54:03