关于用asp做组件的问题(100分)

  • 主题发起人 主题发起人 vastyellow
  • 开始时间 开始时间
V

vastyellow

Unregistered / Unconfirmed
GUEST, unregistred user!
我创建了一个asp对象!
type
TWebFunc = class(TASPObject, IWebFunc)
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
function Test(var str: OleVariant; str2: PChar): OleVariant; safecall;
end;
像做一个函数Test,让它有返回值,但在ASP端调用总不成功!不知道什么原因!
还有一个问题,如果写成过程
procedure Test(var str,str2:OleVariant);safecall;
的话,我想改变str,str2的值,在asp端也不成功!
请大虾帮忙分析一下原因,
不知道有没有人遇到过同样的情况?
 
在asp文件中很简单啊!
Dim str1,str2,str3
str1="1"
str2="2"
str3="3"
Set DelphiASPObj = Server.CreateObject("ArticleSave.WebFunc")
或DelphiASPObj.Test str1,str2,str3
或str3=DelphiASPObj.Test(str1,str2)
或str3=DelphiASPObj.Test str1,str2
都不行!是asp组件的问题?还是调用的问题?
 
怎么没人回答!分析的有道理,再加100分
 
应该是组件的问题,你上面写的三种调用方法中,第一种(调用procedure)和第三种(调
用function的方法都是对的),第二种不行。
先用Delphi做个客户端程序调用你的方法试试,如果成功的话,在ASP中调用也应该会成功的。
 
function Test(var str: OleVariant; str2: PChar): OleVariant; safecall;
这个函数就是个空壳,什么都不写,也出错!
并且
如果用过程
Procedure Test(var tt:OleVariant);safecall;
begin
tt:='skdsfksfdkfd';
end;
我想在组件中改变tt的值,在asp端用,但好像都不起作用
<%
tt="1223"
DelphiASPObj.Test(tt)
Response.Write tt
%>
tt的值并没有改变!不知道为什么!
请高手指教
 
[out]类型的参数恐怕只能用于支持指针的编程语言,这种类型的参数可以被修改,在C++中
被映射为指针类型,在Delphi中被映射为var类型。由于我对VB/VBScript了解不多,不敢肯定
是否可以,但返回值的形式显然是可以的。
以下是我的项目文件,GetDateTime可以被Delphi/CB和VBScript调用,但GetDateTime2不能
被VBScript调用。(我删除了OnStartPage和OnEndPage的相关代码)

unit ASP_Main;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
ComObj, ActiveX, AspTlb, ASP_TsObj1_TLB, StdVcl, SysUtils;

type
TASP_Test1 = class(TASPObject, IASP_Test1)
protected
function GetDateTime(Flag: Integer): WideString; safecall;
procedure GetDateTime2(Flag: Integer; var AResult: WideString); safecall;
end;

implementation

uses ComServ;

function TASP_Test1.GetDateTime(Flag: Integer): WideString;
begin
case Flag of
0: Result := DateToStr(Now);
1: Result := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
end;
end;

procedure TASP_Test1.GetDateTime2(Flag: Integer; var AResult: WideString);
begin
case Flag of
0: AResult := DateToStr(Now);
1: AResult := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
end;
end;

initialization
TAutoObjectFactory.Create(ComServer, TASP_Test1, Class_ASP_Test1,
ciMultiInstance, tmApartment);
end.

//以下为关键部分的MIDL文件代码:
[
id(0x00000003)
]
HRESULT _stdcall GetDateTime([in] long Flag, [out, retval] BSTR * Result );
[
id(0x00000004)
]
HRESULT _stdcall GetDateTime2([in] long Flag, [in, out] BSTR * AResult );
 
to Sachow
用Variant *类型的参数是可以的,但是它只是传值,而不是传地址,不知道怎样才能传地址呢?
如果要返回多个结果值,那该怎么办呢?
 
在Delphi中,
procedure TWebFunc.Two(var n1: OleVariant);
begin
n1:='123466777';
end;
调用可以, n1的值也可以改变!但ASP中为什么不行呢?
ASPObj:=CreateOleObject('ArticleSave.WebFunc');
ASPObj.Two(n1);
Caption:=n1;
 
VBScript不能进行指针操作,所以传地址的方法是行不能的。在ASP中,VBScript实际上全
是由Web服务器(如IIS)来解释执行的,实际上所有的处理都是由Web服务器来完成的,如果
支持在调用COM时支持指针操作的话,Web服务器自身的安全岂不难保?
 
To Sachow
你说的有点道理!那怎么才能在ASP组件和ASP程序之间传递数据呢?
用Session对象?用函数返回值?
另外我发现,接口中有属性,这个属性是不是可以作为传递参数的途径?
Sahow在北京吗?我们可以交流一下
 
也许是我的应用比较简单,还没有遇到过一个返回值处理不了的情况。过后你把你的具体应
用需求(即要实现一个什么功能)告诉我,我帮你分析一下该如何实现。
我在昆明。用E-Mail联系吧,我不经常用QQ。 xychow@km169.net
 
后退
顶部