如何加载activex控件件是加载到主程序的内存空间吗 csdn

7601人阅读
iOS开发中,必然会使用到显示图片.然而在你的APP中使用大量图片以后,检查内存时你会发现,哇!!!内
存已经超过200M甚至更多(模拟器中内存上不封顶).这时iPhone4很容易造成程序闪退,如果内存控制的很不好,即使是6s也会发生程序闪退.
当发生这种情况时,我想你一定使用过 如下方法
let newImageData = UIImageJPEGRepresentation(newImage, 0.5)
& & 这样类似的方法可以减少图片的大小.但是效果.一张30M的图片,压缩以后还剩15M?还是太大了,这样十张图片就150M了,加上一些基础的功能,一个APP内存超过200M根本不是事.当你的程序进入后台,一段时间不使用,当你再次进入这个APP的时候,你就需要重新加载这个APP.但是你会发现一些优秀的APP在进入后台后,再次唤醒时,是恢复进入后台前的状态.
& & why?因为你的APP在进入后台一段时间以后,所占内存被系统自动清理了...因为你的APP所占内存过大.iOS系统有优秀的内存清理机制,使得系统随时有足够的空闲内存.一些所占内存过大的应用,在进入后台一段时间以后,就会被系统关闭,并且释放内存.所以当你再次进入这个应用的时候,不是恢复到之前的状态,而是从新加载.
& & 当你使用
UIImagePickerController
& & 这个方法来调用图片库和相机的时候,你所选择的图片是原图.这个图片所占内存空间是非常大的.选择的图片会被加载到内存.连续选择多张图片会直接使得程序闪退.即使使用UIImageJPEGRepresentation或者类似的压缩图片的方法也不会解决根本的问题.那么如何加载图片才能有效的控制内存呢?
& & 答案是画布
UIGraphicsBeginImageContext
& & 当你选择图片的时候,可以根据你的iPhone的屏幕大小,来进行截图.这样得来的图片会由原来的800W像素降低为手机屏幕的像素.再进行一次压缩,这样得来的图片大小之后10-25K的大小.画质呢?用手机看,不进行缩放的情况下,和原图是一模一样.内存瞬间无压力了.尤其是即时聊天,发送图片,节约流量,图片又清晰.
& & 代码如下:
func useImage(image: UIImage) -& NSData {
//实现等比例缩放
let hfactor = image.size.width / screnW
let vfactor = image.size.height / screnH
let factor = fmax(hfactor, vfactor);
//画布大小
let newWith: CGFloat = image.size.width / factor
let newHeigth: CGFloat = image.size.height / factor
let newSize = CGSize(width: newWith, height: newHeigth)
UIGraphicsBeginImageContext(newSize)
image.drawInRect(CGRect(x: 0, y: 0, width: newWith, height: newHeigth))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//图像压缩
let newImageData = UIImageJPEGRepresentation(newImage, 0.5)
return newImageData!
& & 以上想法来自于我的好友,ChengboQin.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9496次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'1213人阅读
开发ActiveX控件过程中遇到这样的问题:
本机上开发完成后,用TstCon测试接口没问题。js写静态页面测试调用没问题。但是给到web端开发,他们使用内网IP或者外网地址时,会报错。如图:
开始以为是IE本地设置的问题,把对ActiveX限制的都改为允许,但是试了之后还是不行。后来联想到是否是因为本地调试IE用的Intranet策略,而以IP方式访问IE采用的是Internet策略。所以果断去设置Internet选项,如图,。
点开自定义级别,
把上图中『对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本』改为启用后,发现有的机器可以,有的不成,而且设置后IE会提示不安全之类的。看起来很不优雅。果断放弃修改IE设置。
仔细想想,自己写的跟官方提供的一些控件理论上除了没有数字签名外,应该没别的不同,于是尝试增加数字签名,当然这个是没有认证的。尝试后这个方案也失败了。
找资料看到这样一篇文章:/758961.html
里面讲到,在IE的中级安全设置上,是允许脚本安全的ActiveX创建并且不予警告的。那么IE怎么知道一个插件式脚本安全的呢?
①通过查询ActiveX是否实现了IObjectSafety接口,并且返回脚本安全;
②查询ActiveX是否在注册表Component Category Manager里表明自己实现了 CATID_SafeForInitializing 和 CATID_SafeForScripting。此方法修改DllRegisterServer函数
所以,问题的关键是我们自己的ActiveX控件 实现CATID_SafeForInitializing 和 CATID_SafeForScripting,以及IObjectSafety接口。
那就来吧。
①实现CATID_SafeForInitializing &和 CATID_Safeforscripting
XXX.h中声明(以下XXX代表你的工程名,比如MyActiveX,则XXX.h表示MyActiveX.h)
包含头文件文件 &#include &comcat.h&
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
①xxxCtrl.h中声明:
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions)
*pdwSupportedOptions,
*pdwEnabledOptions
STDMETHOD_(HRESULT, SetInterfaceSafetyOptions)
dwOptionSetMask,
dwEnabledOptions
END_INTERFACE_PART(ObjSafe); ②xxxCtrl.cpp中实现:
const CATID CATID_SafeForScripting =
{ 0x7dd92, 0x11cf, { 0x9f, 0xa9, 0x00, 0xaa, 0x00, 0x6c, 0x42, 0xc4 } };
const CATID CATID_SafeForInitializing =
{ 0x7dd92, 0x11cf, { 0x9f, 0xa9, 0x00, 0xaa, 0x00, 0x6c, 0x42, 0xc4 } };
// 创建组件种类
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))
// Make sure the HKCR\Component Categories\{..catid...}
// key is registered.
CATEGORYINFO
catinfo.catid =
catinfo.lcid = 0x0409; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len&127) len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = '\0';
hr = pcr-&RegisterCategories(1, &catinfo);
pcr-&Release();
// 注册组件种类
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
// Register your component 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] =
hr = pcr-&RegisterClassImplCategories(clsid, 1, rgcatid);
if (pcr != NULL) pcr-&Release();
STDAPI DllRegisterServer(void) 函数中,添加:
// 标记控件初始化安全.
// 创建初始化安全组件种类
HRESULT hr = CreateComponentCategory(CATID_SafeForInitializing, L&Controls safely initializable from persistent data!&);
if (FAILED(hr))
// 注册初始化安全
hr = RegisterCLSIDInCategory(BASED_CODE _tlid, CATID_SafeForInitializing);
if (FAILED(hr))
// 标记控件脚本安全
// 创建脚本安全组件种类
hr = CreateComponentCategory(CATID_SafeForScripting, L&Controls safely scriptable!&);
if (FAILED(hr))
// 注册脚本安全组件种类
hr = RegisterCLSIDInCategory(BASED_CODE _tlid, CATID_SafeForScripting);
if (FAILED(hr))
STDAPI DllUnregisterServer(void) 中添加:
// 删除控件初始化安全入口.
HRESULT hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid, CATID_SafeForInitializing);
if (FAILED(hr))
// 删除控件脚本安全入口
hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid, CATID_SafeForScripting);
if (FAILED(hr))
xxxCtrl.h中添加:
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions)
*pdwSupportedOptions,
*pdwEnabledOptions
STDMETHOD_(HRESULT, SetInterfaceSafetyOptions)
dwOptionSetMask,
dwEnabledOptions
END_INTERFACE_PART(ObjSafe);
xxxCtrl.cpp中添加:
//接口映射
BEGIN_INTERFACE_MAP(CRtmpDumpCtrlCtrl, COleControl)
INTERFACE_PART(CRtmpDumpCtrlCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()
ULONG FAR EXPORT CRtmpDumpCtrlCtrl::XObjSafe::AddRef()
METHOD_PROLOGUE(CRtmpDumpCtrlCtrl, ObjSafe)
return pThis-&ExternalAddRef();
ULONG FAR EXPORT CRtmpDumpCtrlCtrl::XObjSafe::Release()
METHOD_PROLOGUE(CRtmpDumpCtrlCtrl, ObjSafe)
return pThis-&ExternalRelease();
HRESULT FAR EXPORT CRtmpDumpCtrlCtrl::XObjSafe::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
METHOD_PROLOGUE(CRtmpDumpCtrlCtrl, ObjSafe)
return (HRESULT)pThis-&ExternalQueryInterface(&iid, ppvObj);
const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~dwSupportedB
STDMETHODCALLTYPE
CRtmpDumpCtrlCtrl::XObjSafe::GetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
METHOD_PROLOGUE(CRtmpDumpCtrlCtrl, ObjSafe)
HRESULT retval = ResultFromScode(S_OK);
// does interface exist?
IUnknown FAR* punkI
retval = pThis-&ExternalQueryInterface(&riid, (void **)&punkInterface);
if (retval != E_NOINTERFACE)
{ // interface exists
punkInterface-&Release(); // release it--just checking!
// we support both kinds of safety and have always both set, regardless of interface
*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedB
// E_NOINTERFACE if QI failed
HRESULT STDMETHODCALLTYPE
CRtmpDumpCtrlCtrl::XObjSafe::SetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [in] */ DWORD dwOptionSetMask,
/* [in] */ DWORD dwEnabledOptions)
METHOD_PROLOGUE(CRtmpDumpCtrlCtrl, ObjSafe)
// does interface exist?
IUnknown FAR* punkI
pThis-&ExternalQueryInterface(&riid, (void**)&punkInterface);
if (punkInterface)
{ // interface exists
punkInterface-&Release(); // release it--just checking!
{ // interface doesn't exist
return ResultFromScode(E_NOINTERFACE);
// can't set bits we don't support
if (dwOptionSetMask & dwNotSupportedBits)
return ResultFromScode(E_FAIL);
// can't set bits we do support to zero
dwEnabledOptions &= dwSupportedB
// (we already know there are no extra bits
if ((dwOptionSetMask&dwEnabledOptions) != dwOptionSetMask)
return ResultFromScode(E_FAIL);
//don't need to change anything since we're always safe
return ResultFromScode(S_OK);
参考文章:
/zh-cn/kb/161873
/zh-cn/library/aa751977(v=vs.85).aspx
.cn/s/blog_4f9fc08e01014ipt.html
/758961.html
http://blog.csdn.net/aasmfox/article/details/
乌云的两篇好文:
http://drops.wooyun.org/papers/5673
http://drops.wooyun.org/papers/7521
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25723次
排名:千里之外
原创:18篇
转载:12篇
(1)(1)(1)(1)(1)(2)(5)(6)(2)(3)(1)(3)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'1,一个程序就是一个EXE文件。Windows中,一旦一个程序被启动的,系统为其创建一个进程。一个进程拥有自己的内存,文件句柄,和其它的系统资源。如果连续两次启动同一个程序,系统为其创建两个独立的进程并发运行(并发:微观交替串行,宏观并行)。
1)一个进程(如Windows Explorer)可能有多个主窗口(每一个窗口由一个线程支持),也可能没有任何窗口。
2)进程拥有自己“私有”4GB虚拟地址空间。
3)每个进程内存空间包含各种各样的内容(具体参见169页): 程序EXE镜像,程序中装入的非系统的DLL(包括MFC DLL),程序的全局数据,程序的堆栈,动态分配内存(包括Windows和C运行库堆),内存映射文件,进程之间共享的内存块,特定执行线程的局部内存,所有系统内存模块(包括虚拟内存表),Windows核心、执行过程及DLL(是OS的一部分)。
2,Windows 95进程地址空间:
WIN95中,只有底下的2GB(0-0x7FFFFFFF)地址空间是进程私有的。其中最底下的4MB禁止访问。堆栈、堆和可读写的全局内存,及其应用程序的EXE和DLL文件都被映射底下的2GB地址上。
上面的2GB地址空间对所有的进程都一样的,由所有的进程共享。
WIN95核心、执行过程、虚拟设备驱动程序和文件系统代码,以及一些重要的表(如:页表),都被映射到最上面的1GB(0xCxFFFFFFFF)地址空间。
Windows DLL和内存映射文件位于0xxBFFFFFFF地址空间。
安全性说明:
1)所有的EXE和DLL代码都有只读标记,因而可以映射到几个不同的进程中。
2)一个进程不可能改写另一个进程私有的2GB地址空间内容。
3)进程地址空间中最上面的2GB由于是共享的,很容易受攻击毁坏。如:错误进程毁坏这一区域重要的系统表,进程的内存映射文件被其它进程弄乱。
3,Windows NT进程地址空间:
WIN NT中,进程只能访问它最底下的2GB地址空间(除最底和最高的64K是不能访问)即:0xx7FFEFFFF。
EXE、应用程序的DLL 和 Windows的DLL、以及内存映射文件都驻留在0xx7FFEFFFF地址空间中。
Windows NT内核、可执行程序和设备驱动程序都被映射到上面的2GB空间中,完全受保护,可以避免错误程序的侵入。
安全性分析:
1)进程内存地址空间上2GB空间,完全受保护,可以避免错误程序的侵入破坏其中内容。
2)内存映射文件更安全,如果不知道文件的名字,而又没有显式地映射视图,一个进程不能访问另一个进程的内存映射文件。
4,实际中RAM一般没有GB级别,Windows是使用虚拟镜像技术的(通过内存与磁盘的页置换完成的)。
5,程序中如果需要动态内存,可使用Win32函数VirtualAlloc和VirtualFree函数,也可以直接使用Windows 堆函数(如:HeapAlloc 和 HeapFree)和CRT函数(C运行库堆函数,如malloc,new,free,delete)来完成任务。
6,堆是特定进程的内存池。当程序需要内存块的时候,调用堆内存分配函数,并在使用完时调用相关的堆内存释放函数释放内存。
Windows 堆函数(如:HeapAlloc 和 HeapFree)和CRT函数(C运行库堆函数,如malloc,new,free,delete).
C++代码中,new,delete函数直接映射到malloc,free函数。
new,delete函数与malloc,free函数比较优点:new,delete函数进行类型检查,自动计算要分配类型的大小,而且属于C++语言的一部分。malloc,free函数是作为标准库函数提供给C的,它们并不是C语言的一部分。
7, 内存映射文件:
处理如在程序中读如DIB(设备无关位图文件)的问题时候:文件小一般是分配一个大小合适的缓冲区,打开文件,然后把整个文件读入缓冲区;如果文件大则可使内存映射文件来处理。
内存映射文件是:直接映射一个地址范围到相应的文件(注:个人理解 文件仍然存放在存放在磁盘上),当进程访问该范围内存页时候,OS分配RAM并从磁盘中读入该页数据。
1)默认情况下,当映射文件时候,虽然可能只映射文件的一部分,但整个文件仍然被占用。
2)MFC里不支持内存映射文件。CSshareFile类只支持HGLOBAL句柄进行剪切板内存传输,不大实用。
8,资源包含在EXE和DLL里,因此会占用虚拟地址空间,而且这些空间在进程的生存期内不会被改变。这就使我们很容易直接读取一个资源(如用LoadResource函数加载位图资源)
LoadResource : loads the specified resource into global memory.
HGLOBAL LoadResource(
& HMODULE hModule, // resource-module handle
& HRSRC hResInfo&& // resource handle
LoadResource返回一个HGLOBAL值,但可以安全把它当成指针来使用(强制转换)。
9,堆使用的越多,程序的运行效率就越底下。WIN32程序的堆可以很大(要多大就有多大,没有64KB限制,WIN16有16K的限制)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:254744次
积分:3230
积分:3230
排名:第11040名
原创:49篇
转载:97篇
(1)(1)(3)(3)(6)(14)(3)(7)(8)(2)(2)(1)(29)(66)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'办公OFFICE(17)
以下方法可以解决在 Access 2003 或一些 Access 2002/XP SP3 用户使用 RichTX32.OCX ActiveX 控件(Rich Text Edit)出错的的问题
在 Access 2002 /SP3 或 Access 2003 就可插入Rich text edit控件中总是提示Microsoft office access 不支持这种ActiveX 控件
这种方法允许 &Internet Explorer使用 Richtx32.ocx (由于安全的考虑). 可参考微软的KB 838010所说的 /kb/838010/zh-cn
为了允许 &Access 2002 /SP3 或 2003 使用这个控件, 你可以通过修改注册表来解决, 在注册表中找到以下注册项(请先备份注册表):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{3B7C1B-B9B5-}
RichTx32.ocx 的 class ID 总是 3B7C1B-B9B5-
这个键值 有一个Compatibility Flags 项,数据类型为 &DWORD&
如果它的值 是 0x400 (二进键是, 十进制是 1024) 将它简单的改为 0 &修改之后,
你会发现,在 Access 2002 /SP3 或 Access 2003 就可插入Rich text edit控件中
以下是微软原文:
当您打开文档时 Microsoft 格式文本框控件 6.0 (Richtx32.ocx) 的实例包含在 Microsoft Office XP 中或在 Microsoft Office 2003 中,该控件可能无法成功加载,或者您可能会收到安全警告,要求您交互。该文档可能无法正常工作,或者您可能会遇到运行时错误,因为该控件不可用。如果满足下列条件之一时,将发生此问题:
在文档中嵌入控件。
该控件用于作为一部分的 Microsoft Visual Basic for Applications (VBA) 用户窗体。
为外接程序项目中使用该控件。
20.dll) 所使用的 VBA 验证安全设置的控件。最新版本的 FM20.dll 确定它是否可以安全地使用IObjectSafety接口初始化在创建该对象。此外,FM20.dll 会检查 Internet Explorer ActiveX 兼容性策略设置,以确定是否已标记某个控件&始终不安全&。
icrosoft Visual Basic 6.0 中包含格式文本框控件 6.0 会错误地标记为&可安全执行初始化。此设置表示格式文本框控件 6.0 可以来自恶意源加载持久化的数
因为 Microsoft Internet Explorer 会阻止运行多格式文本框控件 6.0 的安全设置,就会出现此问题。最新版本的 Microsoft 窗体 2.0 库 (F
M据而不危及用户。但是,格式文本框控件 6.0 是仅仅是RichEdit控件 (RIched20.dll) 系统的包装。格式文本框控件 6.0 不会确保传递给RichEdit控件的数据安全。此外,格式文本框控件 6.0 不会不确保使用格式文本框控件 6.0 RichEdit控件的版本可以处理不受信任的数据。格式文本框控件 6.0 不应标记为可安全执行不受信任的初始化。因此,作为一项预防措施,Internet Explorer 6.0 具有丰富 TextBox 控件 6.0 设置&始终不安全&的标志。&始终不安全&的标志可防止多格式文本框控件
6.0 Internet Explorer 6.0 中,在 Office XP 中,并在 Office 2003 中
在前一文中记述了Access启动不了,或者出现“正在准备安装……”的问题,今天则找到了Access对控件支持的问题。
本来Access、Excel、Word的编程基础是VBA,也就是说与VB有关,但又不是VB,所以Access除了一些基本控件外,而且可以像VB一样使用部件(可见的或者可视的)、使用引用(不可视类),但是由于些许原因,Access不能使用了,其实在Excel或者Word里面也不能使用了,因为涉及到整个VBA的使用面。
本次机器上出现的Access问题可能与操作系统有关,原来是XP SP1,装office2003也是sp1,就兼容很好,没有出现这样的问题,当时为能够在Access里面使用Datagrid控件而感到兴奋。但是现在重新安装XP系统,而且是sp3,再安装Office2003,尽管是sp3版本的,但是VB运行库扩展文件(请参考后附链接)却不是最新的,于是到微软官方站点下载 VB6.0运行扩展库,进行安装后重新启动,在Access里面插入Datagrid控件,说明没有注册,于是乎在开始运行里面输入 Regsvr32 c:\WINDOWS\system32\msdatgrd.ocx,回车注册成功,然后打开原来带有Datagrid控件的窗体,一切Okay!
需要说明的是这种情况一般出现在Ghost WindowsXP sp3 加装office2003中,一般ghost里面的office是三合一的,也就是说不含access,是因为电脑城装机人想不到一般消费者会使用access,更不会想到access会用到VB扩展的控件文件,所以也就没有把微软更新的VB扩展文件打包到ghost文件里。解决这个问题突破点是查英文,我想中文很难从问题里找到准确的链接,就想到老外可能也会遇到这样的问题,于是乎通过链接【1】,找到问题原因,再就搜索找到链接【2】。
导入一下注册表可尝试解决。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Internet Explorer\ActiveX Compatibility\{3B7C1B-B9B5-}]
&Compatibility Flags&=dword:
参考链接如下:
【1】Microsoft Office Access doesn't support this ActiveX control,链接说明是由于微软安全更新引起的
【2】在 Visual Basic 6.0 服务包 6 运行时扩展文件的累积更新汇总的说明,这里面有上面给的链接下载微软官方地址
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:634124次
积分:7169
积分:7169
排名:第3263名
原创:30篇
转载:406篇
评论:77条
(18)(2)(1)(3)(4)(13)(24)(3)(23)(1)(1)(2)(1)(3)(9)(24)(1)(6)(2)(2)(31)(1)(7)(1)(6)(3)(1)(2)(10)(11)(33)(4)(3)(4)(1)(24)(11)(6)(9)(14)(3)(1)(6)(58)(7)(18)(5)(2)(3)(5)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'activex-Web调用ATL ActiveX控件,IE8无法打开网页,IE7可以运行,但提示内存访问冲突!
作者:用户
浏览:327 次
Web调用ATLActiveX控件,IE8无法打开网页,IE7可以运行,但提示内存访问冲突!我的参考文章http://blog.csdn.net/u/article/details/
Web调用ATL ActiveX控件,IE8无法打开网页,IE7可以运行,但提示内存访问冲突!
Internet Explorer 已经为了帮助保护您的机而关闭此网页
运行不正常的加载项或恶意加载项导致 Internet Explorer 关闭此网页。
您可以执行以下操作:
尝试返回查看的页面
我在工具-〉Internet选项-〉安全中将安全级别中所有ActiveX相关的选项都启用了以后,IE仍然提示“当前安全设置会使计算机有风险”,继续运行后还是提示修复设置,网页上仍然显示上面的“关闭网页”,上面的示例还有网上其他文章里不是说用IObjectSafety就可以了吗?可我将IE安全级别设到最低还是无法打开网页!换成IE7后没有安全问题了,可以运行,但是提示内存访问冲突,断点在调用外部DLL时:
我的源代码如下:
// DTUTest.h : CDTUTest 的声明
#pragma once
#include "resource.h"
#include "windows.h"
#include "AOETest_i.h"
#include "_IDTUTestEvents_CP.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
// CDTUTest
class ATL_NO_VTABLE CDTUTest :
public IObjectSafetyImpl, // 安全提示解除,--当运行浏览器调用时,不会提示安全问题。
public CComObjectRootEx,
public CComCoClass,
public IConnectionPointContainerImpl,
public CProxy_IDTUTestEvents,
public IObjectWithSiteImpl,
public IDispatchImpl
typedef BOOL (*DTUStartServiceFunc)(USHORT); // 定义一个指向DSStartService函数地址的指针类型。
HMODULE hDllM // 指向动态库的句柄
DTUStartServiceFunc _DTUStartServiceF
CDTUTest()
hDllModule = LoadLibrary((LPCWSTR) "DTUdll.dll"); // 装载动态库
if(hDllModule != NULL) // 成功调用动态库
_DTUStartServiceFunc = (DTUStartServiceFunc)GetProcAddress(hDllModule,"DSStartService"); // 从动态库中取得DSStartService函数的地址
FreeLibrary(hDllModule); // 未成功调用动态库,释放资源
DECLARE_REGISTRY_RESOURCEID(IDR_DTUTEST)
BEGIN_COM_MAP(CDTUTest)
COM_INTERFACE_ENTRY(IDTUTest)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IObjectSafety) // 安全提示解除,--当运行浏览器调用时,不会提示安全问题。
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CDTUTest)
CONNECTION_POINT_ENTRY(__uuidof(_IDTUTestEvents))
END_CONNECTION_POINT_MAP()
// STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
return S_OK;
void FinalRelease()
STDMETHOD(DTUStart)(USHORT DTUListenPort);
OBJECT_ENTRY_AUTO(__uuidof(DTUTest), CDTUTest)
// DTUTest.cpp : CDTUTest 的实现
#include "stdafx.h"
#include "DTUTest.h"
// CDTUTest
STDMETHODIMP CDTUTest::DTUStart(USHORT DTUListenPort)
// TODO: 在此添加实现代码
if(_DTUStartServiceFunc != NULL) // 是否成功取得函数地址
BOOL StartRes = this-&_DTUStartServiceFunc(DTUListenPort); // 错误在这一行,IE提示内存访问冲突
this-&_AtlFinalRelease();
return S_OK;
调用的DLL中DSStartService函数的声明:
BOOL DSStartService(u16t uiListenPort);
首先要正确注册ActiveX. 其次要有合法签名,否则浏览器会不认可。然后就是你的控件本身运行起来后的指针,函数估计有问题。
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供}

我要回帖

更多关于 activex控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信