用C#编写ActiveX控件(二)
用
C#
编写
ActiveX
控件(二)
Homer
在我的上一篇 blog 中,已经实现了一个最基本的 ActiveX 控件。当然,我们编写的任务还没有完成。首先,我们先尝试实现和 JS 的交互能力。
现在,重新访问
我们在
Demo
中加
入
ShowMessage
方法:
public
void
ShowMessage(
string
msg)
{
if
(msg
!=
null
)
{
MessageBox.Show(msg);
}
}
我们重新编译。在重新访问页面之前,我们先来修改
html
代码:
<
body
bgcolor
='#223344'>
<object id
="helloworld"
classid
="clsid:9551B223-6188-4387-B293-C7D9D8173E3A"
Width
="184"
Height
="96"
>
</
object
>
<
br
>
<
input
type
='button'
onclick
='helloworld.ShowMessage(“Hello
World!”)' value
='Click'>
</body
>
http://localhost/helloworld.htm
,单击
Click
按钮,应该可以实现交互了。
但是结果却很遗憾,我们发现
IE
跳出了对话框,如图所示:
单击确定之后,我们发现JS报错。根据提示,我们判断可以通过修改IE的设置使控件运行。打开IE的 工具——〉Internet选项——〉安全——〉本地Intranet——〉自定义级别——〉对没有标记为安全的ActiveX控件进行初始化和运行,将其值设为启用。我们刷新页面,现在终于可以正确运行了。
当然,我们不能指望我们的客户和我们一样修改这个值。毕竟,一是操作麻烦,二是给电脑带来了很大的安全风险。在互联网上搜索之后,发现必须要实现
IObjectSafety
接口,把
ActiveX
控件标记为安全的
ActiveX
控件。在搜索
MSDN
之后,我找到了
IObjectSafety
接口的定义。这就好办了。首先我们自己用
C#
实现这个接口:
[Guid(
"
CB5BDC81-93C1-11CF-8F20-00805F2CD064
"
),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public
interface
IObjectSafety
{
//
methods
void
GetInterfacceSafyOptions(
System.Int32 riid,
out
System.Int32 pdwSupportedOptions,
out
System.Int32 pdwEnabledOptions);
void
SetInterfaceSafetyOptions(
System.Int32 riid,
System.Int32 dwOptionsSetMask,
System.Int32 dwEnabledOptions);
}
注意,这个
GUID
是不能改的。然后,我们在
Demo
类里面实现这个接口。增加一下代码:
IObjectSafety 成员
重新编译,然后将
IE
里面的设置改回来。现在,我们发现,和
JS
的交互已经没有问题了。
这样,一个最基本的
ActiveX
控件已经写好了。你可以在这个控件的基础上增加任何你需要的功能。到这里,编写控件的任务已经完成了,我们的下一个目标就是发布它。