delphi编的com如何在asp中使用(200分)

  • 主题发起人 主题发起人 leanyee
  • 开始时间 开始时间
L

leanyee

Unregistered / Unconfirmed
GUEST, unregistred user!
在com中有这样一个接口函数,能否在asp中调用,如果能,如何调用,请高手指教
procedure MailToDB(const SrcPhone, DestPhone, PhoneType: WideString;
MailType, SendType: Smallint
SendTime: TDateTime
SendNum,
SendInterVel: SYSINT
const Mail: WideString;
out ReturnValue: Smallint
out ErrMsg: WideString)
safecall;
 
你得知道你Com对象的ProgID啊,比如'project1.test'.
然后用Asp的Server对象创建这个Com对象就可以用了.
 
set comobj=server.createobject('xxx.xxx')
comobj.MailToDB(...)

'xxx.xxx'是com对象的progid
 
asp文件如下,但是ie显示出错
错误类型:
Microsoft VBScript 编译器错误 (0x800A0414)
/test/test.asp, 第 4 行, 第 57 列
mail.IsReged("13701316604","068658",0,returnvalue,errmsg)
--------------------------------------------------------^
com我也注册了,我用delphi编的一个测试程序也成功了,单asp出错
<%
set mail=server.createobject("mailcom.mail")
dim returnvalue,errmsg
mail.IsReged("13701316604","068658",0,returnvalue,errmsg)

response.write ReturnValue
response.write ErrMsg
response.end
 
你的Com对象接口类型是DUAL吗,ASP的脚本语言
不具备VTable访问能力.
 
并且VB中应该这样调用:
mail.IsReged "13701316604","068658",0,returnvalue,errmsg
 
我把com改为procedure MailToDB(const SrcPhone, DestPhone, PhoneType: WideString;
MailType, SendType: Smallint
SendTime: TDateTime
SendNum,
SendInterVel: SYSINT
const Mail: WideString)
safecall;不用参数返回数据,
而改用属性返回,可成功。问题是asp是不是不能使用参数返回结果的方式
 
谁给个具体帖子,或者例子。
我邮箱
linxian163@163.com
 
Asp是无法使用Out类型的参数的,只能使用函数的返回值
 
to myliu:我如果要返回很多东西,请问如何返回,asp能识别variant数组吗,请指教,不胜感激
 
TMail = class(TAutoObject, IMail)
private
ReturnValue: SmallInt;
ErrMsg: WideString;
GloabInfo: TGloabInfo;
FReg: boolean;
FConn: boolean;
Conn: TADOConnection;
function RegistryODBCSrc(Dsn,DBServer,DBName,User:string):boolean;
function ReadInifile: TGloabInfo;
function ConnectDB(GloabInfo: TGloabInfo
Dsn: string): boolean;
function OpenAdoQuery(var Q: TADOQuery
SqlStr: string): boolean;
function ExecAdoQuery(var Q: TADOQuery
SqlStr: string): boolean;
function GetPassword: string;
function GetFee(PhoneNo: string
SmsType: integer
var Fee: real): boolean;
function WriteWebLog(Q: TADOQuery;PhoneNo,OperId,OperRes,memo: string): boolean;
protected
procedure IsReged(const PhoneNo, PassWord: WideString;
LoginFlag: Smallint)
safecall;
procedure MailToDB(const SrcPhone, DestPhone, PhoneType: WideString;
MailType, SendType: Smallint
SendTime: TDateTime
SendNum,
SendInterVel: SYSINT
const Mail: WideString)
safecall;
procedure UserReg(const PhoneNo: WideString
out PassWord,
Email: WideString)
safecall;
procedure UnReg(const PhoneNo, PassWord: WideString)
safecall;
procedure DBToMail(out SrcPhone, DestAddr: WideString;
out SmsType: Smallint
out ID: Integer
out SMS: WideString);
safecall;
procedure MailResult(ID: Integer
SendTime: TDateTime)
safecall;
procedure SMSToDB(const SrcPhone, DestAddr: WideString
SmsType: Smallint;
const SMS: WideString)
safecall;
procedure DBToSMS(out SrcPhone, DestPhone: WideString;
out SmsType: Smallint
out ID: Integer
out SMS: WideString);
safecall;
procedure SMSResult(ID: Integer
SendTime: TDateTime)
safecall;
procedure QueryCharge(const PhoneNo, PassWord, QueryDateTime: WideString;
QueryType: Smallint
out ResultSmsNumber, ResultMailNumber,
ResultSmsCharge, ResultMailCharge: Integer)
safecall;
procedure QueryList(const PhoneNo, PassWord: WideString
QueryBeginTime,
QueryEndTime: TDateTime
QueryType: Smallint
out ResultSmsTotal,
ResultChargeTotal: Integer
out SmsDataSet, MailDataSet: OleVariant);
safecall;
procedure WebLog(const PhoneNo, OperID, OperRes, Memo: WideString);
safecall;
function Get_ReturnValue: Smallint
safecall;
function Get_ErrMsg: WideString
safecall;
{ Protected declarations }
public
procedure Initialize
override;
Destructor Destroy
override;
end;

