ActiveX开发流程

来源:互联网 发布:淘宝卖家怎么查访客 编辑:程序博客网 时间:2024/05/19 02:01

ActiveX是微软九十年代中期开发的一种技术,它允许你创建一个类似applet的应用程序,并允许你在微软的浏览器中下载和运行。这篇教程的阅读对象是那些希望使用Visuall C++开发第一个ActiveX程序但却不知道如何下手的人。当我自己尝试学习这种技术的时候,我发现关于ActiveX技术使用的信息大部分都没什么用处,是太老了或者缺失一些关键的信息。这让我建立一个可用ActiveX控件工程的过程困难重重。我写这篇文章的用意就是帮助你快速的建立一个ActiveX控件。其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method)、属性(propertiy)和事件(event),以及ActiveX控件和网页之间的通讯方法。并将要学习如何再Windows XP系统中的IE浏览器默认的安全设置中无警告的执行这个控件。


在这个指南中,我们将要创建一个ActiveX控件用来显示一个GIF动画表现的进度条,用来表示这个控件的载入和执行信息。这个控件的功能将会展示如何在网页和控件之间的信息。我们将会指导你如何使用微软Visual Studio 2005中一步一步的创建这个控件。

创建一个ActiveX控件

为了创建一个ActiveX控件,需要对微软Visual Studio 2005执行以下步骤:

 

  • 1.选择文件\新建\项目
  • 2.打开如图1一样的对话框,选择Visual C++,MFC。在右面模板对话框中选择MFC ActiveX控件。
  • 3.在名称中输入MyActiveX;在位置中输入你需要代码工程放置的硬盘位置,之后选择确定。

http://www.codeproject.com/com/CompleteActiveX/image002.jpg

图1.新建项目对话框

  • 4.在MFC ActiveX控件向导对话框中(如图2所示),选择控件设置
  • 5.在创建的控件基于下拉菜单中选择STATIC。我们使用了一个静态的控件,我们只是简单的输出结果,并不需要接受输入信息。
  • 6.在附加功能中,确定可见时激活无闪烁激活两项被激活,其它的都被关闭。

http://www.codeproject.com/com/CompleteActiveX/image004.jpg

图2.MFC ActiveX控件向导

  • 7.单击完成按键让MFC ActiveX控件向导创建工程以及相关代码。在默认的情况下,向导会把MFC作为一个动态连接库使用。我们需要对其作一些更改,否则ActiveX控件无法在没有提供MFC动态连接库的系统当中下载和运行。这会导致当网页下载和运行ActiveX控件时候导致错误警报。在Visual Studio目录中, 选择工程、属性。然后选择配置属性->常规->MFC的使用,把MFC的使用改成在静态库中使用MFC
  • 8.向导将会给我们建立下面三个不同的类型以供使用:

·        CMyActiveXApp – 这个是ActiveX应用程序类,继承于COleControlModule。后者是驱动一个OLE控件的基础。控件模块对象包含了初始化(InitInstance)和清理(ExitInstance)的成员函数。

·        CMyActiveXCtrl – 由基类COleControl驱动。它提供了我们的控件的大部分功能。

·        CMyActiveXPropPage – 由基类COlePropertyPage驱动。它被用来管理控件的属性页对话框。ActiveX Control控件向导会建立一个默认的对话框为这个控件提供属性页。

加入对GIF动画的支持

为了让这个ActiveX控件支持显示一个GIF动画表现的进度条功能,我们将要使用CPictureEx类型,它是Oleg Bykov在CodeProject Article提供的。这里提供一些相关的细节。首先,把源码文件pictureex.cpp和pictureex.h加入到你的工程,在解决方案资源管理其中右键单机工程,选择添加现有项目,然后选择同文件和源文件,填交到代码树中。


