ok,开工吧:
开发工具:推荐用delphi 2010(d7也可以,不过添加属性,方法等过程要手动,稍微麻烦点)
1.启用delphi2010-->File->New->Other-->Active Library
2.项目命名为MyActiveX
3.File-->Save All 全部保存
实际上这样就能编译了,不过只是空的dll
4.File-->New-->Other-->Active Form
改名为MyForm
将对应的单元文件,保存为UMyForm.pas
5.打开MyAcitveX.ridl文件,切换到design视图,选中IMyForm接口,右击New-->Property
添加一个属性Msg
将Msg属性的Type改为BSTR 即WideString类型
完了之后,点击工具栏中的Refresh
Implementation(即上图中工具栏中圈起来的部分)--这一步很重要,点击之后,它将自动生成属性Msg对应的声明和实现代码模板
6.打开UMyForm.pas--即ActiveForm对应的单元,找到Set_Msg以及Get_Msg的实现部分,补充代码如下:
function TMyForm.Get_Msg: WideString
begin
result:=_msg
end
procedure TMyForm.Set_Msg(const Value: WideString)
begin
_msg := value
end
当然TMyForm的private部分,得先加一个私有成员
type
TMyForm = class(TActiveForm, IMyForm)
private
{ Private declarations }
_msg:WideString
...
这样我们就为即将生成的ActiveX控件,添加了一个字符串类型的属性Msg,下面来测试一下:
7.编译项目,会生成一个MyActiveX.ocx,在运行栏里输入
regsvr32 C:\Users\jimmy.yang\Desktop\Delphi_activex\MyActiveX\MyActiveX.ocx
注:这里ocx的路径,请各位根据自己的实际路径修改
这样就完成了ocx的注册。
8.放到html里测试一下:
<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>
<script type='text/JavaScript'>
var x = document.getElementById("x")
alert(x.Msg)
</script>
关于CLSID在哪里查看,打开:MyActiveX_TLB.pas文件,定位到下面这里:
const
// TypeLibrary Major and minor versions
MyActiveXMajorVersion = 1
MyActiveXMinorVersion = 0
LIBID_MyActiveX: TGUID = '{49138437-8265-4B1A-9EAE-D0F615D68464}'
IID_IMyForm: TGUID = '{54A20855-29A3-4C92-85DE-A419DA457C7A}'
DIID_IMyFormEvents: TGUID = '{60BBC967-E1E6-4E98-BAE5-776BFD06E9CC}'
CLASS_MyForm: TGUID = '{52D17094-0687-4A2F-B2DB-30F3189AC659}'
其中 CLASS_MyForm: TGUID对应的就是ClassID
运行后,除了弹出一个空白的警告框,暂时看不到其它:)(可不就是这样么?Msg属性没给任何初始值,当然是空字符串,所以弹出一个空的警告框是正常的)
9.我们再来添加一些控件和方法,以验证刚才设置的属性确实有效
在MyForm上添加一个文件框,一个按钮
按钮的事件如下:
procedure TMyForm.Button1Click(Sender: TObject)
begin
_msg:= self.Edit1.Text
end
即把文本框的值赋给属性Msg
再继续定位到Set_Msg,略做修改
procedure TMyForm.Set_Msg(const Value: WideString)
begin
_msg := value
self.Edit1.Text := _msg
end
即设置Msg属性时,同时也把值显示在文本框里,以便等会儿我们好测试在js中给activeX属性赋值的效果
ok了,再来测试一下,编译一下,如果通不过,请先运行
regsvr32 C:\Users\jimmy.yang\Desktop\Delphi_activex\MyActiveX\MyActiveX.ocx /u
将刚才注册的ocx反注册,同时关掉浏览器,不然该ocx文件一直被占用,无法更新.
修改一下html的代码:
<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>
<hr />
<input type='button' value='显示Msg属性的值' onclick='ShowMsg()'/>
<input type='button' value='设置Msg属性的值' onclick='SetMsg()'/>
<script type='text/JavaScript'>
var x = document.getElementById("x")
var ShowMsg = function(){
alert(x.Msg)
}
var SetMsg = function(){
x.Msg = 'js传过来的值'
}
</script>
ActiveX控件调用JavaScript函数的方法1.向ActiveX注册JS函数:
在ActiveX中添加接口方法 - void RegisterFunction(BSTR bstrFuncName, IDispatch* dispFunc)
JavaScript代码声明一个函数,并调用RegisterFunction接口向ActiveX注册该函数,供ActiveX调用。
2.保存注册的函数,ActiveX使用CComDispatchDriver对象保存注册的JS函数(IDispatch接口指针)
CComDispatchDriver m_Func1
void RegisterFunction(BSTR bstrFuncName, IDispatch* dispFunc)
{
if (bstrFuncName == "1")
m_Func1 = dispFunc
}
3.调用注册的函数,ActiveX使用CComDispatchDriver::InvokeN函数调用注册的函数
以下是对接受一个无符号整型参数的JS函数的调用:
VARIANT varArg[1]
varArg[0].vt = VT_UINTvarArg[0].uintVal = 1
try{
m_Func1.InvokeN((DISPID)DISPID_VALUE, varArg, 1)
}
catch(...){}
4.注意,对JS函数的调用必须在ActiveX程序的主线程中执行!
单击“开始”,指向“设置”,单击“控制面板”,双击“添加/删除程序”,然后单击“安装/卸载”选项卡。 2. 如果您要删除的 ActiveX 控件出现在安装的程序列表中,请单击该 ActiveX 控件,单击“添加/删除”,然后按照屏幕上的说明操作。如果该 ActiveX 控件没有出现在安装的程序列表中,则继续执行下一步。 3. 单击“开始”,单击“运行”,在“打开”框中键入下列行,然后单击“确定”: regsvr32 drive:\windows\occache\filename.ocx /u 注意:drive 是 Windows 文件夹所在的驱动器号,windows 是安装 Windows 的文件夹名,而 filename.ocx 是您想要删除的 ActiveX 控件。 注意:如果您不知道要删除的 ActiveX 控件 (.ocx) 的文件名,则可以通过查看安装或使用 ActiveX 控件的 Web 页的超文本标记语言 (HTML) 源文件来确定该文件名。若要查看一个 Web 页的 HTML 源文件,请右击该 Web 页的空白区域,然后单击“查看源文件”。 4. 在 Windows 资源管理器或 Windows NT 资源管理器中,单击 Windows\Occache 文件夹中的 .ocx 文件,然后单击“文件”菜单上的“删除”。 Occache 是在 Internet Explorer 3.x 的所有版本中安装有 ActiveX 控件的文件夹的名称。Regsvr32.exe 文件是由 Internet Explorer 安装的,并且可用于注册和删除 ActiveX 控件的注册表项。 Internet Explorer 4.x 或更高版本(所有平台) Internet Explorer 4.x 或更高版本,包括 Occache.dll 文件,该文件可用于使用“shell 文件夹”枚举、更新和安全地卸载 ActiveX 控件。 1. 单击“开始”,指向“设置”,单击“控制面板”,双击“添加/删除程序”,然后单击“安装/卸载”选项卡。 2. 如果您要删除的 ActiveX 控件出现在安装的程序列表中,请单击该 ActiveX 控件,单击“添加/删除”,然后按照屏幕上的说明操作。如果该 ActiveX 控件没有出现在安装的程序列表中,则继续执行下一步。 3. 在 Windows 资源管理器或 Windows NT 资源管理器中,双击 Windows\Downloaded Program Files 文件夹或 Winnt\Downloaded Program Files 文件夹,右击您想要删除的 ActiveX 控件,然后单击“删除”。 4. 在系统提示您是否删除该 ActiveX 控件后,单击“是”。 重要说明:如果您正运行 Internet Explorer 4.0,则不应删除以下 ActiveX 控件: ?? DirectAnimation Java Classes ?? Internet Explorer Classes for Java ?? Microsoft XML Parser for Java ?? Win32 Classes Internet Explorer 5.0 或更高版本不要求 Downloaded Program Files 文件中的这些组件。 删除 ActiveX 控件时出现的错误信息 在您尝试使用 Occache shell 文件夹删除一个 ActiveX 控件时,可能显示以下错误信息之一: ?? Share Violation These program files are currently being used by one or more programs.Please close some programs, and try again.You may need to restart Windows. ?? Component Removal About to remove a Windows system DLL:(<path\filename).Okay to delete?共享冲突:如果您正要删除的 ActiveX 控件当前在内存中由 Internet Explorer 或“活动桌面”组件加载,则显示此错误信息。 若要解决此错误信息,请按照下列步骤操作: 1. 关闭所有打开的 Internet Explorer 窗口。 2. 禁用“活动桌面”。为此,请右击桌面上的空白区域,指向 Active Desktop,然后单击“按 Web 页查看”以清除该复选标记。 3. 按照本文中前面部分的“Internet Explorer 4.0 或更高版本”部分中介绍的步骤,删除该 ActiveX 控件。 注意:您最好在删除 ActiveX 控件前重新启动 Windows。 组件删除:当您要删除的 ActiveX 控件向已注册的 Occache 文件夹以外的文件夹(例如,Windows\System 或 Winnt\System32)安装文件时,该信息只出现在 4.01 Service Pack 1 (SP1) 之前的 Internet Explorer 4 版本中。Occache 不是总能确定这些文件是否正由其程序共享。 如果您确定消息中显示的一个或多个文件未由 Windows 或其他程序使用,请单击“是”。否则,单击“否”。