Недопустимый вызов процедуры или аргумент при вызове метода COM-Visible с параметром объекта COM-Visible - PullRequest
0 голосов
/ 21 мая 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Перед публикацией этого вопроса я прочитал следующие и их ответы:

  • 2791996 -COM-объекты C # с ошибкой VB6 / asp
  • 4793844 - Передача строго типизированных аргументов в .NET COM Interop

Iнаписал оболочку класса .NET Mail и еще один класс для SmtpClient, чтобы сделать их пригодными для использования в ASP Classic и VB6.

Ниже SMTPSender COM-видимого класса, который переносит SmtpClient и егоинтерфейс (Dual для сохранения раннего связывания):

<Guid("f588b9e7-7107-4f3a-83a9-5e0e8f5297fd")>
<ClassInterface(ClassInterfaceType.None)>
Public Class SMTPSender
    Implements ISMTPSender
    '
    Public Sub sendMail(ByVal mail As MailUtils.Mail) _
        Implements ISMTPSender.sendMail
        ' [...]
    End Sub

<Guid("cfe5e99b-c66a-4afb-8770-c0330994a823")>
<InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface ISMTPSender
    '[...]
    Sub sendMail(ByVal mail As MailUtils.Mail)
    '[...]
End Interface

Ниже объекта COM, видимого для Mail, который обертывает MailMessage и его интерфейс (Dual тоже):

<Guid("d9252161-0731-4e6c-9964-66e4f56b97fa")>
<ClassInterface(ClassInterfaceType.None)>
Public Class Mail
    Implements IMail
    ' [...]
End Class

<Guid("05a149ff-36e4-4905-9193-2fb8d31f5bd8")>
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
Public Interface IMail
    ' [...]
End Interface

Я не могу использоватьISmtpSender.sendMail в VBScript, а также в VB6, если я использую нетипизированные переменные.Ниже блока, в котором возникает проблема:

Dim smtpsender: Set smtpsender = CreateObject("Mailing.SMTPSender")
' [...] SMTP configuration...

Dim mail As mail: Set mail = CreateObject("Mailing.Mail") ' Typed variable
Dim mail2: Set mail2 = New MailUtils.mail                 ' Variant
' [...] mail and mail2 filling...

smtpsender.sendMail mail  ' Success
smtpsender.sendMail mail2 ' Fails "Invalid procedure call or argument"

Я явно назначил GUID для каждого класса и интерфейса и предотвратил автогенерацию интерфейса для каждого класса (ClassInterfaceType.None).Я все еще получаю это сообщение об ошибке.

Однако, окружение аргумента круглыми скобками (на основе ответа вопроса 4793844 ) удаляет ошибку:

smtpsender.sendMail (mail2)

Я не понимаю, почему, поскольку mail2 передается по значению (значение является ссылкой на содержимое объекта, как и в других языках IIRC).

Последнее решение не 't более чистым способом.

Я не могу использовать типизированную переменную, поскольку эти COM-видимые объекты будут использоваться на страницах ASP Classic VBScript , которые работают только с нетипизированными переменными .Что я пропустил, чтобы заставить SMTPSender работать?

...