【问题标题】:Invalid procedure calling .NET DLL method via COM in Classic ASP在经典 ASP 中通过 COM 调用 .NET DLL 方法的无效过程
【发布时间】:2010-08-09 20:37:46
【问题描述】:

当我尝试运行一些 VB6 代码时,我收到以下错误:

Microsoft VBScript runtime error: Invalid procedure call or argument: 'stx.ResolveAddress'

但是,在下面的代码中,如果我没有将返回“stx.ResolveAddress”设置为变量,我不会收到上述错误。

Set stx = CreateObject("MyApp.Api.Wse3.STxTransactionService")
Set addr = CreateObject("MyApp.Api.Wse3.Address")
addr.Address1 = "1850 Table Mesa Dr"
addr.Address2 = "Boulder, CO 80305"
stx.ResolveAddress(addr)

但是,如果我将最后一行更改为如下所示:

result = stx.ResolveAddress(addr)

我收到“无效的过程调用”错误。有什么我想念的吗?为什么赋值会导致错误发生?

【问题讨论】:

  • 您尝试过使用 Set 吗?像这样 Set result = stx.ResolveAddress(addr)

标签: com vb6


【解决方案1】:

我遇到的问题似乎与通过在传递给有问题的函数的参数周围添加一对额外的括号来解决的完全相同的问题,如下所示:

result = stx.ResolveAddress((addr))

4guysfromrolla 上对此进行了讨论。

【讨论】:

    【解决方案2】:
    stx.ResolveAddress(addr)
    

    VB6 中的语法不正确。在参数周围使用方括号仅适用于函数。您必须删除括号,或添加调用或返回变量:

    stx.ResolveAddress addr
    

    Call stx.ResolveAddress(addr)
    

    foo = stx.ResolveAddress(addr)
    

    这就是为什么在分配变量和不分配变量时得到不同结果的原因。

    如果您正在调用 .Net dll 并从 ASP 环境中运行,请确保 .Net dll 已正确安装在 GAC 中(VB6 运行时环境具有一些允许非 GAC 运行的 .Net DLL 的魔力) . DLL 必须在 GAC 中,或者必须经过 RegAsm'd 并安装在与运行应用程序相同的目录中(不确定经典 ASP,但我的猜测是它必须与经典 ASP 进程在同一个 DLL 中运行)。

    【讨论】:

    • Kris,当我尝试运行“foo = stx.ResolveAddress(addr)”之类的东西时,我收到“无效的过程调用”错误。还有其他方法,我应该分配“foo”吗?
    • 我认为他在示例result = stx.ResolveAddress(addr) 中使用了正确的变量赋值语法。 DLL好像被asp找到了,因为没有返回值的调用成功了。
    • 编辑:Kris,因此查看 DLL 生成的一些日志记录,似乎确实调用了没有分配给变量的“stx.ResolveAddress(addr)”。
    • 返回的“结果”类型是什么?接下来的想法是应该设置 result = stx.ResolveAddress(addr) ,其中 result 是一个对象。你可以在.Net中发布ResolveAddress函数的签名吗?
    • 您的意思是类似于“将结果作为对象变暗”、“result = stx.ResolveAddress(addr)”吗? .NET 签名是“public ResolveAddressResult ResolveAddress(Address a)”。没什么太复杂的。
    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 2010-09-18
    • 2013-03-04
    • 2012-05-01
    • 1970-01-01
    • 2013-08-24
    • 2010-12-15
    • 2019-01-16
    相关资源
    最近更新 更多