最近几天在开发控件,因为初次开发,期间遇到了不少问题,下面是我的遇到的问题以及有用的帖子.
我的开发环境是vs2008,IE8.0,MFC控件,C++,WINXP
在IE里加载一个带socket通信的控件,控件和自己开发的原程序差不多,把该用的都从原程序复制过来,再处理一下.
http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html 这篇帖子详细介绍了MFC控件开发的所有过程
http://www.codeproject.com/Articles/14533/A-Complete-ActiveX-Web-Control-Tutorial 这里是MFC控件的一个列子,里面有批处理.
我在 https://www.wosign.com/index.htm 申请的微软数字代码.
主要问题是控件加载的时候遇到红叉,这个问题搞了2天.主要是把clsid搞错了,在.idl文件中,
// MyActiveX.idl : type library source for ActiveX Control project.
// This file will be processed by the MIDL compiler tool to
// produce the type library (MyActiveX.tlb) that will become a resource in
// MyActiveX.ocx.
#include
#include
[ uuid(CBE9E0B0-95DB-4495-8BE8-E4CB416EF07D), version(1.0),
helpfile("MyActiveX.hlp"),
helpstring("MyActiveX ActiveX Control module"),
control ]
library MyActiveXLib
{
importlib(STDOLE_TLB);
// Primary dispatch interface for CMyActiveXCtrl
[ uuid(98AF8A06-7DFE-472D-A713-A0C6F22FDC3D),
helpstring("Dispatch interface for MyActiveX Control")]
dispinterface _DMyActiveX
{
properties:
[id(1) , helpstring("property InputParameter")] BSTR InputParameter;
[id(2) , helpstring("property OutputParameter")] BSTR OutputParameter;
methods:
[id(3), helpstring("method LoadParameter")] void LoadParameter(void);
};
// Event dispatch interface for CMyActiveXCtrl
[ uuid(78099343-A8FF-4867-A537-06F31034F22B),
helpstring("Event interface for MyActiveX Control") ]
dispinterface _DMyActiveXEvents
{
properties:
// Event interface has no properties
methods:
[id(1)] void ParameterLoaded(void);
};
// Class information for CMyActiveXCtrl
[ uuid(36299202-09EF-4ABF-ADB9-47C599DBE778),
helpstring("MyActiveX Control"), control ]
coclass MyActiveX
{
[default] dispinterface _DMyActiveX;
[default, source] dispinterface _DMyActiveXEvents;
};
};
我认为是CBE9E0B0-95DB-4495-8BE8-E4CB416EF07D 这个是clsid,结果怎么弄都是红叉,不能加载,但是查看regeit,对应的的控件已经存在,后面看了找到http://www.codeproject.com/Articles/14533/A-Complete-ActiveX-Web-Control-Tutorial这个列子,仔细看了一下其实clsid应该是:36299202-09EF-4ABF-ADB9-47C599DBE778,改好网页,再数字签名,正确显示程序界面.
在后面又遇到新的问题,我的控件是要与服务器通信的,有一个模式对话框,用于用户登入,一个非模式对话框,用于主界面显示,在TstCon32.exe中测试的时候,正确显示,模式和非模式对话框正确打开,通过IIS服务器,在IE里运行的时候,只显示登入界面的对话框,非模式对话框总是显示红叉,折腾了一天无果,后面重新弄了个工程,在控件新建的时候"控件设置->创建的控件基于->STATIC"(原先是按默认的"控件设置->创建的控件基于->none"),,红叉没有啦,正常运行.happy.
遇到的问题:
1.控件开发的时候由于是有2个网卡,不同网卡切换出现好几次蓝屏.
2.控件开发的时候,下载网上的其他例子控件也试一下,有时候打开IE的时候系统会要求重新启动,重新启动后正常登入,但WINDOW界面打不开,好像是加载某个控件出现问题explorer.exe出现问题,重新打开explorer.exe就好啦,然后用360扫描无效的控件,清除就好啦.
3.要用到数字证书,太麻烦啦.重新签名,打包,唉,记得要用到MyActive下面的批处理,方便点.
4.在TstCon32.exe和本地IE中测试通过,但通过IIS服务器,总是出现红叉,不知道是不是控件类型的缘故(STATIC).
以下是几个注意点:
1.clsid不要弄错,要不会出红叉
2.控件安全请参照(http://www.codeproject.com/Articles/14533/A-Complete-ActiveX-Web-Control-Tutorial) MyActiveX.cpp, CLSID_SafeItem,还有CreateComponentCategory下面的东西都要弄到自己的工程(虽然不知道为什么).
3.由于我的工程要用到GDI+,SOCKET,由于一开始没有加GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL),Bitmap读图片的时候读不进来,所以,不要忘了在InitInstance里面加入
BOOL CHXCWApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
WSADATA WSAData = {0};
if ( 0 != WSAStartup( WSA_VERSION, &WSAData ) )
{
if ( LOBYTE( WSAData.wVersion ) != LOBYTE(WSA_VERSION) ||
HIBYTE( WSAData.wVersion ) != HIBYTE(WSA_VERSION) )
AfxMessageBox(_T("网络初始化失败"));
WSACleanup();
return FALSE;
}
}
return bInit;
}
在结束的时候
int CHXCWApp::ExitInstance()
{
// TODO: 在此添加您自己的模块终止代码。
WSACleanup();
GdiplusShutdown(gdiplusToken);
return COleControlModule::ExitInstance();
}
4.控件在TstCon32.exe中调试,vs2008中,"工具->外部工具->添加",如图
(这里我的安装目录是D盘)
命令(D:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe)
初始目录(D:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools)
命令(D:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe)
5.控制在本地IE中调试
请见(http://hi.baidu.com/shanghaocool/item/6fe942e0d28ea42e6dabb859)
6.控件通过IIS服务器在IE中运行(http://127.0.0.1/index.html),注意数字签名哦,