执行PHP客户端脚本调用.NET和VCL的浏览器(含源)

翻译|其它|编辑:郝浩|2007-12-29 11:21:15.000|阅读 1580 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

一、在文件打开 OpenFile()的实现分以下几个部分:

1 装入 Composite Bridges,调用 Reload_dvm();

Reload_dvm();可以识别 Composite Bridges 是否已经装入,如果已经装入则先卸掉之前的装入,然后重新装入。这样2次打开 PHP 也不至于有相同的类或者函数重复被 PHP 解释产生错误。

2 产生"theBrowser"对象,并作为 Composite Bridges 的共享对象(命名为"window"),这样,PHP 代码可以用此来操纵这个"theBrowser"对象。

3 识别 PHP 文件扩展名,如果是 PHP 文件,则产生"php"对象,该对象有一个 execute_script 方法可以解释 PHP 文件并产生 html 格式字符串返回,浏览器把返回的 html 字符串写入*.htm 文件,然后像通常的 html 文件打开一样用 file://开头的 URL 打开,即可显示解释后的 PHP 页面了。

二、解释页面里面的 PHP 客户端脚本

与上面的解释不同,PHP 文件通过<?php . . . ?>来表示原先在服务器执行的 PHP 代码的,而页面里的在客户端执行的代码 <SCRIPT language="PHP" runat="CLIENT"> . . . </SCRIPT> 这些代码在浏览器中产生了 IHTMLScriptElement 接口 COM 对象,通过遍历整个 DOM 树可以找到,遍历整个 DOM 树在本例是 GetScriptCode 函数。在事件 OnNavigateComplete2中调用 GetScriptCode 遍历整个 DOM 树,发现 PHP 客户端脚本,又一次调用"php"对象的 execute_script 方法,来实现相关的逻辑。

三、代码及其执行效果

1 简单装入、产生、显示

我们来看看以下 PHP 客户端代码会产生什么效果

<SCRIPT language="PHP" runat="CLIENT">

$ds=new dsRE();

//call VCL

$ds->LoadBridge("..\\dsRE\\VCL_Bridge.dll");

$ds->UsingClass("TForm");

$form=new TForm();

$ds->Share($form,"Form1");

$form->Show();

$form->Caption="I am a VCL TForm";

</SCRIPT>
 
 
<!--[if !vml]-->

<SCRIPT language="PHP" runat="CLIENT">
$ds=new dsRE();

//call VCL
$ds->LoadBridge("..\\dsRE\\VCL_Bridge.dll");
$ds->UsingClass("TForm");
$form=new TForm();
$ds->Share($form,"Form1");
$form->Show();
$form->Caption="I am a VCL TForm";
</SCRIPT> <!--[endif]-->

该代码装入了 VCL 库,然后产生一个 TForm,并设置这个 Form 的标题为"I am a VCL TForm",如下图:

<!--[if !vml]--><!--[endif]-->

2 委托响应消息

再看看下面一行:

$ds->RegistMethod("OnFormClick",$form,"OnClick");

<!--[if !vml]-->

$ds->RegistMethod("OnFormClick",$form,"OnClick");<!--[endif]-->

这行代码可以进行委托,在刚才产生的 Form 的 OnClick 事件中调用 PHP 的 OnFormClick 函数:

function OnFormClick($sender) {

    $sender->Caption="Clicking a VCL TForm";

}

 
<!--[if !vml]-->

function OnFormClick($sender) {
    $sender->Caption="Clicking a VCL TForm";
}<!--[endif]-->
 
OnFormClick 函数是让 Form 的标题由原来的"I am a VCL TForm"改变为"Clicking a VCL TForm"。

是不是很有意思?PHP 也可以操纵 VCL 了。
 

3 操纵浏览器本身

下面我们来看看 PHP 如何操纵浏览器本身。

$window=$ds->GetSharedObject("window");

$window->hide();

$window->show();
 
<!--[if !vml]-->

$window=$ds->GetSharedObject("window");
$window->hide();
$window->show();<!--[endif]-->

上述代码先获得共享名为"window"的对象,即 MFC 写的"theBrowser"对象。上述代码让浏览器隐藏后又显示。作为演示,简单了一点。MFC 写的"theBrowser"对象要提供 hide 和 show 接口,需要编写 C++代码:

BEGIN_DSRE_POPULAR_OBJECT(CClientBrowserApp)

         DEFINE_POPULAR_METHOD(CClientBrowserApp,hide);

         DEFINE_POPULAR_METHOD(CClientBrowserApp,show);

END_DSRE_POPULAR_OBJECT()g_impl;
 
<!--[if !vml]-->

