【问题标题】:Calling function of Exe project in referenced aticvex project in vb6vb6中引用的aticvex项目中调用exe项目的函数
【发布时间】:2022-01-14 21:40:33
【问题描述】:

vb6中引用的aticvex项目中调用exe项目的函数

我在 VB6 中有一个 AtiveX 项目(姑且称之为 A)

我在 VB6 中有另一个 Exe 项目(我们称之为 B)

项目 B 中引用了项目 A

但现在我有一个要求,我想在 A 中调用 B 的函数

有没有办法我们可以在 VB6 中做到这一点?

如果是,我需要搜索什么。已经尝试在 Google 上搜索,但不确定我能否解释要搜索的内容

由于我在 VB6 上工作不多,所以我有点卡在这里该怎么办

【问题讨论】:

  • 一个 ActiveX exe 可以解决问题(循环引用!)或另一个具有项目 A 和 B 的所有常见过程的 VB 项目。
  • 补充@Smith所说的:这取决于B中的功能 做什么。即它是否直接影响B(的数据)的状态还是“只是”一个返回值的函数,然后可以在其他地方使用,如果是后者,您可以创建一个单独的ActiveX DLL并将oit移到那里,这样 A 和 B 都可以引用该 DLL。 I如果是前者,Win32 API还提供了MailslotsNamed Pipes等几种方法。
  • 我建议将该功能移至 A。这样 A 和 B 都可以使用它。

标签: vb6 exe activex


【解决方案1】:

首先让我说,当您遇到此问题时,通常表明代码组织可以改进。也许 A 中的某些模块实际上应该在 B 中,或者它们可以以更模块化的方式分解以解决问题。我首先鼓励您以这种方式思考问题。

也就是说,有一些技术方法可以做你想做的事,我在下面推荐了一些例子。


一种方法是利用接口。接口由 A.dll 提供,实现它的类由 B.exe 提供。

这是粗略的伪代码,只是为了勾勒概念。

在项目 A 内:

创建一个来充当接口(称为ISample)。在ISample 中至少定义了一个子函数或函数,因此您将拥有ISample.SomeProcedure

在项目 A 的其他地方,您需要一些属性或过程 SomeClassInA.RunSampleFunction,它将接受 ISample 类型的对象,然后调用 SomeFunction

在项目 B 内:

创建另一个类SampleImplementation 其中Implements ISample 接口。这意味着它将具有SomeFunction 的实际具体实现。

从 B 中创建一个 SampleImplementation 类型的新对象,然后将其传递给 A 中的代码:

Dim impl As SampleImplementation
Dim objectFromA As SomeClassInA

Set impl = New SampleImplementation
Set objectFromA As New SomeClassInA

' Pass the object from B to A, where A can call its methods:
objectFromA.SomeProcedure impl

这避免了循环引用,并且是我以前使用过的一般面向对象的模式。不过我会注意到,VB6 中的接口概念有一些您必须忍受的烦恼,但对于这样的事情,它可能是一个很好的工具。


另一种方法是在 A 中创建一个公开事件的类。然后,您可以使用 WithEvents 在 B 中声明该类的对象并将事件处理程序附加到该类。事件处理程序只是一个存在于 B 中的过程,但现在可以被 A 调用。

VB6 中的事件也有一些限制(特别是 WithEvents 对象必须在全局范围 IIRC 内),但您通常也可以忍受/解决这些问题。


接口方法可能更通用,也是在 A 和 B 之间共享信息的更强大的方法,但事件方法可以更快地开始工作。很大程度上取决于您需要完成的具体内容。

【讨论】:

  • 我收到此错误“属性或方法调用不能包含对私有对象的引用”
  • 您需要发布更多信息以了解错误
  • 我已经实现了你在解决方案中提到的接口,我在“objectFromA.SomeProcedure impl”这一行得到错误
  • 对这些信息有什么想法吗?
  • 我认为这意味着 CLASS impl 必须是公开的
猜你喜欢
  • 1970-01-01
  • 2022-07-25
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多