为了添加一个GIF资源到项目中,我们必须面对Visual Studio 2005(以及vs2003)的一个问题,它不允许导入GIF图像各式的文件到资源中。如果你这么做了,你对得到一个错误警告,你需要通过下面的途径来绕过这个问题:

 

  • 1.拷贝GIF文件ProcessingProgressBar.gif文件到你的工程文件夹中,并改扩展名为gaf(即改为ProcessingProgressBar.gaf文件)。在资源视图中,右键单击资源文件夹MyActiveX.rc,并选择添加资源。在添加资源对话框中,单击导入按键,选择文件ProcessingProgressBar.gaf。在资源定制类型对话框中输入“GIF”作为资源的类型,选择确定。这样我们就把一个GIF图像文件放入这个工程中来。你可以在资源中找到GIF文件夹找到我们的资源,在其属性中把系统给的IDIDR_GIF1 改成IDR_PROGRESSBAR
  • 2.现在,我们需要把图形文件正确配置。首先,保存资源文件MyActiveX.rc。在工程目录中,用记事本打开他,把其中"ProcessingProgressBar.gaf"改成"ProcessingProgressBar.gif"同时我们也需要把gif文件扩展名称改回ProcessingProgressBar.gif。在记事本中保存MyActiveX.rc文件。Visual Studio将要告知myactivex.rc被在外部改变,单击确定读入新的文件。选择解决方案资源管理器,把“ProcessingProgressBar.gaf”改为“ProcessingProgressBar.gif”。

 

增加图形进程条对话框

现在,我们将要增加一个图形进程条对话框。

·        1.在资源视图中,右键单击对话框文件夹,选择插入dialog创建一个默认的对话框。

·        2.删除“确定”和“取消”两个不需要的按键,并且调整对话框尺寸到230 x 40。

·        3.改变对话框的其中一些属性:Border – None,Style – Child, System Menu – False, Visible –True.

·        4.改变控件ID到IDD_MAINDIALOG

·        5.插入一个图片控件(picture control)到对话框中来,选择Visual Studio最右边的工具箱,选择picture control,然后点击对话框。调整这个控件的尺寸到200 x 20。改变控件的ID到IDC_PROGRESSBAR,把Color属性设置为White。

·        6.为对话框创建一个类,右键单击对话框选择添加类。结果打开了MFC类向导如图3所示。把类名定义为CMainDialog,继承于CDialog。单击完成让想逃来创建这个类的默认源代码。

http://www.codeproject.com/com/CompleteActiveX/image006.jpg

图3.MFC类向导如图 – CMainDialog

现在我们可以向类中增加成员变量了。成员变量m_MainDialog是一个CMainDialog类型,m_ProgressBar是我们将要加入主对话框的进度条控件。

 

·        1.把变量m_MainDialog加入到类CMyActiveXCtrl中。选择类视图,右键单击CMyActiveXCtrl,选择添加,添加变量。输入变量类型CMainDialog以及变量名m_MainDialog,然后单击完成按键。

·        2.类似的,增加成员变量m_ProgressBar到类CMainDialog中。输入变量类型CPictureEx,变量名m_ProgressBar,并打开控件变量选项,然后确认控件ID为IDC_PROGRESSBAR,在单击完成按键之前,确认一下变量CPictureEx而不是被改成的CStatic。

http://www.codeproject.com/com/CompleteActiveX/image008.jpg

Figure 4. 添加成员变量向导– m_ProgressBar

增加支持代码

好了,现在我们需要卷起袖子写入一些代码了,用来绘制主对话框和进度条控件。

·        1.选择类CMyActiveXCtrl。在属性页中,选择消息图标,在WM_CREATE条目下选择<添加> OnCreate来添加处理WM_CREATE消息。向导将会帮助我们在类CMyActiveXCtrl中添加OnCreate方法来处理理WM_CREATE消息。

·        2.对MyActiveXCtrl.cpp文件进行编辑,并添加下面代码在OnCreate方法中用来创建除对话框:

m_MainDialog.Create(IDD_MAINDIALOG,this);

在OnDraw方法中增加下列代码来对主对话框窗口填入背景色:

m_MainDialog.MoveWindow(rcBounds,TRUE);

CBrushbrBackGnd(TranslateColor(AmbientBackColor()));

pdc->FillRect(rcBounds,&brBackGnd);

·        3.选择类型CMainDialog。在属性页中,选择消息图标,在WM_CREATE条目下选择<添加> OnCreate来添加处理WM_CREATE消息。向导将会帮助我们在类CMainDialog 中添加OnCreate方法来处理理WM_CREATE消息。

·        4.编辑MainDialog.cpp,并在OnCreate方法中增加下面代码用来创建进度条GIF动画:

if(m_ProgressBar.Load(MAKEINTRESOURCE(IDR_PROGRESSBAR),_T("GIF")))

    m_ProgressBar.Draw();

确定当前编译模式为Release,并编译MyActiveX ActiveX应用程序。

为ActiveX控件创建网页

我们选择的用来快速创建测试网页的工具是微软的ActiveX ControlPad。你可以到微软去下载。

你也可以在其它的网站上面找到可用的下载链接,在你使用Visual Studio的系统上安装并运行这个工具。为了便于测试程序的效果,你还需要装上微软的IIS web服务器。