BEGIN_DSRE_POPULAR_OBJECT(CClientBrowserApp)
    DEFINE_POPULAR_METHOD(CClientBrowserApp,hide);
    DEFINE_POPULAR_METHOD(CClientBrowserApp,show);
END_DSRE_POPULAR_OBJECT()g_impl;<!--[endif]-->

4 调用.NET

接下来让我们看看 PHP 是如何产生.NET 的 WinForm 和操纵 C#写的 DLL 的。

//call .NET
$ds->LoadBridge("..\\dsRE\\DotNET_Bridge_ThroughVC.dll");
$ds->UsingClass("System.Windows.Forms.Form");
$winform=new System_Windows_Forms_Form();
$winform->Show();//call .NET

$ds->LoadBridge("..\\dsRE\\DotNET_Bridge_ThroughVC.dll");

$ds->UsingClass("System.Windows.Forms.Form");

$winform=new System_Windows_Forms_Form();

$winform->Show();
 
<!--[if !vml]--><!--[endif]-->

上述代码简单的产生了一个 WinForm,然后显示它。

$DotNET_Bridge=$ds->GetSharedObject("DotNET_Bridge");
$DotNET_Bridge->LoadDotNETLibrary("..\\dsRE\\CSharpUI.dll");

$ds->UsingClass("CSharpUI.CSharpForm");
$UI=new CSharpUI_CSharpForm();
$UI->StartupMe();

上述代码调用"DotNET_Bridge"对象的 LoadDotNETLibrary 方法,装入用 C#预先编写好的 CSharpUI.dll,如下图:
<!--[if !vml]--><!--[endif]-->

 上面的 Button 和 Eidt 的 Click 事件和 TextChanged 事件分别被以下代码实现委托:

$Button1=$ds->GetSharedObject("Button1");

$ds->RegistMethod("OnDNButtonClick",$Button1,"Click");

$Edit1=$ds->GetSharedObject("Edit1");

$ds->RegistMethod("OnDNTextChanged",$Edit1,"TextChanged");
 
<!--[if !vml]-->

$Button1=$ds->GetSharedObject("Button1");
$ds->RegistMethod("OnDNButtonClick",$Button1,"Click");
$Edit1=$ds->GetSharedObject("Edit1");
$ds->RegistMethod("OnDNTextChanged",$Edit1,"TextChanged");
<!--[endif]-->

响应 Click 事件执行

function OnDNButtonClick() {

    $form=dsRE_GetSharedObject(NULL,"Form1");

    $form->Caption="Clicking a .NET button";

}

<!--[if !vml]-->

function OnDNButtonClick() {
    $form=dsRE_GetSharedObject(NULL,"Form1");
    $form->Caption="Clicking a .NET button";
}
<!--[endif]-->

效果是:

<!--[if !vml]--><!--[endif]-->

响应 TextChanged 事件执行

ffunction OnDNTextChanged() {

    $form=dsRE_GetSharedObject(NULL,"Form1");

    $Edit1=dsRE_GetSharedObject(NULL,"Edit1");

    $form->Caption="Edit in Winform : ".$Edit1->Text;

}
 
<!--[if !vml]-->

ffunction OnDNTextChanged() {
    $form=dsRE_GetSharedObject(NULL,"Form1");
    $Edit1=dsRE_GetSharedObject(NULL,"Edit1");
    $form->Caption="Edit in Winform : ".$Edit1->Text;
}<!--[endif]-->

效果是:

<!--[if !vml]--> <!--[endif]-->

四、应用场合

1 浏览器与客户端混合的应用

现在的很多客户端应用都集成了 IE 核心的浏览器。这些应用使用IE核心浏览器主要用于广告,帮助文档展示。实际的用户操作还是由客户端程序编写的。这些应用如果能执行 PHP 脚本,那么,部分的用户操作可以在 IE 核心的浏览器上进行,尤其对于经常改变业务流程的部分来说。

2 需要解释型脚本作为扩展(script plug-in)的应用,类似 VBA 的功能。

以前要支持 plug-in 功能,需要编写基于 COM 服务的应用,非常烦琐,现在可以简单易行,而且是支持 script 的 plug-in。

3 原型化开发支持

原型化开发的特征是尽早推出可以运行的原型,这个浏览器就是一个原型,要扩充功能只需要编写脚本。

4 用可伸缩的浏览器作为富客户端的应用

一些基于浏览器的应用来说,全部功能都在浏览器完成,如果需要小型客户端的时候只能安装升级这些部件。如果集成 PHP 解释功能的浏览器,则可以兼顾浏览器和客户端的功能,而无需每个小型客户端逐个升级。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:.NET博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP