首页 > 编程知识 正文

mfc实例开发案例,mfc系统开发设计思想

时间:2023-05-03 20:50:26 阅读:210827 作者:1409

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

我的开发环境是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 <olectl.h>#include <idispids.h>[ 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 propertiesmethods:[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);WSADATAWSAData = {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 FilesMicrosoft Visual Studio 9.0Common7ToolsTstCon32.exe)

初始目录(D:Program FilesMicrosoft Visual Studio 9.0Common7Tools)

命令(D:Program FilesMicrosoft Visual Studio 9.0Common7ToolsTstCon32.exe)

5.控制在本地IE中调试

请见(http://hi.baidu.com/shanghaocool/item/6fe942e0d28ea42e6dabb859)

6.控件通过IIS服务器在IE中运行(http://127.0.0.1/index.html),注意数字签名哦,

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