CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

MFC ActiveX向导做的控件初始化问题

楼主jtq(流浪水手)2006-03-15 18:32:34 在 VC/MFC / ATL/ActiveX/COM 提问

我想实现这样一个功能:用户在插入我的控件时,首先判断一个条件,如果这个条件成立则插入该控件,否则提示用户缺少...,不插入该控件.  
   
  不知道该怎么实现,请高人指点!  
   
  就象CWinApp在InitInstance()函数中可以添加这个条件,但是不知道COleControl是否有类似这样的初始化函数 问题点数:20、回复次数:18Top

1 楼firmbird(firmbird)回复于 2006-03-15 19:13:23 得分 0

class   CXXXApp   :   public   COleControlModule    
  {    
  public:    
  BOOL   InitInstance();    
  int   ExitInstance();    
  };    
  Top

2 楼MLiang(俺想有栋房)回复于 2006-03-17 16:59:46 得分 0

顶!同意楼上的Top

3 楼jtq(流浪水手)回复于 2006-03-18 12:58:07 得分 0

楼上两位的方法我有试过了,似乎行不通。  
  因为注册控件时会调用InitInstance()函数,由于条件没满足控件注册失败。Top

4 楼xiaoqiqixiao(七七)回复于 2006-03-18 14:03:08 得分 15

对于MFC,有一个简单的方法,重载OnCreateAggregates,如果返回FALSE,那么将创建控件失败Top

5 楼jtq(流浪水手)回复于 2006-03-18 22:01:17 得分 0

楼上,我试了你的方法。  
  插入控件时不会调用OnCreateAggregates这个函数Top

6 楼jtq(流浪水手)回复于 2006-03-19 16:39:49 得分 0

没有其他解决方法吗Top

7 楼xiaoqiqixiao(七七)回复于 2006-03-20 08:44:17 得分 0

应该会的啊,不过没事,如果你不怕麻烦的话,还有一法。  
  新建MFC ActiveX   Control时,选中Would   you   like   the   controls   in   this   project   to   have   a   runtime   license。  
  然后在生成的文件中重载COleObjectFactory的VerifyUserLicense或VerifyLicenseKey函数,这两个会调用到的,至少有一个会。  
   
  Top

8 楼xiaoqiqixiao(七七)回复于 2006-03-20 08:52:30 得分 0

但是,没道理OnCreateAggregates不会调用啊,你确定正确的定义了它,是  
  BOOL   OnCreateAggregates(),定义为你的控件的函数。你可以在里面弹出一个消息框试试看看有没有调用。  
  没道理我这里会调用,你这里不调用啊。看你的水平,不象是会去掉EnableAggregation的人啊Top

9 楼jtq(流浪水手)回复于 2006-03-20 14:51:30 得分 0

不过我是不会调用OnCreateAggregates()函数  
  添加这个函数是没问题的,就是在CXXXApp类里重载OnCreateAggregates函数  
   
  WordActiveX.h文件如下  
  class   CWordActiveXApp   :   public   COleControlModule  
  {  
  public:  
  BOOL   InitInstance();  
  int   ExitInstance();  
  public:  
  virtual   BOOL   OnCreateAggregates();  
  };  
   
  WordActiveX.cpp文件如下:  
  ...  
  BOOL   CWordActiveXApp::OnCreateAggregates()  
  {  
  //   TODO:   在此添加专用代码和/或调用基类  
  MessageBox(NULL,   "提示",   "欢迎来到word世界!",   MB_OK);  
   
  return   TRUE;  
  }Top

10 楼jtq(流浪水手)回复于 2006-03-20 15:04:25 得分 0

我做的事是在word文档里插入一个控件,当某个条件不满足时就给出提示,然后就不插入该控件Top

11 楼xiaoqiqixiao(七七)回复于 2006-03-20 15:11:20 得分 0

大哥,不是吧,都说了重载控件的函数,什么是控件类,当然是你的CXXXCtrl了,我晕倒Top

12 楼huguyue6670(美丽海洋)回复于 2006-03-20 15:48:15 得分 0

你可以模仿以下jsp是怎么实现你所说的功能的。但是在VC下我就不知道了。Top

13 楼jtq(流浪水手)回复于 2006-03-20 16:21:28 得分 0

楼上,不好意思,小弟采鸟。  
   
  还有一个问题想请教楼上,我现在在OnCreateAggregates()函数添加两行代码如下:  
  BOOL   CMyActiveXCtrl::OnCreateAggregates()  
  {  
  //   TODO:   在此添加专用代码和/或调用基类  
  MessageBox("欢迎来到word世界!",   "提示",   MB_OK);  
  return   FALSE;  
  }  
   
  测试的时候比如说在一个对话框中添加这个控件,它首先弹出上面消息框,然后连着两次弹出  
  MicroSoft开发环境提示的:未能实例化ActiveX控件"MyActiveX   Control"。  
   
  另外如果在word文档里插入该控件是连着两次弹出上面消息框,然后显示一个内存不足,请保存文档的提示框。  
   
  这样给人的感觉不是很好,楼上有何高见Top

14 楼xiaoqiqixiao(七七)回复于 2006-03-20 16:29:25 得分 0