当你第一次运行ActiveX ControlPad,它会为你创建一个默认的HTML网页。为了插入ActiveX控件,右键单击HTML代码中<BODY>标签,然后选择ActiveX Control。在Insert ActiveXControl窗口中,选择在刚才用Visual Studio创建的MyActiveX Control,然后选择OK。


http://www.codeproject.com/com/CompleteActiveX/image010.jpg

图5. ActiveX ControlPad – Insert ActiveX Control

 

之后在ActiveX ControlPad中会显示两个矩形对话框,让你有机会修改你所选定的控件。属性对话框提供给你更改控件属性的方法,Edit ActiveXControl 对话框和意让你手工编辑这个控件。你可以关闭这两个窗口,我们之后会在HTML代码中更加细致的对其进行手动配置。你现在需要找到HTML代码中的OBJECT ID 标签,类似图6所示。把OBJECT ID标签里面的size参数改变到“WIDTH=350”和“HEIGHT=50”。然后储存HTML文件为myactivex.htm,并放置到IIS Web服务器的根文件夹中。


http://www.codeproject.com/com/CompleteActiveX/image012.jpg

图6. ActiveX ControlPad – MyActiveX ActiveX Control

开始测试ActiveX控件,在IE中载入网页http://localhost/myactivex.htm 。如果你得到了一些警告信息,只需要选择确定忽略它们。正确的结果是会在网页中显示一个GIF动画的进度条。如果没有,或者你在控件中得到了一个红色的X,那很可能是你对浏览器的安全设置把ActiveX下载或者运行给关闭了,这时候你应该打开IE的安全设置,把所有关于ActiveX的选项启用。

 

http://www.codeproject.com/com/CompleteActiveX/image014.jpg

图7. MyActiveX控件在IE中显示

接下来,我们需要构建ActiveX控件让其可以直接在IE浏览器中载入,而没有让然讨厌的错误信息。

构建一个已签名的ActiveX控件

为了构建一个已签名的ActiveX控件,你需要从某个机构购买一个签名代码证书,这些可以欠发证书的机构包括Thawte,Verisign,以及GeoTrust等。当你接受了这项服务的话,它们会帮助你验证程序不被篡改,并向你发放一个证书给你用来对你的ActiveX应用程序签名。我选择了Thawte提供的签名证书,它提供给你两个千名文件mycert.spc与mykey.pvk。

对ActiveX程序进行签名,我们需要把程序打包成CAB文件。让其可以从网页下载这个ActiveX控件并进行安装。在安装过程中包括了注册ActiveX组件的过程。为了实现这个功能,我们需要为ActiveX控件设置一个VERSIONINFO结构的OLESelfRegister值,在Visual Studio 2003中会帮助我们完成,而在VS2005中需要我们进行处理。我们需要编辑资源文件myactivex.rc加入下面OLESelfRegister值,如下:

VS_VERSION_INFOVERSIONINFO

 FILEVERSION 1,0,0,1

 PRODUCTVERSION 1,0,0,1

 FILEFLAGSMASK 0x3fL

#ifdef _DEBUG

 FILEFLAGS 0x1L

#else

 FILEFLAGS 0x0L

#endif

 FILEOS 0x4L

 FILETYPE 0x2L

 FILESUBTYPE 0x0L

BEGIN

    BLOCK "StringFileInfo"

    BEGIN

        BLOCK "040904e4"

        BEGIN

            VALUE "CompanyName","TODO: <Company name>"

            VALUE "FileDescription","TODO: <File description>"

            VALUE "FileVersion","1.0.0.1"

            VALUE "InternalName","MyActiveX.ocx"

            VALUE "LegalCopyright",

                  "TODO: (c) <Companyname>. All rights reserved."

            VALUE "OLESelfRegister","\0"

            VALUE "OriginalFilename","MyActiveX.ocx"

            VALUE "ProductName","TODO: <Product name>"

            VALUE "ProductVersion","1.0.0.1"

        END

    END

    BLOCK "VarFileInfo"

    BEGIN

        VALUE "Translation", 0x409,1252

    END

END


在我们签名应用程序之前,ActiveX控件需要被打包成CAB文件。CAB文件中同时包含了一个INF文件被用来安装ActiveX 控件。为了构件CAB文件,你需要运行Cabinet SoftwareDevelopment Kit的cabarc.exe工具。下面提供了一个简单的INF文件例子,用来包装MyActiveX控件到CAB文件。你需要把CLSID行的值改成HTML文件中OBJECT ID标签所使用的值(之前用ActiveX Control Pad生成)。

