淘宝安全控件件 atl 10什么意思

1546人阅读
使用VC2008中ATL开发浏览器控件
本文将介绍使用VC2008中的ATL开发一个用于网络部署的cab控件包的过程。
建立ATL项目
打开VS2008,建立一个ATL项目,如下图:
考虑到简介性,选择了"Allow merging of proxy/stub code"
添加ATL控件
(建议先编译一下真个project,保证编译成功并顺利注册了控件)
之后添加一个ATL的控件,注意正确的对象类型。
右键选择项目&Add&-&"Add Class"
一定要注意选择&ATL控件&,否则事件支持等可能会相对麻烦些,需要自己手动写些接口代码。选择Add后填写必要的控件名称等,进入选项界面:
这里需要注意:如果控件会返回给js/vbs脚本一些消息事件的话,必须选择&Connection points&添加连接点支持。否则需要自己手动在idl中添加连接点接口定义等信息;另外注意"Control type:"的选择,如果是运行时不可见控件或者简单的功能控件等,如果需要返回给js/vbs一些消息事件的话,必须实现IProvideClassInfo2和IProvideClassInfo,此时最好选择Standard control并在后面选择实现,否则的话可以使用Minimal control。
"Next&"出现需要实现的接口对话框,可以根据需要选择,如果返回脚本事件的,至少要实现IProvideClassInfo2接口,如下:
至此,一个ATL控件就创建完成了。建议编译下项目,保证链接成功并正确注册控件。
添加控件属性和方法
在&Class view&中添加控件支持的属性和方法。
具体可以根据需要操作,这里不详述细节。建议编译下保证正确性。
添加脚本响应事件
添加事件函数的方法类似于为控件添加函数,不过针对的接口为XXXLib下的_IXXXEvent,如下:
如果出现HTML网页中事件响应不成功,必须保证上面提到一些设置正确,可以手动检查下必要的接口是否实现。
这之后就可以在实现类CXXXX上添加connection point来方便控件内向外发送事件了。具体如下图:
注意:需要一定不要错误选择"Implement Interface"并实现事件接口;
之后控件实现类中就可以调用Fire_XXX来发送事件调用了。
至此,控件就正确实现了,可以使用项目自动产生的.htm文件测试控件的各个接口是否正常工作。
另外:所有的Fire_xxx函数只能在窗口线程中执行,控件窗口未初始化时似乎调用无效,例如FinalConstruct和FinalRelease等函数中。
控件的自注册和安全标记
如果要实现控件可以自注册必须在资源文件中添加
&& & & &BLOCK ""
&& & & &BEGIN
&& & & & & & ...
&& & & & & & VALUE "OLESelfRegister", "/0"
&& & & & & & ...
&& & & END
如果要标记控件的安全性,需要再控件实现文件中添加父类
class ATL_NO_VTABLE CXXXXXX :
&& &public IObjectSafetyImpl&CFileUploader, & & & & & INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA&,
在BEGIN_COM_MAP(CXXXXX)部分插入实现:
BEGIN_COM_MAP(CXXXXX)
&& COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
END_COM_MAP()
封装为cab包及网络部署
由于一般情况下控件会包含其它相关资源项,如附加依赖的dll或配置文件、资源文件等。所以更多的控件以cab包形式发布。
cab包需要一个.inf说明包的信息,一个示例如下:
; file in cab
[Add.Code]
test.dll=test.dll
atl.dll=atl.dll
; needed DLL
file-win32-x86=thiscab
FileVersion=2,00,0,7024
DestDir=11
RegisterServer=yes
[test.dll]
file-win32-x86=thiscab
clsid={4CBBC676-507F-11D0-B98B-}
FileVersion=1,0,0,1
RegisterServer=yes
; end of INF file&
把这个包和相关的控件及其它文件等放到一个目录下,在命令行下使用makecab命令进行打包,之前需要准备一个.ddf文件说明需要哪些文件打包
.OPTION EXPLICITGenerate errors
.Set CabinetNameTemplate=Uploader.cab
.Set DiskDirectoryTemplate=CDROMAll cabinets go in a single directory
.Set CompressionType=MSZIPAll files are compressed in cabinet files
.Set UniqueFiles="OFF"
.Set Cabinet=on
.Set DiskDirectory1=Uploader.cab
; file list
Uploader.dll
Uploader.inf&
之后调用makecab /F xxx.ddf,即可获得一个用于发布的cab文件。
使用方法为设置codebae="&cab file url&[#version=1.0.0.1]"
由于ATL的框架,极大地方便了控件的编程,但需要熟悉基本的COM理论,并注意框架中添加代码的步骤,否则很容易出现莫名的错误。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59884次
积分:1184
积分:1184
排名:第17322名
原创:54篇
转载:24篇
评论:11条2506人阅读
本文由CharlesSimonyi发表于CSDN博客:转载请注明出处
之前就看到CSDN论坛上有人提问,自己写的程序中的WebBrowser打开招商银行的登录页面后(),无法显示密码输入控件,但是在IE中可以正常显示。
后来又在猪八戒威客网上看到有人提这个问题,并且还悬赏了570人民币。重赏之下必有勇夫,这不,为了买一块新硬盘,我就一头扎进了这个问题里。
不卖关子,先把解决方法告诉大家,相信有不少人在头疼这个问题。先把你手头的问题解决了,如果有兴趣再继续往下看解决这个问题的过程。
1.如果你的程序是VC6.0、VC2003、VC2005写的,应该什么都不用做,默认情况下它是能正常显示招商银行密码输入控件的。
2.如果你的程序是VC2008、VC2010、VC2012或更高版本的VC写的,打开“项目”-“XX项目属性”-“配置属性”-“链接器”-“命令行”,在“其它选项”里输入“/NXCOMPAT:NO”,重新编译下就OK。
3.如果你的程序是任意版本的C#、VB.NET等NET语言写的,在编译生成了exe可执行文件后。假如最终编译出来的exe文件为c:\project\bin\Release\WindowsFormsApplication.exe,则在VisualStudio中打开“工具”-“VisualStudio命令提示”(或在开始菜单中找到“Microsoft Visual Studio 2010”-“VisualStudio Tools”-“Visual Studio 命令提示”)
输入editbin.exe /NXCOMPAT:NO c:\project\bin\Release\WindowsFormsApplication.exe
回车,OK。
4.如果你的程序是其它语言写的,自己研究一下吧,关键点就是在/NXCOMPAT:NO这个链接器开关上。
/NXCOMPAT:NO的意思是将可执行文件显式指定为与数据执行保护不兼容。也就是关闭数据执行保护功能。什么意思呢,就是说当开启这个选项时,不允许在堆栈上的内存上执行代码,因为允许在堆栈内存上执行代码并不安全,有可能被恶意者利用来进行溢出攻击。但是一些比较老的程序,用到了在堆栈内存上动态写入代码指令并执行的技术。招商银行的这个控件是用VC2003的ATL7.1开发的,ATL7.1里面就用到了这种技术,而VC2005以上的编译器默认开启NXCOMPAT数据执行保护,导致招商银行的这个控件无法运行而显示不出来。我们只要关闭NXCOMPAT数据执行保护,招商银行的控件就正常运行了。
关于NXCOMPAT这个链接器开关,MSDN上有介绍:
关于C#与NXCOMPAT可以看这篇文章:
下面开始讲解决这个问题从头到尾的过程,这个过程花了我三天时间,第一天毫无头绪,差点就放弃了。但想到我那台电脑用了快三年了,一直挂着80G的老IDE硬盘,一直没有钱买新的,为了新硬盘,拼了。
那天在猪八戒上看到这样一个任务,有人悬赏570元求解决C#程序的WebBrowser无法显示招商银行密码输入控件的问题。然后我打开VC2010,试了一下,也是无法显示。我首先想到是WebBrowser是不是为了出于安全考虑,禁用了一些Activex控件,在网上搜索了很久,改了多处注册表,仍然无法解决。但是支付宝、工商银行这些网站的密码输入控件都是能正常显示的啊。我又在网上找了一些个人开发的基于WebBrowser的浏览器,都是无法显示招商银行的密码输入控件。
由于招商银行的密码输入控件与支付宝的密码输入控件都是Activex控件,于是我把他们都拖到MFC的窗口上,支付宝的控件能正常显示,但是招商银行的控件没有出来。调试发现容纳招商银行控件的容器,一个CWnd对象,Create的时候失败了,内部句柄为空。再单步调试进去,发现是错在COleControlSite::DoVerb这里,该方法调用这个控件的IoleObject接口的DoVerb方法,返回了E_FAIL错误。但是支付宝的控件调用DoVerb时返回的是S_OK正确。由于IoleObject::DoVerb跟不进去了,无法知道错在哪里,但是可以肯定是,这个错误是在招商银行的控件内部。晚上我看了下《深入解析ATL》关于Ativex这一章,看了下IoleObject接口,并没有什么突破。
第二天发现猪八戒上那个任务,有人交稿了,那个人使用易语言写的程序,它的程序中的WebBrowser确实能正常显示招商银行的密码输入控件。顿时信心与自信倍受打击,好在那个猪八戒客户对此并不买账,要求必须用C#实现。我又抓紧时间在网上搜啊搜啊搜,搜遍了百度、Google、Bing。总算找到了一点有用的信息,有人说换用VC2005后就正常了。于是我马上把VS2005装起来,果然,VC2005写的程序中的WebBrowser打开招商银行网站后能正常显示那个密码输入控件。又在VC6.0里面试了下,也是能正常显示。之前把那个易语言写的程序拖到IDA
Pro里发现这个易语言程序的内部竟然是基于VC6.0的MFC4.2写出来的,感情那个用易语言交稿的威客什么都没做,就是拖了个WebBrowser控件就能正常显示招商银行控件了,这样也敢交稿啊。哎,不管他,回到问题上来,为什么会这么奇怪,难道这个控件和高版本的VC冲突?高版本的VC程序和低版本的VC程序有什么区别?CRT运行库不同?不对啊,这个控件是静态链接到CRT运行库的,应该影响不到啊。
依然是毫无头绪,试了一下用VS2005创建C#项目,还是无法显示招行控件,但是用VS2005创建C++/CLR项目,能正常显示招行控件!而VS2010下无论是C#项目还是C++/CLR项目都不行。哎,不管了,先把C++/CLR写的Demo程序传上去,在猪八戒上交稿,就说是用C#写的Demo,反正它两都是个WinFrom的窗口,很像,看不出来。先蒙混一下,防止易语言的那个威客抢占了先机。
后来交稿后,猪八戒客户就迅速让我中标了,完了,我还不知道该如何解决这个问题呢。只好含糊的说在VS2005上可以实现,而客户要求在VS2012上实现,我说那再研究下吧,他说好。这下糟了,还一点头绪都没有,就面临着要给客户提交最终解决方案了,这个牛皮吹大了。哎,算了,实在搞不定就放弃,撤销猪八戒交易。
又不停的在网上搜索,看身边的各种书籍,依然没找到什么突破口。于是我把VC2005和VC2010都打开,各创建一个MFC项目,把招商银行密码输入控件放到窗口上。两边一起调试,看看到哪一步,VC2005中的程序正确而VC2010中的程序错误。经过调试发现错误依然是在COleControlSite::DoVerb里,调用控件的IoleObject::DoVerb时,VC2005下S_OK正常,VC2010下E_FAIL错误。看来错误是出在控件内部的代码上。不调试进去是找不到错误了。那就跟进去看看吧。
右键-转到反汇编,VC2005和VC2010一起调试,单步慢慢的走,特别注意每一个call指令,观察EAX寄存器的不同,因为EAX寄存器一般用于存放call指令调用一个函数后的返回值,如果两边调用call指令后EAX不同,尤其是VC2010这边的EAX出现0x(NULL)或0x(E_FAIL),而VC2005那边不是这两个值,就更应该注意了,单步步入进去,继续慢慢的走。经过调试对比,发现执行10007DA9处的call指令后,VC2005中的EAX为非零值,VC2010中的EAX为0,则重新调试运行,到这个10007DA9处的call时单步步入。步入以后,又在处的call
发现了运行结果的不同,VC2005这边EAX为非零值,VC2010这边EAX为0。于是又重新调试运行,在处单步步入。用这样的方法一步步找进去以后,最终发现在100093DB处call了user32.dll中的CreateWindowExA后,VC2005这边返回了一个非零值,即得到了一个窗口句柄,但是VC2010这边返回值为0,空句柄,窗口创建失败了。
正是这里窗口创建失败了,后面才导致IoleObject::DoVerb返回E_FAIL。为什么在VC2010中调用CreateWindowExA时创建窗口会失败呢?在调用完CreateWindowExA后,查看一下GetLastError返回的值不就知道了吗?查看GetLastError值的方法很多。一种是查看内存,GetLastError内部的那个保存着错误值的变量,应该是kernel32.dll中的一个全局或静态变量,那么它的相对地址应该是固定的。可以直接在kernel32.dll映射到进程的地址空间内的地址范围的内存上找,至于相对内存地址是多少,可以调用GetLastError并调试,查看反汇编代码单步跟进去得到。另一种方法是HOOK
CreateWindowExA这个API,通过检查参数确定哪一次调用是招行的控件内部的代码调用的,然后调用GetLastError并查看返回值。两种方法都试过了以后,发现GetLastError返回值均为0!也就是说没有错误?没有错误的话为什么CreateWindowExA会失败返回空句柄?马上在网上搜索“调用CreateWindowExA失败但GetLastError为0”,发现这种错误一般是窗口过程函数有问题导致的,窗口过程没有处理好WM_CREATE之类的消息。为什么它的窗口过程在VC2005中就没问题,在VC2010中就有问题?一样的代码,不至于吧!哎,没办法,看一看它的窗口过程函数吧。窗口过程函数是由窗口类指定的,看看这个窗口类名是什么。CreateWindowExA的第二个参数就是窗口类名,从反汇编代码可以看出处的push
eax给它填了这个参数,往上面看,这里eax的值又是从[ebp+20h]中得到的,[ebp+20h]明显是传给过程的参数。看看在IDA Pro通过查看交叉参考,看看是谁调用了,是谁把这个参数传进来的。发现,只有过程调用了过程。
在过程中发现窗口类名的这个参数在[ebp+0Ch]处,是过程的一个参数,也是由过程的调用者传进来的。继续查看过程的调用者是谁。但是通过查看交叉参考,找不到的调用者,在VC中调试也是看得头大,一头雾水。等等,我的目的是要找到这个窗口类的窗口过程函数的地址,不一定非得去看它的反汇编代码。不如Hook CreateWindowExA这个API,得到它的窗口类名,再调用GetClassInfo得到这个窗口类的信息,里面不就有它的窗口过程函数地址了吗?说干就干,果然,这个地址找到了。
就是它的窗口过程函数的地址,马上到IDA Pro里面去看。
这个窗口过程函数很简单,但是1000928E处调用SetWindowLongA引起了我的注意。看它调用SetWindowLongA时放入的第二个参数是什么,0xFFFFFFFC!也就是有符号数-4,查看MSDN上SetWindowLongA的参考资料发现-4就是GWL_WNDPROC。原来它调用SetWindowLongA改了窗口过程函数的地址。这种手法是MFC和ATL惯用的,并不奇怪。看一看他把窗口过程函数的地址改成了什么?再跑到它的新窗口过程函数中看看。由于这个地址是由[esi+14h]提供的,是一个动态的值,在静态反汇编中看不出来。那就到VC中调试看看。
在一次调试中发现这个新的窗口过程函数的地址是00652F88,好诡异的地址,这个地址根本不在它的模块地址范围内,也不在任何模块地址范围内!!!先不管了,既然00652F88是它的新窗口过程函数地址,那么后续的窗口消息将被发到这个新地址处的窗口过程函数处理,并且在处可以看到它call esi,原来是连当前这条windows消息也马上转到新的窗口过程函数处理了,那就到00652F88处下断点看看吧。但是下断点以后发现根本断不下来!怎么回事,转到OD中调试看看能不能断下来。
在OD中调试的时候,这个新窗口过程函数的地址是,可以看到它在这里给[esp+4]传送了一个立即数(这个立即数每次都不同)以后,马上转到了1000581F,1000581F是它模块中的一个函数,看来1000581F才是真正的新窗口过程地址,它用来中转,只不过进行了一个操作,给[esp+4]传送了一个立即数。不知道它这样做的意义是什么,但这个不是重点。重点是在OD中,断下来了,并且无法继续往下执行,提示访问违规!内存访问违规?意思是这块内存是不可执行的?但是VC2005生成的程序,运行到这里的时候并没有访问违规!
在OD中查看所在的这块内存的属性,是可读可写但不可执行的。所以访问违规了?
把这块内存强制改成可读可写可执行看看,果然,改了它的访问属性以后,处的代码就能继续往下执行,没有提示访问违规了!继续运行后,招商银行的密码输入控件也创建成功了,静静的躺在我的对话框窗口上!
哎,但是不对啊,调试VC2005生成的程序的时候,这块内存也是可读可写不可执行的,不需要改变它的访问属性,也能正常运行,没有访问违规啊!怎么会这样呢?先看看这块内存是哪里来的。
回到调用SetWindowLongA的过程中去,可以看到新窗口过程函数的地址是从esi中得来的,每次都不一样。esi中的这个地址又是怎么来的呢?在IDA Pro中查看过程的交叉参考图表。
发现过程在调用SetWindowLongA之前调用了,而中又调用了HeapAlloc和GetProcessHeap,很明显,它在堆上分配了内存。那么esi中的地址是不是这里在堆上分配的内存的地址呢?查看过程的反汇编代码。
果然,调用HeapAlloc在堆上分配了0Dh(13)个字节的内存。13个字节!
等等,13个字节!之前代码执行到处的时候发生访问异常,那里的指令代码正好就是13个字节。可以得出结论了,它在堆上分配了13个字节的内存,并在这13个字节里写入了两条指令,并把这13字节的内存起始地址作为新窗口过程函数的地址,然后执行这两条指令。不清楚它为什么要这样做,不清楚它为什么要在堆上内存写代码,然后在堆上内存执行代码,而且看来它的新窗口过程函数的真实地址应该是它模块上的1000581F,为什么这里要给[esp+4]传送一个每次运行时都不一样的立即数呢?这些问题可以不管它,目前要解决的问题是,为什么VC2005写的程序,可以执行堆上内存的代码,而VC2010写的程序,不能执行堆上内存的代码,出现了访问违规。解决了这个问题,整个问题的答案就出来了。
查阅了一些书籍,并没有找到答案。我一直不停的思考,为什么VC2005写的程序和VC2010写的程序会存在这种差异呢?CRT运行库不同吗?CRT运行库不同带来的内存问题都是分配和释放的问题,应该和那个没关系啊。还有什么不同呢?
编译器命令和链接器命令!依稀记得链接器命令里有设置模块默认基址等选项,那是不是也有设置堆栈内存访问控制的选项呢?对比VC2005和VC2010的编译器命令和链接器命令,一发现不同之处就到网上搜一搜它的意义。后来链接器命令中的/NXCOMPAT:NO引起了我的注意,VC2005中默认有这个命令,而VC2010中默认没有。查一下它的意义,与数据执行保护兼容,再看一下他的解释。
果然,问题就出在这里。VC2005以上版本的编译器中默认与数据执行保护兼容,也就是不允许执行堆栈内存上的代码。NET也都是默认与数据执行保护兼容,不允许执行堆栈内存上的代码。然后在VC2010的编译器命令里加上/NXCOMPAT:NO后,VC2010写的程序也能正常显示招商银行密码输入控件了,当然,用WebBrowser打开招商银行网页也能显示这个控件了。接下来在网上搜索了一下C#如何使用/NXCOMPAT:NO这个命令,也很快找到了方法。
这里也提到了一些ATL7.1或更早的版本的ATL代码与数据执行保护不兼容,为了保持兼容这些程序而使用/NXCOMPAT:NO命令。而招商银行的密码输入控件正是ATL7.1开发的。
至此,整个问题终于解决了。把解决办法交付客户后拿到了570元的酬劳,可惜被可恶的猪八戒扣除交易手续费、个人所得税、提现手续费后,最终到账只有420多元。自己加了100多元后终于如愿以偿的买到了希捷2T硬盘。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66581次
积分:1180
积分:1180
排名:第17438名
原创:44篇
评论:75条
文章:20篇
阅读:33509
(1)(1)(1)(1)(3)(2)(1)(2)(1)(2)(4)(10)(1)(3)(5)(4)(1)(1)com/ATL/Activex - 随笔分类 - DoubleLi - 博客园
随笔分类 - com/ATL/Activex
摘要: 最近把我的控件(ST_Curve www.)升级到了64位,2010编译,本来以为很简单的问题,结果折腾了两天(也有可能我多年没做过界面和vc相关的东西了吧),于是把我遇到的问题罗列一下,希望对需要的人有所帮助(验证的不是很充分,不保证百分之百正确)一:如果一个很老的工程(比如...
摘要: 在InitInstance里边可以获取112if(bInit){//TODO:在此添加您自己的模块初始化代码。g_szOcxPath=this-&m_pszHelpFilePg_szOcxName=this-&m_pszExeNg_szOcxName+=&.HLP&;intnTmp=g_szOcxName.GetLength();nTmp=g_szOcxPath.GetLength()-nTg_szOcxPath=g_szOcxPath.Left(nTmp);}
摘要: 摘要:数字签名SIGN保证控件在下载时候的安全性。如果你的代码已经经过数字签名,即使用户IE的安全设置很高也能下载,安装并登记。但是在页面上初始化,或者用脚本运行这个控件,为了保证安全性,还需要进行MARK。 数字签名SIGN 曹晓峰 摘要:数字签名保证控件的安全性。数字签名使用证书。证书一般有个人证书和授信公司证书。个人证书是对个人的信任,由个人承担责任,控件每次下载时需要进行确认。公司证书是由第三方公司发布的,保证控件的安全性,公司证书需要付费。Windows授信的证书公司有VeriSign,SecureSign等等。由这些公司证书签名的控件在下载的时候不需要确认。 一.工具...
摘要: 我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便。按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通过修改注册表的方法。一般如果用ATL开发ActiveX控件,就用实现ObjectSafe接口的方法。如果用MFC开发,我觉得还是用修改注册表的方法比较方便。下面我们将第二种方法:要包括两个文件1.#include &comcat.h&2.#include &Objsafe.h&// 本控件的CLSID,注册表用1.constGUID CDECL CLSID_
摘要: 本文与OCX控件避免弹出安全警告的类/lidabo/archive//2981852.html 有些类似,只不过增加了几行代码(红色标注)1.要加一个头文件: #include 2.在控件头文件中加入: ////////////////////////////////////////////////////////////////////////// //安全接口实现 DECLARE_INTERFACE_MAP() BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety) STDMETHOD_...
摘要: Windows Registry Editor Version 5.00[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/ZoneMap/Ranges]@=&&[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/ZoneMap/Ranges/Range100]&*&=dword:&:Range&=&
摘要: 当我们通过CWnd::CreateControl()动态创建ActiveX控件时,Windows消息并不会被发送给我们的由CWnd派生得控件类。例如,即使我们为WM_KILLFOCUS消息创建了句柄,这个句柄也是不会被调用的。(不信你试试:))引起这个问题的原因时,CWnd::CreateControl()并不会使我控件的HWND子类化。知道了原因,要解决问题就不难了。我们只要在控件创建之后使它子类化就行了。通过一下步骤可以实现:1.当然是添加控件啦,先生成控件的C++包容类。2.再要创建控件的类中声明成员变量,此成员变量是包容类的指针对象。3.在包容类的头文件中添加://{{AFX_MSG(
摘要: 此文章将介绍页面在 Windows8 适用于桌面版的 Internet Explorer 中与在新 Windows UI 的 Internet Explorer 中的不同表现。Windows 8 中的 Internet Explorer10 提供了两种浏览体验:用户已熟悉的桌面浏览体验,以及新的 Windows 8 浏览体验。 这两种体验所使用的基础组件(从网络堆栈和缓存到呈现引擎)都是相同的。 两种体验都会发送相同的用户代理 (User-Agent) 头信息,并具有相同的文档对象模型 (DOM)。作为开发人员,请将这两种体验看作一个浏览器 - Internet Explorer 10。 网站
摘要: 免费打工仔:一个完善的ActiveX Web控件教程出自Ogre3D开放资源地带跳转到:导航,搜索原作者 David Marcionek.翻译免费打工仔这个教程可以帮助你快速开发一个ActiveX控件。其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method)、属性(propertiy)和事件(event),以及ActiveX控件和网页之间的通讯方法。下载演示程序 - 231 Kb目录[隐藏]1介绍2创建一个ActiveX控件3加入对GIF动画的支持4增加图形进程条对话框5增加支持代码6为ActiveX控件创建网页7构建一个已签名的ActiveX控件8构建一个安全的Active
摘要: 用ATL开发和部署ActiveX网页控件摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程。学习使用ActiveX让浏览器访问客户端的硬件资源。关键字 ATL,ActiveX控件,COM组件一、前言在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机,照相机等。对于一个完善系统来说,往往很多时候又需要控制这些资源。通过在浏览器中插入ActiveX插件是一种很好的解决方式。在实际的项目开发中,遇到系统登录需要增加物理身份识别。即在系统登录的时候,除了要验证用户名和密码外,还需要验证
摘要: 之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以及显示内容,进行自定义。最后决定使用activex技术来实现。众所周知,activex是微软搞得,因此只有ie内核的浏览器才能支持。像firefox(火狐)、Chrome、Apple Safari等非ie内核浏览器都不支持activex控件,这样就大大加大了系统使用的局限性。因此考虑是不是可以让非ie内核浏览器也能支持activex控件,目前火狐等浏览器也有类似于activex控件的技术,那就是插件。所以最终决定以插件来作为连接activex的纽带,使非ie内核浏览器也可以支持activex控件。确定了开发内容后,接下来就是
摘要: 症状描述:Accelerator keys, such as ARROW keys, are first received by the message pump of the ActiveX control's container. Even if the control has the focus, it does not receive messages for keystrokes that have special meaning to control containers, such as ARROW and TAB keys. MFC ActiveX controls h
摘要: 转载自:http://blog.csdn.net/tttyd/article/details/5258096源代码下载 /tttyd/Activex.rar由于在博主的博客中没有讲明工程的创建过程与最后插件的注册方法,我在另一篇文章中作了补充:用ATL写简单的ActiveX控件介绍: 如今在许多流媒体视频网站(youku,tudou......)我们都会发现,观看视频之前都会有一段时间的广告,甚至在观看视频途中也会插入一些广告。实现这个效果的可以有多种技术。使用Javascript就可以实现,只需要在同一个位置分别创建两个Object,一个嵌..
摘要: 我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器其实做起来也挺简单的,我用的环境是VS2005,步骤如下:打开VS2005后:1、创建一个ATL Project。Application Setting选择为:Server-Type:Dynamic-Link Library (dll)Additional-Options: Allow merging of proxy/stub code这里说一句,对于所有只用于web的activex控件,不管有没有界面,都应该用这两个选项。2。选择菜单
摘要: 用户自定义结构数据与VARIANT转换 cheungmine将用户自定义的C结构数据存储成VARIANT类型,需要时再将VARIANT类型转为用户自定义的结构数据,有十分现实的意义,既然我们不想为这样的结构数据写一个COM包装类。虽然有很多方法和手段生成这样的VARIANT,但是,多数时候可能需要一个更加简单的,灵活的方法。我在做远程过程调用的C接口时,忽然联想到,既然RPC可以把任何数据以字节的形式发送,那么,就可以利用这个机制,把结构打包成字节数组。而字节数据是可以很方便地存储在VARIANT中。这个过程是广为人知的,但是,真正把结构列集成字节数组,如果不想使用某些标称的序列化的方法,而全
摘要: 双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后希望在这个窗口中绘制我们的图像、图形等数据,然而ATL向导生成的代码中包含很多错误,下面是其自动向导生成的代码: HRESULT OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcB // 将剪辑区域设置为 di.prcBounds 指定的矩形 HRGN hRgnOld = NULL; if (GetClipRgn(
摘要: 在COM组件中调用JavaScript函数要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:1 组件方(C++)组件A 的方法在IDL中定义:[id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);组件A的方法实现:// 假设回调原型为:// scriptCall
摘要: 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件。(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们。)ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行。控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件。这里控件容器就是浏览器,用户不需要通过浏览器调用控件的属性或方法。因此,开发面向Web的ActiveX控件比开发桌面的
摘要: 本文阅读基础:有一定的C++基础知识(了解继承、回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解。一. 前言 ActiveX控件和它的容器程序如何通讯是一个值得研究的问题,因为这涉及到ActiveX控件和它的容器程序如何交互的问题。VC知识库的杨老师写了一系列博客介绍了一些通讯方式。链接如下:COM 组件设计与应用(十三)--事件和通知(VC6.0)COM 组件设计与应用(十四)--事件和通知(vc.net)COM 组件设计与应用(十五)--事件和通知(VC6.0)COM 组件设计与应用(十六)--事件和通知(vc.net) 这些文章写得真
摘要: 使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+。我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance函数。具体如下:先在应用程序类里定义一个数据成员:[cpp]view plaincopy ULONG_PTRm_gdiplusT然后添加初始化GDI+库的代码和对应的销毁代码:[cpp]view plaincopy BOOLCImagePreviewXApp::InitInstance(){BOOLbInit=COleControlModule::InitInstance();if(bI
摘要: 一.引言上一篇我们讲了如何使用VC 2005来开发MFC ActiveX控件,我们开发ActiveX控件最终目的是将ActiveX控件发布出来并嵌入在Web网页中,随着控件的版本更新自动在客户端浏览器自动更新。这一篇我们就来讲讲这方面的实现。使用工具:PackageForTheWeb二.编译ActiveX控件在发布之前我们最好用VS2005将控件编译成“Release”版本,还有一个值得注意的地方是我们在使用MFC类库来开发ActiveX控件时要考虑客户端是否有MFC类库,解决方法有两种:1.在下面打包的时候将MFC的类库DLL附带上。2.通过“项目”—》“属性”打开项目属性对话框,将“MFC
摘要: 第一种方式多进程模式下,在IE8打开web页面, 然后在调试菜单选择附加到进程, 这时看到2个IE进程, 选择没有带标题的, 也就是主进程, 就可以正常调试了.此方式比较麻烦, 不能F5直接启动IE调试.第二种方式设置IE8为单进程模式, 可以F5直接调试.首先,定位到注册表键:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main然后在该键值下添加一个键值如下:名称:TabProcGrowth类型:REG_DWORD值: 0
摘要: IE8的一个重要特性就是每个Tab(选项卡)在独立的进程中运行,我们称之为LCIE(Loosely-Coupled IE)。 所以大家在升级到IE8之后会发现资源管理器里面有两个或者多个iexplore.exe进程。LCIE 的好处在:1)某个Tab 崩溃(crash)之后不会影响其他Tab 和IE主窗口2)Tab 进程在Vista 和Windows 7 下面以 Low Integrity Level 运行,这种进程基本上无法对系统进行任何读写操作,可以严格把病毒木马拒之门外。 这也就是大家所谓的&沙盘&技术。 插一句题外话:) 很多人认为&沙盘&技术是
摘要: 演示截图:代码简介或代码解析:如何用ATL创建ActiveX控件实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个基于对话框的程序中.详细代码请下载压缩包.(一) 创建工程(1) 打开VC6集成开发环境,按新建按钮,选择PROJECT标签。(2) 选择ATL COM AppWizard。(3) 在右侧Project Name下面的空白处输入&Poly
摘要: 摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发。MFC代表了创建独立的Windows应用的一种简单、一致的方法;ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码。这两种框架在它们对于开发ActiveX的用途上会合了。我们将看看这两种框架是如何适用于创建ActiveX控件的——突出其优缺点,亲自经历创建一个控件的过程——以便你能够决定何时使用一种框架,何时使用另一种。 如果你希望用C++来写ActiveX®控件,有两个流行的框架,一个是Microsoft® Foundation Classes (MFC),另一个是AT
摘要: 一、CString GetCurPath() { TCHAR exeFullPath[MAX_PATH]; CString strP GetModuleFileName(AfxGetInstanceHandle(),exeFullPath,MAX_PATH); strPath.Format(&%s&, exeFullPath); if(strPath.Right(1)!=&//&) strPath += &//&; return strP }二、 HINSTANCE hOcx = ::GetModuleHandle(&
摘要: ActiveX异步回调JavaScript开发环境:VC6.0。背景知识:COM/ActiveX/JavaScript/MFC/Thread想必用过Ajax的童鞋们都知道xmlhttp这个东西吧,通过设定onreadystatechange属性,我们就可以指定他状态改变的回调函数,当状态改变时,ActiveX控件就会调用我们通过onreadystatechange属性制定的回调函数。从而就出现了Ajax给我们带来的精彩。关于Ajax的技术我们这里不做讨论,我们的目的就是实现像xmlhttp这样具有异步回调JavaScript功能的ocx控件来。Let’s go!1.建立MFC ActiveX
摘要: 第一种:通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。m_spHtmlDoc-&get_parentWindow(&m_pHtmlWindow);VARIANTret.vt = VT_EMPTY;BSTR bstr = sScript.AllocSysString();bRet = m_pHtmlWindow-&execScript(bstr, L&javascript&, &ret);::SysFreeString(bstr);sRet = CString(ret);第二种:先用GetIDsOfNames找到
摘要: 源代码下载:MyActiveX.rar声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。在上一篇文章《COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)》中介绍了ActiveX控件中使用多线程的基本需求,并提出了一个简单的线程模型,但却出现了意想不到的问题,本文将尝试给出问题的一个可行的解法,并同时解决上文中提出的第二个问题。其实解决的思路也很简单,一开始我也早就想到了的,
摘要: 声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。最近遇到两个需求:1)在ActiveX控件中使用工作线程来完成底层的硬件设备扫描任务,并在工作线程中根据操作结果回调外部web页面的JavaScript函数;2)能根据控件任务的不同自动调整控件大小。但在查阅了大量资料后,发现网上讨论ActiveX中多线程开发的文章基本没有,最后在csdn论坛里遇到一个高手帮忙后,摸索了几天才解决这两个问题,本文的目的就在于记录下我解决这两个问题的
摘要: 转载自:http://dhailin./blog/static//首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法:[cpp]view plaincopy STDMETHODIMPCtest::test(void)//无输入输出参数{//TODO:在此添加实现代码MessageBox(NULL,L&test&,L&test&,MB_OK);returnS_OK;}STDMETHODIMPCtest::test1(BSTRa1)//有一个字符串输入参数{//
摘要: 转载自:http://blog.csdn.net/cheungmine/article/details/1451489要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:1 、组件方(C++)组件A 的方法在IDL中定义:[cpp]view plaincopy [id(2)]HRESULTlongCalc([in]DOUBLEv1,[in]DOUBLEv2,[in,optional]VARIANTs
摘要: 本文源码与文档下载本章目标:完成本章学习后,您将能够:Ø 了解什么是ActiveX控件 Ø 掌握如何编写基于MFC的ActiveX控件 Ø 掌握如何测试ActiveX控件 Ø 掌握如何测试ActiveX控件 Ø 了解ActiveX控件如何注册 重点:ActiveX控件的实现、测试及注册。本章将介绍ActiveX控件的应用与工作原理。我们可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。那么,该容器就相当于客户程序,它使用ActiveX提供的服务。注:本文改编自孙鑫教程,在此基础上
摘要: 基础知识 C标准函数集锦 标准C I/O函数 sizeof 用法 正确使用内存 有关c++ string类 堆和栈的区别[再转] C++中的异常(exception) API总结和断点函数 字符集和编码知识 高位优先与低位优先 do...while(0)的妙用 理解虚基类、虚函数与纯虚函数的概念 C之修炼 C代码优化方案 C++代码优化方法总结 VC:CString用法整理(转载) VC的若干实用小技巧 (如何干净的删除一个类) 指针 C++部分操作符 C++中const用法总结 VC定时器SetTimer函数 Shell中关于文件路径操作的API函数 调用DLL VC小...
摘要: 症状描述:Accelerator keys, such as ARROW keys, are first received by the message pump of the ActiveX control's container. Even if the control has the focus, it does not receive messages for keystrokes that have special meaning to control containers, such as ARROW and TAB keys. MFC ActiveX controls h
摘要: 在ocx控件中如果含有无模式对话框,那么当ocx在ie中显示时,往往接收不到诸如tab,方向键和退格键。所有这些消息都被IE容器给截取了,对于这个问题,ms给出了解决方法:首先:int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct){if (COleControl::OnCreate(lpCreateStruct) == -1)return -1;OnActivateInPlace (TRUE, NULL); // == UI-Activate the controlreturn 0;}激活控件,以便能接收键盘消息。其次 跟踪转发
摘要: 1.要加一个头文件: #include &objsafe.h&2.在控件头文件中加入:1 DECLARE_INTERFACE_MAP()2 BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)3 STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions);4 STDMETHOD(SetInterfaceSafetyOptio...
摘要: 下面将分别介绍在MFC ActiveX和ATL中如何标记一个控件为安全的控件。要标记一个MFC ActiveX控件为安全,可以仿照下面代码修改而得://CardScan.cpp:CCardScanApp和DLL注册的实现。#include&stdafx.h&#include&CardScan.h&#include&comcat.h&#include&strsafe.h&#include&objsafe.h&CCardScanApptheAconstGUIDCDECLBASED_CODE_t
摘要: Download demo project - 231 KbIntroductionActiveX is a Microsoft technology developed in the mid 90’s, that allows for the creation of applet-like applications that can be downloaded and run within Microsoft's Web browser. This article is intended for Visual C++ developers who are trying to lear
摘要: 为了满足将网站加入到可信站点中,使用系统的控件,在弹出窗口的时候不用提示用户。可以通过下面的方法实现:首先,了解一下可以设置的值和含义。可信站点的注册表项目录HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range[*]ActiveX控件的注册表项目录HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4]\[*]含义说明:Active
摘要: 晚上在博客堂读完VSTO写的一篇文章,介绍了CodePlex上面的一个项目,叫做“All-In-One Code Framework”,代号CodeFx,简单的说,就是收集了几乎所有常见的微软开发技术的示例项目,将其打包到这个框架里,而且还使用各种不同的语言进行实现。比如创建一个ActiveX控件和COM组件,CodeFx里面使用ATL、MFC、VB、C#来实现同样的功能。 适合新手入门,也可以作为一份模板供经验丰富的开发者使用,可节省大量的时间。官方网站上给出了框架的基本结构,如下图所示:COM组件和ActiveX控件示例数据访问示例 库示例进程间通信示例花了2个小时粗略阅读了代码,记录下学
摘要: 相信很多朋友都对QQ伴侣等农场外挂十分好奇吧!其实我也是,然而不幸的是很多像我一样的兄弟在模拟农场登录时,就被JS函数加密的密码字符串给挡在门外,于是百度来google去,始终没有一个完整的代码或例子。 登录时用OmniPeek捕获得到的数据包如下(QQ号1、密码123456、验证码1234): 其实QQ网页登录密码加密方式(包括空间、农场、WEB QQ等)都是一样的。/ptlogin/js/comm.js 周末自己便将腾讯JS加密文件给下载下来了。 (腾讯的JS文件居然一个回车符都没有,真够BT的!害我花了二小时才整理完毕!) 关于JS代码,我是.
摘要: 在这之前我一直在使用MFC框架,现在要学习WTL似乎有些牵强...... 俗话说得好:“工欲善其事,必先利其器”,还是先将基本术语搞清楚吧! 1、STL 即 Standard Template Library STL(标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、 Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C+ +中,但在被引入C++之前该技术就已经存在了很长的一段时间。 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭 代器...
摘要: 一. 关于ActiveX ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡SunMicrosystems的JAVA技术而提出的,此控件的功能和JAVAapplet功能类似。二. ActiveX的开发环境基于ffmpeg的ocx开发使用了visual studio 2010环境作为编译平台,因为vs平台提供了良好的开发ocx类库支持,已经所用到的MF
摘要: 参考链接:/view/f175c823dd36a32d.html
摘要: 8推荐在浏览器中嵌入activex后,线程中触发的事件就没有动静了,如果在调试的情况下,还能发现浏览器有非法错发生。而同样的activex如果使用应用程序来调用则正常。解决方法是取巧的方式,在线程中发出消息,控件响应消息后再FireEvent。1.创建控件项目。 2.类向导, 使用 Add 方法将启动二线程并返回。 下面的代码显示方法启动二线程并立即返回 MFCActiveX 控件中。 全局函数以作为二线程工作函数还声明: LONG ThreadProc(LPVOID pParam); void CFireeventCtrl::StartLengthyProcess() { ...
摘要: 1. 点击【开始】-&【运行】 命令:regedit.2. 定位到HKEY_LOCALMACHINE -& SOFTWARE -& Microsoft -& Internet Explorer -& Main3. 在【右边区域】【右键】新建一个名称为TabProcGrowth的DWORD值, 数值数据设置为0.VS不用重启,直接可以按F5进行调试ActiveX了!参看: /Forums/en-US/vsdebug/thread/e2c795cd-b7a0-4fad-b7c9-b1ca40d7302e 网页中OC
摘要: //比较好的教程ocx 在 win7 系统会出现注册需要管理员权限的问题,这时候需要用管理员身份运行 cmd,然后运行 regsvr32注册。很麻烦尝试使用 nsis 做成安装包, 采用 regdll 注册 ocx, 成功。ocx和外面的程序交互主要通过提供方法属性 + 事件 方法属性可以提供给js调用,事件可以给js 通过下面的方式进行回调注入&object id=&xxx&&&/object&&script language=&JavaScript& for=&xx& Event=&even
摘要: 问题描述:新建一个MFC ActiveX工程,添加一对话框资源,上面有一些标准控件,如按钮、编辑框、树形列表等,并生成一个类CCtrlPanel。 在CXXXXCtrl类中: int CXXXXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; m_CtrlPanel.Create(IDD_CTRLPANEL,this); //m_CtrlPanel在.h文件中申明为:CCtrlPanel m_CtrlP ...
摘要: 原文发表在[http://community.csdn.net/expert/Topicview2.asp?id=3072485]带子窗口的ActiveX控件问题,如何获取回车键? 问题:新建一个MFC ActiveX工程,添加一对话框资源,上面有一些标准控件,如按钮、编辑框等,并生成一个类CCtrlPanel。在CXXXXCtrl类中:int CXXXXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;m_CtrlPanel.Cre
摘要: 孙鑫VC学习笔记:ActiveX 控件作者:华仔|录入时间:|点击:313次打印此文章|字体:大中小基本概念:容器和服务器程序 容器应用程序时可以嵌入或链接对象的应用程序。Word 就是容器应用程序。服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序。Excel 就是服务器应用程序。ActiveX 控件不能独立运行,它必须被嵌入容器应用程序中,和容器应用程序一起运行。---------------------------------------------------------------------------------编写一个 ActiveX 时钟控件
摘要: [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,那么用户在客户端就必须进行本地的注册,也就是说用户得首先要把该ActiveX控件(test.ocx)放在本机的%system%/system32下,然后运行DOS工具里面运行regsvr32 test.ocx命令进行注册。但如果真是这么去做的话,那么代表着你处于危险之中了,因为您是通过让用户自己去部署设置环境来达到你的目的,这就失去软件项目本身所存在的价值。那么面对这种情况,我们应该如何解决呢?聪明的你一定会很快就想到,我们可以使用户在客户端自动下载安装该ActiveX控件,这样一来即可以实
摘要: ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中。在VC下ActiveX控件的开发可以分为三种,一种是直接用COM的API来开发,这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的;一种是基于传统的MFC,采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。MFC为广大VC程序员所熟悉,易于上手学习,但缺点是MFC封装的东西比较多,因此用MFC开发出来的控件相对会比较大,因此比较适于开发桌面ActivexX控件,尤其是有GUI界面的控件。第三种就是基于ATL的,ATL可以说是专
摘要: 1.独立代码//-----------开始---------------------//#include &atlbase.h&#include &Mshtml.h&#include &winuser.h&#include &comdef.h&#include &string.h&void EnumIE(void);//处理网页void EnumFrame(IHTMLDocument2 * pIHTMLDocument2);//处理框架void EnumForm(IHTMLDocument2 * pIHTMLDocument2);//
摘要: 1.独立代码//-----------开始---------------------//#include &atlbase.h&#include &mshtml.h&#include &winuser.h&#include &comdef.h&#include &string.h&void EnumIE(void);//处理网页CComModule _M //使用CComDispatchDriver ATL的智能指针,此处必须声明#include &atlcom.h&void EnumAllElement(IH
摘要: 本文讨论序列化 ActiveX 控件的方法。序列化是从持久性存储媒体(如磁盘文件)中读取或向其中写入的进程。Microsoft 基础类 (MFC) 库在 CObject 类中为序列化提供内置支持。COleControl 通过使用属性交换机制,将此支持扩展到 ActiveX 控件。通过重写 COleControl::DoPropExchange 实现 ActiveX 控件的序列化。在加载和保存控件对象期间调用此函数,以存储用成员变量或用带更改通知的成员变量实现的所有属性。用户可以对控件进行序列化以记录控件的状态。下列主题介绍与序列化 ActiveX 控件相关的主要问题:实现 DoPropExch
摘要: ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾;ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合。一、关于DLL的介绍 DLL,动态链接库,Dynamic Link Library的缩写,是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。DLL作为共享函数库的可执行文件,封装了一个或多个已被编译、链接的函数。多个进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。DLL 还有助于共享数据和资源。 它和可执行文件(.EXE文件)非常类似,他们的区别在于 DLL 中虽然包含了可执行代码却不
摘要: 1.COM基础 2.ActiveX控件及实现 3.ActiveX控件容器及实现 4.总结 1.COM基础 COM是一种组件开发技术, 它实际上是一种在二进制层上兼容的软件开发方法的规范. COM技术是与具体的编程语言无关的技术, 只要是支持COM开发的开发工具都可以用来进行COM应用开发, 而它们在二进制上兼容的要求由各个开发工具来实现, 绝大部分是由编译器实现的. COM的基础概念有以下几部分组成,1)接口的定义及实现, 2)IUnknown接口, 3)GUID (COM中所涉及的概念还有很多,具体的可以参阅其他资料 ). 下面分别简单的介绍它们. 1).接口的定义及实现 一个接口实际上就是
摘要: 摘要: 本文对COM组件中的ActiveX控件的MFC开发方法进行了介绍,讲述了用户自定义和库存属性、方法以及事件的添加方法和属性页的制作过程。使读者能够掌握基本的MFC ActiveX开发方法。 前言 ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件。ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精华,如可链接对象、统一数据传输、OLE文档、属性页、永久存储以及OLE自动化等。 ActiveX控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化服务的IDispat...
摘要: 程序在windowsXP和Windows7 32系统下运行的好好的,今天装了一个windows7 64位系统(说明,程序本身还是32位开发的),运行时出现“0xC015000F 正在被停用的激活上下文不是最近激活的”这个错误,找了好长时间才解决,下面总结如下: 网上提到较多的方法是在调用CWinApp::InitInstance();接口后面使用afxAmbientActCtx = FALSE;我采用这个方法后确实不会出现这个问题,不过我的程序中有一些代码由于把这个变量设成false后导致不执行,所以会出现其他问题,所以放弃该方法。我采用的方式是将Debug时所有MFC异常都抛出,不让MFC.
摘要: 1.打开VC6.0,新建工程,选择:MFC ActiveX ControlWizard,后面步骤默认即可;2.在ClassView上,可以看到主要有**App\**Ctrl\**ProgPage几个类,其中接口主要在**Ctrl内实现,可以通过MFC ClassWizard(ctrl+w快捷键)的Automation页建立接口函数;3.接口函数是对外,因此在参数类型定义上要注意,字符我一般用LPCTSTR,如下面函数: void COnOcxCtrl::CallOcx(LPCTSTR devip) {// TODO: Add your dispatch handler code hereAfx
摘要: 我们在调用WINDOWS函数的时候,经常要在后面加一条GetLastError()来取得函数出错的错误码以及原因,如果在调试的状态中,WINAPI出错了,那我们又要停下来,加一句GetLastError(),然后再跑。这样调试起来很不方便。其实我们可以使用VC里的一些固定符号来进行调试。下面说一下第一个@ERR,我们等函数执行完,并确定它出错了,那我们就可以在VC 的 WATCH窗口里加上@ERR,那我们就马上可以看到出错的错误码了。如果我们还想知道错误码的意思,那我们可以加上@ERR,hr,这样错误码和出错信息都清清楚楚的显示出来了。这个调试方法是不是很棒?其实这种伪符号还有一个用处,在我们
摘要: CString-&TCHAR*的转化可以用函数GetBuff()函数原型为:LPTSTR GetBuffer( int nMinBufLength );CString str(&CString&);TCHAR* szMsg = new TCHAR[100];//其参数为CString字符串的长度szMsg = str.GetBuffer(str.GetLength());str.ReleaseBuffer();delete []szMszMsg = NULL;TCHAR*-&CString的转化TCHAR szTchar[18] = L&TCHA
摘要: 简介 摘要:关于VC中的数据类型转换BSTR、char*和CString的深入研究。 步骤/方法 char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如: char chArray[] = &This is a test&; char * p = &This is a test&; 或 LPSTR p = &This is a test&; 或在已定义Unicode应的用程序中 TCHAR * p = _T(&This is a test&quot
摘要: 如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性此文章的信息应用于:Microsoft Internet Explorer (编程) 版本4.0, 4.01, 4.01 SP1, 4.01 SP2, 5, 5.01, 5.5,6.0概要CSDN文档中心文章 用 MSHTML 的一点经验 111222(原作) 说明了如何访问在HTML文档对象模型中的网页的元素、内容。但是,有时候开发者实际上需要访问的是网页中ActiveX控件的属性、方法和事件。例如,你在网页载入之后需要修改/获取MediaPlayer的媒体源,以及控制MediaPlayer的播放。更多信息为获得Active
摘要: 最近参与了一个项目,我的同事在开发一个ActiveX对象,我帮他编写JS脚本来调用这个对象,其中碰到蛮多问题,最难的就是如何响应由ActiveX对象返回的对象事件。正好,现在一起总结一下。 首先,我来介绍一下COM组件,以便说明js如何响应 COM组件 方法:voidinit()//初始化对象 Project createProject()//创建一个Project类型的对象并返回 事件: onInit( int_code )//当init成功后触发 Project类的结构: 方法:voidinit()//初始化Project对象 事件: onInit( int_code )//当init成功
摘要: 1:创建ActiveX对象在web中使用ActiveX组件有两种方法,一是如下rep_print_medcan.CABOBJECT标签中,通过ID指点了对象的ID号,javascript可以使用该ID号来引用该对象,而classid用于标识这个组件,每个ActiveX组件都有唯一一个用于表示他的ID号。而codebase指定的程序下载到本地(在系统目录的“DownloadedProgramFiles”子目录下),然后调用组件程序的自注册入口函数注册到当前系统中,以后的创建都在本地进行,不再涉及codebase属性使用以上的方法来创建ActiveX对象,有些参数设置需要手抖的填写,麻烦,2、另外
摘要: MFC Activex与JavaScript的接口交互在Activex的应用中与网页的JavaScript的交互必不可少,在这里就简单的介绍下。VC 创建的Activex的有两种类型,MFC Activex与ATL Activex, 在VC新建工程的时候选择,这篇文章介绍的是针对MFC Activex的,ATL Activex可以绕过了。测试环境:: VC++ 6.0 SP6(一) MFC Activex与JavaScript的传递参数、返回值在JavaScript调用时Activex方法,可以归分为两种:1参数为整型变量,返回为整型变量long CActivexCtrl::Func(long
摘要: 1.向ActiveX注册JS函数:在ActiveX中添加接口方法 - void RegisterFunction(BSTR bstrFuncName, IDispatch* dispFunc);JavaScript代码声明一个函数,并调用RegisterFunction接口向ActiveX注册该函数,供ActiveX调用。2.保存注册的函数,ActiveX使用CComDispatchDriver对象保存注册的JS函数(IDispatch接口指针)CComDispatchDriverm_Func1;void RegisterFunction(BSTR bstrFuncName, IDispatc
摘要: 4.实现从ActiveX调用网页中的javascript.设计思路:从上述项目中产生的calc.html中创建一个js函数来调用控件的CallWebJs方法,而CallWebJs方法又调用页面中的js方法printMsg();具体操作如下:同3中的做法,再为控件添加一个方法命名为CallWebJs,在calc.cpp中找到该方法,并实现如下:STDMETHODIMP Ccalc::CallWebJs(VARIANT scriptCallback){// TODO: Add your implementation code hereCComPtr&IDispatch& spCallb
摘要: 1. 打开VS2008,单击起始页中的“New Project…”,选择“ATL”分类下的“ATL Project”项目,项目名称为“ATLtest”。在随后出现的项目向导中,使用默认配置即可。&?xml:namespace prefix = o ns = &urn:schemas-microsoft-com:office:office& /&&?xml:namespace prefix = v ns = &urn:schemas-microsoft-com:vml& /&2. 添加控件在解决方案管理器中的项目上右击,依次选择“A
摘要: 本文描述了使用ATL开发一个ActiveX控件的完整过程。一、创建项目单击起始页中的“New Project…”,选择“ATL”分类下的“ATL Project”项目,项目名称为“Calculator”。在随后出现的项目向导中,使用默认配置即可。 二、添加控件在解决方案管理器中的项目上右击,依次选择“Add”、“Class”,在添加类对话框中选择ATL分类下的ATL Control类型。单击“Add”按钮,将会出现添加ATL Control向导。 在向导的第二步中,将接口类型选择为“Dual”,为控件支持事件做为准备,在Support选项中,选中“Connection points”复选框。.
摘要: 之前写过文章通过自定义函数来实现ActiveX回调JS中的函数,最近在网上发现一更简洁的方法,通过事件触发,在这里小结一下,为使内容连贯,请参考我之前的《一步一步实现ATL开发的ActiveX组件与javascript的交互》系列文章/hwygy_001/blog/item/21ec5bc26ac72.html:1.如果使用的是VS2010,则在Class View窗口中右击_ICalcEvents接口,依次选择“Add”、“Add Method…”,根据添加方法向导添加AddCompleted方法,如下图所示:若采用的VS2008,

我要回帖

更多关于 atl控件 的文章

 

随机推荐