2

従来の ASP エキスパートの皆様、こんにちは。

基本的に、私はクラシック ASP と VBScript を初めて使用し、複雑な型の引数を COM メソッドに渡そうとしたときに、この「VBScript ランタイム エラー: 無効なプロシージャ コールまたは引数」が発生しました (下のスクリーンショットを参照)。サーバー オブジェクトが作成され、文字列が COM メソッドに渡される間、複合型の引数を渡そうとしても無駄になります。

助けてください。

コード スニペットは次のとおりです。

ClassicASPHome.asp ページの VBScript (サーバー側):

<%
response.write("My first ASP script!")  

set co = Server.CreateObject("ClassicASPCOM.ComplexObject")

co.Message = "Messi"
co.Number = 100


Dim ccom
Set ccom = Server.CreateObject("ClassicASPCOM.ClassCOM")


response.Write(ccom.GetMessage("1234567890"))

--------------- ここまでは問題なく動作します

Dim ret

' ---------------次のステートメントはエラーをスローします

ret = ccom.PaymentDetails(co)

response.Write("Fine")

コード スニペット (C#):

// C# Code (ClassicASPCOM.dll) built with Strong Name and Registered for COM Interop:

// Executed the following in Visual Studio Command Prompt in bin\Release folder
// Regasm ClassicASPCOM.dll

// Regasm ClassicASPCOM.dll /codebase

// Regasm ClassicASPCOM.dll /tlb

// gacutil/i ClassicASPCOM.dll

using System;
using System.Runtime.InteropServices;

namespace ClassicASPCOM
{
    [ComVisibleAttribute(true)]
    [Guid("D355BC25-B85F-4476-8D38-582F92F7B6F4")]
    public interface IComplexObject
    {
        [DispId(2221)]
        int Number {get; set;}
        [DispId(2222)]
        string Message { get; set; }
        [DispId(2223)]
        DateTime Dtime { get; set; }
    }

    [ComVisibleAttribute(true)]
    [Guid("4E602191-8D09-458E-A0D0-A0A267696F78"),
    ClassInterface(ClassInterfaceType.None)]
    public class ComplexObject : IComplexObject
    {
        int Nmbr;
        public int Number
        {
            get
            {
                return Nmbr;
            }
            set
            {
                Nmbr = value;
            }
        }

        string Msg;
        public string Message
        {
            get
            {
                return Msg;
            }
            set
            {
                Msg = value;
            }
        }

        DateTime Dt;
        public DateTime Dtime
        {
            get
            {
                return Dt;
            }
            set
            {
                Dt = value;
            }
        }
    }

    [ComVisibleAttribute(true)]
    [Guid("4042FE79-8ACA-4E5D-9F14-2FF7C6AE8D88")]
    public interface IGetMessage
    {
        [DispId(2224)]
        string GetMessage(string Message);
        [DispId(2225)]
        string PaymentDetails(ComplexObject cObject);
    }

    [ComVisibleAttribute(true)]
    [Guid("9A133858-5893-4CA7-9048-345CD0FCF535"),
    ClassInterface(ClassInterfaceType.None)]
    public class ClassCOM : IGetMessage
    {
        public string GetMessage(string Message)
        {
            return "Your Message: " + Message;
        }

        public string PaymentDetails(ComplexObject cObject)
        {
            return " Message: " + cObject.Message + " Number: " + cObject.Number;
        }
    }  
}

ここに画像の説明を入力

ありがとう

4

2 に答える 2

1

[次の場合にエラーが発生します] 型クラスの引数を COM メソッド呼び出しに渡そうとしています。

クラス型の引数を COM メソッド呼び出しに渡していません。"co"variable に格納されているオブジェクト参照ではなく、string を渡していますco

于 2013-03-27T14:58:59.143 に答える
0

エリック・リッパートの答えに加えて、なぜこの部分のために「ここまでうまくいく」というコメントがあるのか​​ 疑問に思います:

set co = Server.CreateObject("ClassicASPCOM.ComplexObject") ' <- variable co is now an object
co = ""                ' <- variable co is now a string with value ""
co.Message = "Messi"   ' <- You should get an "Object required" error on this line
co.Number = 100
于 2013-03-27T15:32:40.727 に答える