[Add.Code]

myactivex.ocx=myactivex.ocx

myactivex.inf=myactivex.inf

 

[myactivex.ocx]

file=thiscab

clsid={36299202-09EF-4ABF-ADB9-47C599DBE778}

RegisterServer=yes

FileVersion=1,0,0,0

 

[myactivex.inf]

file=thiscab

建立CAB文件,向下面一样运行cabarc工具。 重要:确认在运行cabarc.exe时OCX和INF文件在相同的文件夹中,否则的话CAB文件从网页中下载之后会产生错误。这是一个导致警告的问题。

cabarc -s 6144 Nmyactivex.cab myactivex.ocx myactivex.inf

当对一个CAB文件进行签名的时候,你需要得到Microsoft MSDN上的signcode.exe工具。这里关系到“可信的签名和检查”将会在这个文章的后面提到。你使用signcode工具把从外面卖到的代码证书绑定到CAB文件中。下面是一个使用签名代码签名myactivex.cab文件的例子:

signcode -n"myactivex" -i

   http://www.myactivex.com -spc mycert.spc -v mykey.pvk -t

   http://timestamp.verisign.com/scripts/timstamp.dll myactivex.cab

在上面的例子中,http://www.myactivex.com 提供了这个给签名ActiveX控件提供更多用户信息的网页。


把这个CAB文件应用到网页中,首先拷贝myactivex.cab到你网页所在的文件夹,然后你必须修改网页中OBJECT ID标记中CODEBASE参数索引到你的CAB文件上来。参照图8的例子。如果你在IE中载入这个网页,它将会下载CAB文件并安装你的ActiveX控件,过程中并不会出现一个没有签名的警告。


http://www.codeproject.com/com/CompleteActiveX/image016.jpg

图8. ActiveX ControlPad – MyActiveX with CODEBASE

构建一个安全的ActiveX控件

如果希望再IE载入控件的时候不对控件不安全作出警告的信息的话,你必须保证执行代码使用安全的初始化和脚本的Active控件。相关的细节可以参照微软MSDN上的文章“Safe Initialization and Scripting for ActiveX Controls”。本文的后面会给出链接地址。不过我在这篇文章里面看到了大量的错误和冗长的文章。其实只需要在代码中加入DllRegisterServer和DllUnregisterServer这两个方法。下面我们就一步步指导你把ActiveX控件改成安全的:


编辑MyActiveX.cpp文件加入下面代码。在你的ActiveX控件中CLSID_SafeItem的值需要等于你在MyActiveXCtrl.cpp文件中的IMPLEMENT_OLECREATE_EX,同时,这个值也要和你在网页中的OBJECT ID标记CLSID值相同。

 #include "comcat.h"

 #include "strsafe.h"

 #include "objsafe.h"

 

 // CLSID_SafeItem - Necessary for safe ActiveXcontrol

 // Id taken from IMPLEMENT_OLECREATE_EXfunction in xxxCtrl.cpp

 

 const CATID CLSID_SafeItem =

 { 0x36299202, 0x9ef, 0x4abf,{ 0xad, 0xb9,0x47, 0xc5, 0x99, 0xdb, 0xe7, 0x78}};

 

 // HRESULT CreateComponentCategory - Used toregister ActiveX control as safe

 

 HRESULT CreateComponentCategory(CATID catid,WCHAR *catDescription)

 {

    ICatRegister *pcr = NULL ;

    HRESULT hr = S_OK ;

 

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

            NULL, CLSCTX_INPROC_SERVER,IID_ICatRegister, (void**)&pcr);

    if (FAILED(hr))

        return hr;

 

    // Make sure the HKCR\ComponentCategories\{..catid...}

    // key is registered.

    CATEGORYINFO catinfo;

    catinfo.catid = catid;

    catinfo.lcid = 0x0409 ; // english

    size_t len;

    // Make sure the provided description isnot too long.

    // Only copy the first 127 characters if itis.

    // The second parameter of StringCchLengthis the maximum

    // number of characters that may be readinto catDescription.

    // There must be room for aNULL-terminator. The third parameter

    // contains the number of charactersexcluding the NULL-terminator.

    hr = StringCchLength(catDescription,STRSAFE_MAX_CCH, &len);

    if (SUCCEEDED(hr))

        {

        if (len>127)

          {

            len = 127;

          }

        }  

    else

        {

          // TODO: Write an error handler;

        }

    // The second parameter of StringCchCopy is128 because you need

    // room for a NULL-terminator.

    hr = StringCchCopy(catinfo.szDescription,len + 1, catDescription);

    // Make sure the description is nullterminated.

    catinfo.szDescription[len + 1] = '\0';

 

    hr = pcr->RegisterCategories(1,&catinfo);

    pcr->Release();

 

    return hr;

}

 

