VB6 和 COM:不能在 COM 函数中使用用户定义的类型参数

发布于 2024-11-29 16:51:42 字数 463 浏览 0 评论 0原文

我在 VB6 中使用 COM 对象。 COM 对象有一个函数 Foo(Long, Long, Rect)。矩形是在 COM 对象实现中定义的结构。我的 VB6 代码(表单上的按钮)如下所示:

Private Sub btnTestCom_Click()
    Set ComObj = CreateObject("ObjectName")
    Dim rect As DISPLAY_RECT

    rect.Left = 20
    rect.Top = 20

    ComObj.Foo(101, 0, rect) ' Error here
End Sub

在最后一行,它给了我这个编译错误: “只有在公共对象模块中定义的用户定义类型可以强制到变体或从变体强制转换或传递到后期绑定函数”。

其他没有用户定义类型参数的 COM 函数可以正常工作。

我该如何解决这个问题?

谢谢。

I am using a COM object in VB6. The COM object has a function Foo(Long, Long, Rect). Rect is a struct defined in the COM object implementation. My VB6 code (a button on a form) is like below:

Private Sub btnTestCom_Click()
    Set ComObj = CreateObject("ObjectName")
    Dim rect As DISPLAY_RECT

    rect.Left = 20
    rect.Top = 20

    ComObj.Foo(101, 0, rect) ' Error here
End Sub

At the last line it is giving me this compilation error:
"Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions".

Other COM functions that do not have user-defined type parameters are working fine.

How do I solve this problem?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我纯我任性 2024-12-06 16:51:42

该函数调用是后期绑定,因为您的变量ComObj未输入。您可以尝试声明它,例如

Dim ComObj As SomeObjectDefinedInComImplementation 

EDIT

我还会检查您实际上是否正在使用 COM 库中的 DISPLAY_RECT 。打开对象浏览器(按 F2)并在所有库中搜索 DISPLAY_RECT

  • 如果您只看到一个结果,请检查它是否来自正确的 COM 库。
    • 如果它来自正确的 COM 库,则一定存在另一个问题。
    • 如果来自错误的 COM 库:检查您是否确实引用了正确的库(在项目引用中)。如果您确实已经引用了它,请仔细检查您是否确实应该传递 DISPLAY_RECT
  • 如果您看到多个结果,则 VB6 可能选择了错误的库。尝试使用库名称显式限定 DISPLAY_RECT Dim rect As TheCorrectLibraryName.DISPLAY_RECT

The function call is late-bound because your variable ComObj is not typed. You could try declaring it, something like

Dim ComObj As SomeObjectDefinedInComImplementation 

EDIT

I would also check that you are actually using the DISPLAY_RECT from the COM library. Open up the object browser (press F2) and search all libraries for DISPLAY_RECT.

  • If you only see one result, check whether it's from the correct COM library.
    • If it's from the correct COM library, there must be another problem.
    • If it's from the wrong COM library: check whether you actually have the correct library referenced (in project references). If you definitely do already have it referenced, double-check whether you really are supposed to pass a DISPLAY_RECT
  • If you see multiple results, VB6 may be picking up the wrong library. Try explicitly qualifying the DISPLAY_RECT with the name of the library Dim rect As TheCorrectLibraryName.DISPLAY_RECT
奢华的一滴泪 2024-12-06 16:51:42

假设 DISPLY_RECT 是一种类型,则无法将类型传递到公共 COM 方法或从 VB6 中的公共 COM 函数返回类型。您必须创建一个复制该类型的类,以及一个将该类作为参数并返回该类型的辅助函数。

Assuming DISPLY_RECT is a type, you can't pass types into a public COM method or return a type from a public COM Function in VB6. You will have to make a class duplicating the type, and a helper function that takes the class as a parameter and returns the type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文