MFC控件开发总结

最近几天在开发控件,因为初次开发,期间遇到了不少问题,下面是我的遇到的问题以及有用的帖子.

我的开发环境是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),注意数字签名哦,

你可能感兴趣的:(MFC控件开发总结)