ActiveX组件与JavaScript交互

转载 2007年10月06日 21:16:00
可能大部分人对JavaScript调用ActiveX比较熟悉,但在ActiveX中如何调用JavaScript的函数呢?网上看过一篇用C++编写的ActiveX组件调用JavaScript函数的贴子,但似乎没人关心Delphi中如何编写相应功能的代码,前段时间研究了一下,很简单,现分享出来。

1.建立ActiveXForm工程,添加对SHDocVw,MSHTML单元的引用;

2.在类中声明如下私有函数:

  private
    FWebBrowser: IWebBrowser2;

    function FindIEWebBrowser: IWebBrowser2;
    function FindIEWindow(ParentHandle, ChildHandle: HWND): Boolean;

    function CallScript: Boolean;
  end;

3.按Ctrl + Shift + C生成程序体代码,完善代码如下(关于获取组件所在IE窗口的IWebBrowser2接口,在我的另一篇文章里有详细介绍:http://blog.csdn.net/reonlyrun/archive/2006/12/15/1444635.aspx):

function TActiveFormX.FindIEWebBrowser: IWebBrowser2;
var
  tmpShell: IShellWindows;
  tmpIntf: IDispatch;
  tmpIE: IWebBrowser2;
  i, Count: Integer;
begin
  try
    if FWebBrowser = nil then
    begin
      Count := 0;
      repeat
        tmpSHell := CoShellWindows.Create;
        for i := 0 to tmpShell.Count - 1 do
        begin
          tmpIntf := tmpShell.Item(i);
          if tmpIntf = nil then continue;
          tmpIntf.QueryInterface(IID_IWebBrowser2, tmpIE);
          if tmpIE = nil then Continue;
          if (Integer(Handle) = tmpIE.HWND) or FindIEWindow(Integer(tmpIE.HWND), Handle) then
            FWebBrowser := tmpIE;
        end;
        Inc(Count);
        Sleep(50);
        Application.ProcessMessages;
      until (FWebBrowser <> nil) or (Count > 50);
    end;
    Result := FWebBrowser;
  except
  end;
end;

function TActiveFormX.FindIEWindow(ParentHandle,
  ChildHandle: HWND): Boolean;
var
  tmpHandle : HWND;
begin
  tmpHandle := GetParent(ChildHandle);
  if tmpHandle = 0 then
  begin
    Result := False;
    Exit;
  end else
  begin
    if tmpHandle = ParentHandle then
    begin
     Result := True;
     Exit;
    end else
    begin
      Result := FindIEWindow(ParentHandle, tmpHandle);
    end;
  end;
end;

function TActiveFormX.CallScript: Boolean;
var
  tmpDocument2: IHTMLDocument2;
  tmpDispID: Integer;
  tmpScriptName: WideString;
  tmpDispParams: TDispParams;
  tmpResult: Variant;
  tmpParam1Value, tmpParam2Value: WideString;
  tmpExcepInfo: TExcepInfo;
begin
  try
    tmpDocument2 := FindIEWebBrowser.Document as IHTMLDocument2;
    //获取角本函数的指针,角本函数名为"CallScript"
    tmpScriptName := 'CallScript';
    OleCheck(tmpDocument2.Script.GetIDsOfNames(GUID_NULL, @tmpScriptName, 1, LOCALE_SYSTEM_DEFAULT, @tmpDispID));

    //设置参数个数
    tmpDispParams.cArgs := 2;
    //设置参数值
    New(tmpDispParams.rgvarg);
    tmpParam1Value := 'Hello';
    tmpDispParams.rgvarg[0].bstrVal := PWideChar(tmpParam1Value);
    tmpDispParams.rgvarg[0].vt := VT_BSTR;
    tmpParam2Value := 'World';
    tmpDispParams.rgvarg[1].bstrVal := PWideChar(tmpParam2Value);
    tmpDispParams.rgvarg[1].vt := VT_BSTR;
    tmpDispParams.cNamedArgs := 0;

    //调用脚本函数
    OleCheck(tmpDocument2.Script.Invoke(tmpDispID, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
      DISPATCH_METHOD, tmpDispParams, @tmpResult, @tmpExcepInfo, nil));
    ShowMessage(tmpResult);
    Result := true;
  except
    Result := false;
  end;
end;

4.在Type Library中对IActiveFormX添加一个新方法,后面会在JavaScript中调用该函数,函数体代码如下:

function TActiveFormX.CallActiveX(const Param1,
  Param2: WideString): WideString;
begin
  Result := Param1 + ' ' + Param2;
  ShowMessage('ActiveX: ' + Result);
end;

5.在窗体上添加一个Button,命名为btnCallScript,完成其Onclick事件的响应代码:

procedure TActiveFormX.btnCallScriptClick(Sender: TObject);
begin
  CallScript;
end;

6.发布该工程,修改网页文件内容如下:


 

<HTML>
<H1> Delphi 6 ActiveX Test Page </H1><p>
You should see your Delphi 6 forms or controls embedded in the form below.
<HR><center><P>
<script language="javascript">
   
function CallScript(Param1, Param2)
   {
      tmpMsg 
= Param1 + " " + Param2;
      alert(
"JavaScript: " + tmpMsg);
      
return "ActiveX: " + tmpMsg;
   }
   
function CallActiveX(Param1, Param2)
   {
      tmpMsg 
= document.getElementById("ActiveX1").CallActiveX(Param1, Param2);
      alert(
"JavaScript:" + tmpMsg);
   }
</script>
<input id="input1" value="CallActiveX" type="button" onclick="CallActiveX('Hello', 'World')">
<br>
<OBJECT id="ActiveX1"
      classid
="clsid:3CA0A261-4183-4630-A280-6F616196514D"
      codebase
="ActiveFormProj1.cab#version=1,0,0,0"
      width
=690
      
height=450
      
align=center
      
hspace=0
      
vspace=0
>
</OBJECT>
</HTML>

 

7.发布网页和打包的程序,在IE中输入相应路径,正确执行界面如图,分别点击网页按钮和ActiveX组件窗体内的按钮可以观察交互情况。值得注意的是,由ActiveX调用JavaScript时参数的传递顺序正好逆转过来(个人以为应该是C++编译器和Delphi编译器对参数的压栈顺序不同),在开发项目时要注意该问题。

 

ActiveX组件开发和使用

ActiveX控件的概念  (COM组件的应用)     1 什么是ActiveX控件        基于COM组件技术的,使用与一般控件一样方便。与一般控件的区别是,它可以被任何支持COM标准的计算...
  • eldn__
  • eldn__
  • 2014年08月06日 21:18
  • 6958

VC++开发的ActiveX如何加入安全机制,避免IE中提示“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”

转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一...
  • QHH_QHH
  • QHH_QHH
  • 2016年09月12日 16:33
  • 960

在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全

在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全
  • boise
  • boise
  • 2016年08月25日 13:03
  • 6420

activeX com 组件开发 一

com组件开发  可以用vb   c#  vc++  等   个人对c#比较熟练 ,但是c# 做控件弊端太大,要求客户装framework 这比较强人所难 ,当然vb 也要装运行库库 ,vc++可以装...
  • studypower
  • studypower
  • 2014年09月27日 14:06
  • 1379

ActiveX异步回调JavaScript(通过事件方式)

版权声明 请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。   以前是用的事件机制来调用JavaScript,事件和回调...
  • rankun1
  • rankun1
  • 2016年06月08日 13:37
  • 1642

JavaScript如何触发ActiveX控件的事件,并得到事件中的参数

最近在使用公司购买的一款图形ActiveX控件,开发web端时遇到一个问题:JavaScript如何触发ActiveX控件的事件,并得到事件中的参数。在谷歌和百度上找了很多资料,感觉还是不清楚是如何触...
  • minminsu
  • minminsu
  • 2014年04月02日 16:24
  • 1256

OLE、ActiveX 、COM和普通DLL的简单理解

COM: COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 COM组件是遵循COM规范编写的 COM组件是一些小的二进制可执行文件 COM组件可以给应用程序...
  • Liekkas
  • Liekkas
  • 2015年04月27日 11:22
  • 1115

编写ActiveX控件及其打包方法

1、ActiveX控件概述 ActiveX控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中。在Windows操作系统以OCX结尾的文件,OCX代表“对象链接与嵌入控...
  • inrgihc
  • inrgihc
  • 2015年10月20日 21:29
  • 1856

VS2008自动添加ActiveX插件的MFC类

VS2008中添加ActiveX的MFC类,不同的方式,自动生成的类文件是不同的。我所用到的视频插件和MSCOMM插件的MFC类的添加方式相同。下面我将...
  • tom06
  • tom06
  • 2014年08月12日 18:50
  • 1371

c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目

1.ActiveX的基本概念          ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。这个容器包括WEB网页,应用程序窗体...
  • longhuahaha
  • longhuahaha
  • 2013年01月30日 18:03
  • 56470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveX组件与JavaScript交互
举报原因:
原因补充:

(最多只允许输入30个字)