按照 Delphi浪客 的方法重新贴一下
1. File -> New -> ActiveX Library (MyTest.dpr)
2. File -> New -> Active Server Object [Name: MyCtrl, Page-Level] (MyCtrl.pas)
程序自动创建 Interface:IMyCtrl, CoClass:MyCtrl
3. 在 Type Library 中增加 Interface:IMySubCtrl
4. 编辑 Type Library 中的 CoClass:MyCtrl,在 Implements 部分加入新的接口 IMySubCtrl
5. 在 Interface:IMyCtrl 中增加属性 SubCtrl
6. 在 Interface:IMySubCtrl 中加入属性 Name, Age
===============================================================================
Type Library 内容:
[
uuid(C3D48F50-6ED2-4AF6-A956-F9FF397557F9),
version(1.0),
helpstring("MyTest Library")
]
library MyTest
{
importlib("stdole2.tlb");
importlib("stdvcl40.dll");
[
uuid(29E2EC3B-E91A-4293-8682-B870BA042157),
version(1.0),
dual,
oleautomation
]
interface IMySubCtrl: IDispatch
{
[
propget,
id(0x00000001)
]
HRESULT _stdcall Name([out, retval] BSTR * Value );
[
propget,
id(0x00000002)
]
HRESULT _stdcall Age([out, retval] long * Value );
};
[
uuid(03C6DA4E-5567-4FAC-B6B6-4A9560A633C7),
version(1.0),
helpstring("MyCtrl Object")
]
coclass MyCtrl
{
[default] interface IMyCtrl;
interface IMySubCtrl;
};
[
uuid(B2780298-863F-41C9-8AF3-E84FC6E8B0A3),
version(1.0),
helpstring("Dispatch interface for MyCtrl Object"),
dual,
oleautomation
]
interface IMyCtrl: IDispatch
{
[
propget,
id(0x00000001)
]
HRESULT _stdcall SubCtrl([out, retval] IMySubCtrl ** Value );
};
};
===============================================================================
MyCtrl.pas 内容:
unit MyCtrl;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, AspTlb, MyTest_TLB, StdVcl;
type
TMyCtrl = class(TASPMTSObject, IMyCtrl, IMySubCtrl) //实现两个接口
protected
function Get_SubCtrl: IMySubCtrl
safecall
//接口 IMyCtrl 的方法
function Get_Age: Integer
safecall
//接口 IMySubCtrl 的属性
function Get_Name: WideString
safecall
//接口 IMySubCtrl 的属性
end;
implementation
uses ComServ;
function TMyCtrl.Get_SubCtrl: IMySubCtrl;
begin
Result := IMyCtrl as IMySubCtrl
//按照 Delphi浪客 的方法写的,报错
// Result := TMyCtrl.Create as IMySubCtrl
//编译通过,在 ASP 里 IMySubCtrl 无法用
// Result := CreateComObject(CLASS_MyCtrl) as IMySubCtrl
//同样编译通过,在 ASP 里 IMySubCtrl 无法用
end;
function TMyCtrl.Get_Age: Integer;
begin
Result := 26;
end;
function TMyCtrl.Get_Name: WideString;
begin
Result := 'nkiller';
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyCtrl, Class_MyCtrl,
ciMultiInstance, tmApartment);
end.
===============================================================================
我想达到的目的:(ASP Code)
Set MyCtrl = Server.CreateObject("MyTest.MyCtrl") //创建 Object
Set MySubCtrl = MyCtrl.SubCtrl //得到子接口
Response.Write MySubCtrl.Name //输出子接口的属性值
Response.Write MySubCtrl.Age //输出子接口的属性值
Set MySubCtrl = Nothing //释放 Object
Set MyCtrl = Nothing //释放 Object
===============================================================================
再放一段脚本代码 (Test.vbs)
Set MyCtrl = CreateObject("MyTest.MyCtrl") //创建 Object
Set MySubCtrl = MyCtrl.SubCtrl //得到子接口
WScript.Echo MySubCtrl.Name //输出子接口的属性值
WScript.Echo MySubCtrl.Age //输出子接口的属性值
Set MySubCtrl = Nothing //释放 Object
Set MyCtrl = Nothing //释放 Object
上面这段代码存到一个文本文件,改成.vbs 就行了,用这个的好处是不用安装 IIS,只要有
WSH(Windows Scripting Host)就行了。
想达到上面的目的,不知道应该怎样写,请高手指教,请提供源码供研究,谢谢。