用这个方法的话,基本无法解决,因为你的类厂COleObjectFactory调用OnCreateAggregates时,如果OnCreateAggregates返回为FALSE的话,它就返回一个E_OUTOFMEMORY,也就是你说的内存不足,虽然实际上并没有内存不足,但是,它要返回这个错误,我也没法。  
   
  要想得到好的效果,你可以参考我前面的另一方法,那样的话,会返回CLASS_E_NOTLICENSED,也就是没有认证之类的,估计也有这方面的消息框弹出。  
   
  要想获得自己所想的效果,那就自己实现你的类厂吧。Top

15 楼jtq(流浪水手)回复于 2006-03-20 20:28:58 得分 0

是的,系统也会弹出相应的消息框。  
   
  实现自己的类厂以我的水平还不知道从何下手,不知道学习起来要多久Top

16 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-21 06:30:40 得分 4

http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/licensing.aspTop

17 楼huguyue6670(美丽海洋)回复于 2006-03-21 09:07:35 得分 1

搂主看一下下面的代码是不是对你有帮助:  
   
   
   
  下面我就简单的来讲一下如何引用一个ActiveX控件,我以Flash控件为例:  
  这里我就不一步一步讲了,有兴趣的话就下载源代码吧:)  
   
  点击这里下载工程源代码  
   
  //   首先要包含几个COM头文件  
  //   因为要用到ATL容器窗口,所以需要初始化一个CComModule以及包含atlwin.h头文件  
  #include    
  CComModule   _Module;  
  #include    
  #include    
  #pragma   comment(lib,"atl")  
   
  //   引入FLASH控件,这里的路径为自己计算机上的FLASH控件的实际路径  
  #import   "C:\WINNT\system32\Macromed\Flash\Flash.ocx"  
  using   namespace   ShockwaveFlashObjects;  
   
  //   在WinMain中做初始化  
  int   APIENTRY   WinMain(HINSTANCE   hInstance,HINSTANCE   hPrevInstance,LPSTR   lpCmdLine,int   nCmdShow)  
  {  
    CoInitialize(NULL);  
    AtlAxWinInit();  
    .  
    .  
    .  
    CoUninitialize();  
    return   msg.wParam;  
  }  
   
  //   开始创建ATL容器窗口,并通过QueryControl()方法获得FLASH控件对象  
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  {  
    static   CAxWindow         WinContainer;  
    static   CComPtr   pFlash;  
   
    switch(message)  
    {  
    case   WM_CREATE:  
      RECT   rc;  
      GetClientRect(hWnd,&rc);  
      WinContainer.Create(hWnd,&rc,LPCTSTR("ShockwaveFlash.ShockwaveFlash"),WS_CHILD   |   WS_VISIBLE);  
      HRESULT   hr;  
      hr   =   WinContainer.QueryControl(__uuidof(IShockwaveFlash),(void**)&pFlash);  
      if(FAILED(hr))return   -1L;  
      hr   =   pFlash->put_Movie(CComBSTR(L".\\sample.swf"));  
      if(SUCCEEDED(hr))pFlash->Play();  
      break;  
    .  
    .  
    .  
    case   WM_DESTROY:  
      pFlash.Release();  
      WinContainer.DestroyWindow();  
      PostQuitMessage(0);  
      break;  
   
    default:  
      return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
    }  
   
    return   0L;  
  }  
   
  好了,终于我也可以在我的程序中播放FLASH动画了,高兴啊:)  
   
   
   
   
   
   
  Top

18 楼xiaoqiqixiao(七七)回复于 2006-03-22 15:56:17 得分 0

很抱歉,但是,很可能自己实现类厂也无法完美,因为必须要在类厂接口的CreateInstance方法返回一个HRESULT,如果返回错误,容器将会弹出相应的错误消息,错误处理是由容器决定的,没法。如果你返回成功,却没有正确的控件接口指针,很显然也会出错。  
  如果在建立了控件后,再delete   this删掉控件,同样会有问题,因为容器是认为你的控件的指针是有效的,但你删掉后,肯定无效,问题更大。  
  让类厂支持ISupportErrorInfo也许可行,但是,似乎好象很少有容器会检查IErrorInfo来提示错误消息,至少我试的VB和ActiveX   Control   Test   Container也不行。  
  所以,帮不了你了,个人认为,最好的效果也只是能在众多的错误提示中选择某一个比较不起眼的提示,比如没有通过认证之类的。  
  不知道有没有高手能提供更好的解决方法。Top

相关问题

  • mfc中对象初始化的顺序 问题
  • 关于ActiveX控件初始化与设置时钟的问题
  • 关于ActiveX控件自定义属性的初始化问题
  • 问:MFC类库工程中,要不要手动初始化\释放COM库?
  • 请问在支持MFC的DLL里如何初始化和销毁COM那?
  • mysql初始化
  • list初始化
  • 初始化
  • 使用MFC Activex ControlWizard向导写ocx遇到问题
  • 使用MFC Activex ControlWizard向导写ocx遇到问题

关键词

  • 控件
  • 函数
  • activex
  • 代码
  • 文件
  • 文档
  • 消息
  • 内存
  • mfc
  • atl

得分解答快速导航

  • 帖主:jtq
  • xiaoqiqixiao
  • jiangsheng
  • huguyue6670

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo