Delphi 如何开发一个可供JavaScript或VbScript调用的COM对象。 (在线等)(100分)

  • 主题发起人 主题发起人 kenns2000
  • 开始时间 开始时间
K

kenns2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个小COM组件,Automation Object类型的。
想在HTML里用JavaScript或VbScript调用。

但是,脚本创建都成功,但是在调用里同的功能函数时,老是报Object doesn't support this property or method错,这是怎么回事????

但是JavaScript调用像M$的MSXML等都是可以的。为什么调用自己开发的就报错。
 
[:(]
竟然没人回答,郁闷!
 
应该是你的组件有问题。
你在Delphi中用obj:=CreateOleObject('abc.def')这种方式能正常调用吗?
 
我特地用DELPHI试过了,是可以的。
 
ComTest_TLB.PAS

unit ComTest_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;



const
// TypeLibrary Major and minor versions
ComTestMajorVersion = 1;
ComTestMinorVersion = 0;

LIBID_ComTest: TGUID = '{C77D8814-2210-45EC-9807-CDA47BA51ADB}';

IID_ITestCom: TGUID = '{C94E11C0-D4E8-44A6-9527-8FC1BB16ED45}';
CLASS_TestCom: TGUID = '{91142AD6-407B-496A-A037-8B289B86593F}';
type
TestCom = ITestCom;

ITestCom = interface(IDispatch)
['{C94E11C0-D4E8-44A6-9527-8FC1BB16ED45}']
function HuHU: OleVariant; safecall;
end;

ITestComDisp = dispinterface
['{C94E11C0-D4E8-44A6-9527-8FC1BB16ED45}']
function HuHU: OleVariant; dispid 201;
end;


CoTestCom = class
class function Create: ITestCom;
class function CreateRemote(const MachineName: string): ITestCom;
end;

implementation

uses ComObj;

class function CoTestCom.Create: ITestCom;
begin
Result := CreateComObject(CLASS_TestCom) as ITestCom;
end;

class function CoTestCom.CreateRemote(const MachineName: string): ITestCom;
begin
Result := CreateRemoteComObject(MachineName, CLASS_TestCom) as ITestCom;
end;

end.
 
Unit1.pas

unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
ComObj, ActiveX, ComTest_TLB, StdVcl;

type
TTestCom = class(TAutoObject, ITestCom)
protected
function HuHU: OleVariant; safecall;

end;

implementation

uses ComServ;

function TTestCom.HuHU: OleVariant;
begin
Result := 'HaHaHaHa';
end;

initialization
TAutoObjectFactory.Create(ComServer, TTestCom, Class_TestCom,
ciMultiInstance, tmApartment);
end.
 
HTML.HTM



<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="Microsoft FrontPage 6.0">
<META NAME="ProgId" CONTENT="FrontPage.Editor.Document">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<TITLE>新建网页 1</TITLE>
<SCRIPT LANGUAGE="javascript">

function ss() {
try {
var s = new ActiveXObject("ComTest.TestCom");
var t, z;
z = s.HuHU;
alert(z);
}catch(e){
alert(e.message)
}
}

</SCRIPT>
</HEAD>
<BODY>
<INPUT TYPE="button" VALUE="按钮" NAME="B3" onclick="ss();">
</BODY>
</HTML>
 
这个是测试调用的程序,是成功的。

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComObj, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var s: Variant;
begin
s := CreateOleObject('ComTest.TestCom');

ShowMessage(VarToStr( s.HuHU));
end;

end.
 
z = s.HuHU(); //括号一定要
alert(z);
 
谢谢楼上。
已经成功了,困扰了一天的问题,原来是这个小原因。
 
再想问一下,
用Delphi开发一个COM Object和开发一个Automation Object,
哪个性能更佳一些?

JavaScript可以调用Delphi开发的COM Object吗?
 
Automachine Object对Com Object而言,支持双重接口,所以才能够以后期连接方式调用,性能的话我想是一样的(仅对前期连接方式而言)。
JavaScript不可以调用Delphi开发的COM Object。
 
TO:smokingroom
再次感谢。
 
接受答案了.
 
后退
顶部