IsReged源码如下
procedure TMail.IsReged(const PhoneNo, PassWord: WideString;
LoginFlag: Smallint);
var
Q: TADOQuery;
SQLStr: string;
begin
try
if not ((GloabInfo.DBServer = 'Error') or (GloabInfo.DBName = 'Error') or
(GloabInfo.User = 'Error')) then
begin
if FReg then
begin
if FConn then
begin
Q := TADOQuery.Create(nil);
Q.Connection := Conn;
SQLStr := 'select * from OpUser where PhoneNo = ''' + PhoneNo + '''';
if OpenAdoQuery(Q,SQLStr) then
begin
case LoginFlag of
0: begin //登录
if Q.RecordCount > 0 then
begin
if Trim(Q.FieldByName('Password').AsString) <> PassWord then
begin
ReturnValue := 5;
ErrMsg := '密码错误';
end else begin
if Q.FieldByName('UserState').AsString = '0' then //0:注销 1:注册
begin
ReturnValue := 4;
ErrMsg := '用户已注销';
end else begin
ReturnValue := 3;
ErrMsg := '登录成功';
end;
end;
end else begin
ReturnValue := 2;
ErrMsg := '无此用户手机';
end;
end;
1: begin //注册、注销判断
if Q.RecordCount > 0 then //有此用户
begin
if Q.FieldByName('UserState').AsString = '0' then
begin
ReturnValue := 4;
ErrMsg := '用户已注销';
end else begin
ReturnValue := 1;
ErrMsg := '有此手机';
end;
end else begin
ReturnValue := 2;
ErrMsg := '无此手机';
end;
end;
end;
end else begin
ReturnValue := 0;
ErrMsg := '查询出错';
end;
Q.Free;
end else begin
ReturnValue := 0;
ErrMsg := '数据库链接错误';
end;
end else begin
ReturnValue := 0;
ErrMsg := '访问ODBC数据源失败';
end;
end else begin
ReturnValue := 0;
ErrMsg := 'COM配置文件错误';
end;
except
ReturnValue := 0;
ErrMsg := '不明错误';
end;
end;

我用delphi编的测试程序测试,返回值为
ReturnValue := 3;
ErrMsg := '登录成功';
而用asp测试,返回值为
ReturnValue := 0;
ErrMsg := '访问ODBC数据源失败';

不明白为什么,请指教
 
那是因为ASP的对象在运行过后已经释放掉了,你再去获取状态参数当然没有了
另外:Asp的一些语法不是很熟,所以可能无法回答你的问题。
 
脚本语言没有使用指针的能力,当然也就不能使用任何返回参数.
但你可以把要返回的值定义成COM对象的特性(Property),在调用的过程中改变特性,
调用后立刻读取特性就能取得同样的效果.
 
我用的是特性,
function Get_ReturnValue: Smallint
safecall;
function Get_ErrMsg: WideString
safecall;
我的asp改为如下
<%
set mail=server.createobject("mailcom.mail")
dim returnvalue,errmsg
mail.IsReged "13701316606","068658",0

response.write mail.ReturnValue
response.write mail.ErrMsg
response.end
set mail=nothing
%>

得到的结果是
ReturnValue := 0;
ErrMsg := '访问ODBC数据源失败';
这些都是从com里返回的数据,应该说com调用已经部分生效了,但为什么和我的测试程序测试
的结果不一样,在注册数据源的时候出的错
 
1。该成待参数的属性返回试一试,属性的参数用中括号[]。
2。看一看是否是权限问题,在IIS web站点属性中的主目录,应用程序设置修改执行许可和应用程序保护试一下。
 
xeen的回答非常正确,问题已经解决,非常感谢,同时给分,答者有份
 
后退
顶部