// HRESULTRegisterCLSIDInCategory -

//      Register your component categoriesinformation

 

HRESULTRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

{

// Register yourcomponent categories information.

    ICatRegister *pcr = NULL ;

    HRESULT hr = S_OK ;

    hr =CoCreateInstance(CLSID_StdComponentCategoriesMgr,

                NULL, CLSCTX_INPROC_SERVER,IID_ICatRegister, (void**)&pcr);

    if (SUCCEEDED(hr))

    {

       // Register this category as being"implemented" by the class.

       CATID rgcatid[1] ;

       rgcatid[0] = catid;

       hr =pcr->RegisterClassImplCategories(clsid, 1, rgcatid);

    }

 

    if (pcr != NULL)

        pcr->Release();

           

    return hr;

}

 

// HRESULTUnRegisterCLSIDInCategory - Remove entries from the registry

 

HRESULTUnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

{

    ICatRegister *pcr = NULL ;

    HRESULT hr = S_OK ;

 

    hr =CoCreateInstance(CLSID_StdComponentCategoriesMgr,

            NULL, CLSCTX_INPROC_SERVER,IID_ICatRegister, (void**)&pcr);

    if (SUCCEEDED(hr))

    {

       // Unregister this category as being"implemented" by the class.

       CATID rgcatid[1] ;

       rgcatid[0] = catid;

       hr = pcr->UnRegisterClassImplCategories(clsid,1, rgcatid);

    }

 

    if (pcr != NULL)

        pcr->Release();

 

    return hr;

}


改变DllRegisterServer方法:

STDAPIDllRegisterServer(void) {

    HRESULT hr;    // HResult used by Safety Functions

 

    AFX_MANAGE_STATE(_afxModuleAddrThis);

 

    if(!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))

      returnResultFromScode(SELFREG_E_TYPELIB);

 

    if(!COleObjectFactoryEx::UpdateRegistryAll(TRUE))

      return ResultFromScode(SELFREG_E_CLASS);

 

    // Mark the control as safe forinitializing.

                                            

    hr =CreateComponentCategory(CATID_SafeForInitializing,

         L"Controls safely initializablefrom persistent data!");

    if (FAILED(hr))

      return hr;

 

    hr =RegisterCLSIDInCategory(CLSID_SafeItem,

         CATID_SafeForInitializing);

    if (FAILED(hr))

        return hr;

 

    // Mark the control as safe for scripting.

 

    hr =CreateComponentCategory(CATID_SafeForScripting,

                                L"Controls safely scriptable!");

    if (FAILED(hr))

        return hr;

 

    hr =RegisterCLSIDInCategory(CLSID_SafeItem,

                       CATID_SafeForScripting);

    if (FAILED(hr))

        return hr;

 

    return NOERROR;

}

修改DllUnregisterServer方法:

STDAPIDllUnregisterServer(void)

{

    HRESULT hr;    // HResult used by Safety Functions

 

    AFX_MANAGE_STATE(_afxModuleAddrThis);

 

    if (!AfxOleUnregisterTypeLib(_tlid,_wVerMajor, _wVerMinor))

      returnResultFromScode(SELFREG_E_TYPELIB);

 

    if(!COleObjectFactoryEx::UpdateRegistryAll(FALSE))

      return ResultFromScode(SELFREG_E_CLASS);

 

    // Remove entries from the registry.

 

   hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,

                     CATID_SafeForInitializing);

    if (FAILED(hr))

      return hr;

 

   hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,

                       CATID_SafeForScripting);

    if (FAILED(hr))

      return hr;

 

    return NOERROR;

}

ActiveX控件属性、方法以及事件

