首页 > 编程知识 正文

一个有效减少注册控件时360弹窗警告的方案是什么,一个有效减少注册控件时360弹窗警告的方案包括

时间:2023-05-06 10:09:12 阅读:285984 作者:484

我们自己开发的COM控件,在注册或反注册时可能会被360等安全软件拦截,如下图:

甚至会被认为是木马程序。出现上述情况,我们可以选择“允许程序所有操作”并“不再提醒”,让控件程序继续正常注册或反注册。但如果一个安装程序里有大量的COM控件需要注册,安装过程中就会多次弹出窗口需要用户手动点击确认,这种使用体验效果可想而知。而且如果当中不小心点击错一个,那么相应的控件将注册失败,整个安装过程可能也会失败。

针对上述问题,你当然可以让用户先退出360等安全软件再安装,但从目前360在桌面电脑的占有率来看,这同样会造成用户安装软件的门槛。同时,在有些政府或企业应用环境下,360已经是安全策略之一,用户在终端不是能轻易退出的。

当然,你可以选择和360联系,申请把你的控件加入到它的白名单里。我们当初也是这么做的,但申请了一年多了,石沉大海,杳无音信……而且以后你的控件版本升级后,又需要重新申请……

在这里,根据工作经验,推荐一种可以有效降低(但不能完全消除)弹窗干扰的解决方案:不使用Windows自带的注册命令(regsvr32.exe),而是自己开发一个控件注册程序来注册控件。这个注册程序本质上和regsvr32一样,所以在首次注册控件时一样会有360弹窗提示。但你在弹窗中选择“允许程序所有操作”后,这个控件注册程序就被360信任了,以后再用这个程序注册其他COM控件,360不会弹出任何提示或警告了。这样一个安装包里即使有再多的COM控件,使用这个程序注册的话,最多也只有一次和注册控件有关的弹窗。原因就在于使用Windows注册命令时,360监控的是每一个要注册的dll,而使用自己开发的程序时,360只监控这个程序。

开发这样的程序很简单, 后缀为dll和ocx的COM控件本质上还是动态链接库。用Dependency等工具打开一个COM控件,可以看到起码都要包含以下几个接口。

只需要调用里面的DllRegisterServer方法和DllUnregisterServer方法即可实现对控件的注册与反注册。调用方法与调用其他动态链接库接口无异,注册功能的示例代码如下:

typedef HRESULT (*RegServer)(void);

HMODULE hDll = NULL;

RegServer dllServer = NULL;

hDll = ::LoadLibrary(filePath); // filePath是要注册的控件文件路径

dllServer = (RegServer)::GetProcAddress(hDll,“DllRegisterServer”);//得到DllRegisterServer方法的地址

dllServer();//执行DllRegisterServer

FreeLibrary(hDll);

反注册功能的代码除了调用的方法,其他基本和它一样,不再贴出。

还有几点要说明的是:

1.本方法只适用于 dll,ocx 等进程内COM控件,对于exe结尾的进程外COM控件不适用。

2.如果控件是基于64位的,那这个注册程序也必须是64位的。

3.Visual Studio制作的安装程序制作工程中提供了几种COM控件注册方式。微软推荐的是vsdrfCOM,这种方式下制作工具会将控件注册后对注册表值的修改全部记录下来,安装时会按同样的方式直接目标机器的注册表,以实现对控件的注册。本来这种方法如果可行的话,应该可以彻底消除360的弹窗问题。但实际使用发现,由于安装程序制作机器与目标机器的差异等原因,这种方式下控件经常无法注册。而使用vsdrfCOMSelfReg方式,安装程序就调用regsvr32.exe注册。如果用上面介绍的自行开发程序注册,那这里就要选择vsdrfDoNotRegister方式,即不让安装程序去注册。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。