2013-03-27 88 views
2

嗨經典ASP的專家,經典ASP C#COM Microsoft VBScript運行時錯誤

基本上,我是新來的經典ASP和VBScript,並得到了這個「VBScript運行時錯誤:無效的過程調用或參數」,而試圖通過COM方法的一個複雜類型的參數(見下面的截圖)。在創建服務器對象並將字符串傳遞給COM方法時,任何嘗試傳遞複雜類型的參數都是徒勞的。

請幫忙。

這裏的代碼片段:

的VBScript ClassicASPHome.asp頁面上(服務器端):

<% 
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; 
     } 
    } 
} 

enter image description here

感謝

+1

出於好奇,你爲什麼要使用.NET組件來自ASP3。爲什麼不直接使用ASP.NET,或者這是一種自虐的學習練習? (在這種情況下,我建議使用C或C++編寫COM組件,以避免CLR編組出現問題)。 – Dai 2013-03-27 15:00:55

+0

'bar'從哪裏來? – 2013-03-27 17:18:23

+0

複雜對象沒有實現IComplexObject會讓你感到奇怪嗎?我們假設你將IComplexObject設置爲ComplexObject的dispinterface。 – 2013-03-27 17:53:15

回答

1

[I'm getting an error when] trying to pass an argument of type class to the COM method call.

你不及格的類類型的參數來COM方法調用。您傳遞字符串"co",而不是存儲在變量co中的對象引用。

+0

「ret = foo.PaymentDetails合「)」 「酒吧」 - 錯字 - 因此刪除 「公共類ComplexObject」 - 錯字 - 應爲已讀 - 「公共類ComplexObject:IComplexObject」 – user1660166 2013-03-28 12:48:42

+0

所以在他的情況下,你將如何傳遞對象「CO」而不是字符串「co」? – 2016-03-05 20:45:28

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 
+0

「ret = foo.PaymentDetails(」co「)」「bar」 - 打印錯誤 - 因此被刪除 「public class ComplexObject」 - typo - 應該讀爲 - 「public class ComplexObject:IComplexObject」 – user1660166 2013-03-30 07:56:16