在ActiveX控件和网页之间传递消息需要通过属性、方法以及事件。为了便于展示这方面的技术,我们将要创建一个简单的网页,其中包含了简单的form元素,包括一个文本框与一个提交按键,文本通过一个输入参数属性被输入到ActiveX控件中。有一个控件方法把文本拷贝到输出参数属性上,然后激发一个事件把文本显示到网页中。我们需要做下列步骤:

 

  • 1.首先,我们需要建立一个ActiveX控件属性来用作处理文本。在类视图中,展开MyActiveXLib元素,选择_DMyActiveX。右键单击_DMyActiveX,选择增加,增加属性。在添加属性向导对话框中(图9),选择BSTR作为属性类型,输入“InputParameter”作为属性名称。向导会帮助自动添入其他项目,“m_InputParameter”作为变量名称,“OnInputParameterChanged”作为通知函数。选择完成按键来让向导自动创建属性代码。同样的方法,我们添加BSTR类型的“OutputParameter”属性。

http://www.codeproject.com/com/CompleteActiveX/image018.gif

图9. 添加属性向导

  • 2.然后,我们需要创建一个方法用来让网页通知控件输入字符串参数。在类视图中,展开MyActiveXLib元素,右键单击_DMyActiveX,选择增加,增加方法。在添加方法向导对话框中(图10),返回值选择void类型,输入“LoadParameter”作为方法名称。向导会自动帮助我们添入“LoadParameter”作为内部名称。 选择完成按键来让向导自动创建方法代码。

http://www.codeproject.com/com/CompleteActiveX/image020.jpg

Figure 10. 添加方法向导

  • 3.最后,我们将要创建一个ActiveX控件事件用来通知网页完成文本从输入参数到输出参数的传递。在网页中的代码将会对这个事件进行处理并显示输出参数中的文本,用来校验在ActiveX控件中的转换是否正确。在类视图中,右键单击CMyActiveXCtrl,选择增加,增加事件。在添加事件向导对话框中(图11),输入“ParameterLoaded”作为事件名称,并把内在的名称改为“FireParameterLoaded选择完成按键来让向导自动创建代码来支持事件。


http://www.codeproject.com/com/CompleteActiveX/image022.jpg

图11.添加事件向导

在上面的过程中,向导帮助我们创建了大多数的工作。我们只需要简单的添加几行代码来添加ActiveX控件拷贝文本和通知网页的事件。编辑文件MyActiveXCtrl.cpp,并且增加下面的代码来读入参数。

// Copy text fromthe input parameter to the output parameter

m_OutputParameter= m_InputParameter;

// Fire an eventto notify web page

FireParameterLoaded();

为了测试,下面使用ActiveX ControlPad工具来创建HTML代码:

<HTML>

<HEAD>

<TITLE>MyActiveX- Methods, Properties, and Events</TITLE>

 

<SCRIPTLANGUAGE="JavaScript">

 

functionPassParameter()

{

    if (StringInput.value != "")

    {

        MyActiveX1.InputParameter =StringInput.value;

        MyActiveX1.LoadParameter();

    }

}

</SCRIPT>

 

</HEAD>

<BODY>

< CENTER>

MyActiveX -Methods, Properties, and Events Example

< P></P>

 

<OBJECTID="MyActiveX1" WIDTH=350 HEIGHT=50

 CLASSID="CLSID:36299202-09EF-4ABF-ADB9-47C599DBE778">

    <PARAM NAME="_Version"VALUE="65536">

    <PARAM NAME="_ExtentX"VALUE="2646">

    <PARAM NAME="_ExtentY"VALUE="1323">

    <PARAM NAME="_StockProps"VALUE="0">

</OBJECT>

< p></p>

 

Input Parameter:<INPUT TYPE ="text" NAME="StringInput" VALUE="">

< p></p>

<INPUTTYPE="button" NAME="Submit"

       VALUE="Submit"ONCLICK=PassParameter()>

 

<SCRIPTFOR=MyActiveX1 EVENT=ParameterLoaded()>

</SCRIPT>

 

< /center>

</BODY>


储存这些HTML代码到你的服务器上,并运行它。你将会看到一个网页显示一个进度条,并且拥有一个提交文本的form元素,其中包含一个文本输入框和一个提交按键。党提交后会显示一个新的页面,在其中显示“The parameter you entered is: ”,和你输入的文本。下面我们将会对网页HTML代码介绍一下概况。

 

当你按下提交,JavaScript脚本函数PassParameter将会被调用。在这个函数中在StringInput中的文本将会被拷贝到ActiveX控件的InputParameter属性中。接下来方法LoadParameter被调用,把InputParameter属性的值拷贝到OutputParameter中,最后调用FireParameterLoaded()来触发一个ActiveX事件。下面的HTML代码被用来处理这个事件。

 

<SCRIPTFOR=MyActiveX1 EVENT=ParameterLoaded()>

</SCRIPT>

 

0 0
原创粉丝点击