关于组件的问题。请进

hillfree 2002-01-10 01:35:27
在VS6中,工程菜单-Add to Project-Components and Controls里

1。在已经注册的控件中选择了一个组件加入工程。ComponentA 例如

2。VS自动生成了一个类。 CComponentA


3。这时候我在CMainframe声明了该类的成员 CComponentA m_Web;

4。结果使用这个成员的函数时,出现断言错:
not an OLE control (not yet, at least)

但是,如果在一个对话框中,采用右键的Insert ActiveXControl加入此控件,并且同样声明一个成员,则使用起来就没有问题。


问:这是为什么? 在没有对话框的情况下应该怎么办?

...全文
113 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hillfree 2002-01-13
  • 打赏
  • 举报
回复
Wither(萎君子) 回复于2002-1-12 20:07:00
我说一下我的理解:
ActiveX本身也是一个窗口,所以你当然要主动的Create它,跟普通窗口不同的是。它总是需要一个父窗口,而且这个父窗口要是一个ControlContainer,要支持IControlSite等接口。这就是在创建工程时我们要选ActiveX支持的原因,ActiveX就是依靠和容器约定的几个接口通信。

非窗口类中的确不能使用ActiveX,自动生成的类叫做包装类。


 hillfree(如同日内瓦) 回复于2002-1-13 12:56:43
Wither(萎君子)所言,果然理解的精辟呀.hehe

那么这样试试好了,我在MainFrame中初始化这个ActiveX控件,然后在非窗口类中PostMessage到MainFrame中,在Mainframe中作一个映射来处理一下好了.

先去试试,多谢各位的讨论,各位还有什么高见,望能一吐为快,共同提高.

ps.本来是可以给分了.不过还是舍不得大家就这样散了.所以等等,希望大家能在讨论一下.分数的话没有问题.呵呵.对了,不知为什么,小弟的专家分好像僵住了,似乎别人给了也加不上去.???很疑惑这个.嘿嘿,其实也没几分.:)就是觉得是不是论坛的bug?

Soft21 2002-01-12
  • 打赏
  • 举报
回复
大家好啊,哈哈,我学到了不少东西
tomPeakz 2002-01-11
  • 打赏
  • 举报
回复
ActiveX是COM规范的拓展,实际是自动化的内容。你可以多看看资料,推荐“COM原理与应用”

大家共同提高吧。:)
hillfree 2002-01-11
  • 打赏
  • 举报
回复
多谢 tomPeakz(张子) 的指教,关于COM这一节的问题出在那里我已经大概知道了。不过有疑问的是:对于已经wrap up的ActiveX控件是不是同样的代码,同样的事情。还是怎么着?

刚才有翻内幕5ed:现浏览了一下24章COM,然后扫了一眼30章ATL&ACTIVEX,过去看的时候根本就是打马虎眼,粗粗看过去的。没有实际的使用,根本体会不到上面说的。

结果,发现要看看第8章使用Activex控件:(有几个小小的所得)

1。EX08A中使用Calender控件的时候,是插入在一个Dialog资源中的。所以使用非常方便。

2。在例子之后Ex08B之前,有一段大概20行的一段:“运行时创建ActiveX控件”讲的就是这个情况。总体上讲的比较清晰,就是不太详细。

我先看看能不能搞定。还请大家指教。多谢多谢
tomPeakz 2002-01-11
  • 打赏
  • 举报
回复
呵呵,是这样的,如果你导入的组件有可视界面(像DELPHI、VB中拖放组件一样)那它需要一个“父亲”窗口才行。如果没有界面,只是执行一些内部运算操作,就不需要了。
但是COM规范要求在使用COM时,必须先初始化COM环境,就是:
CoInitialize();

if(FAILED(CoInitialize(NULL)))
{
AfxMessageBox(_T("CoInitialize Error!"));
return;
}

IMath * pMath;
HRESULT hr;
hr = CoCreateInstance(CLSID_Math,NULL,CLSCTX_LOCAL_SERVER,IID_IMath,(void * *)&pMath);
if(FAILED(hr))
{
AfxMessageBox(_T("CoCreateInstance Error"));
CoUninitialize();
return ;
}

用毕后,使用CoUninitialize();
在VB OR DELPHI中,是系统帮你做好了,所以不用这么做。
明白了否??
hillfree 2002-01-11
  • 打赏
  • 举报
回复
TO Jady():
希望能知道详细一些的内容。或者说说要看看什么书的什么地方?谢谢了。

ps.
哎,发现自己还是基本功太差。

用的时候只要可以work,就万事大吉。知其然不知其所以然。结果只要出了问题就傻眼了。

唉,看来COM, OLE,和ActiveX还是要找几本书好好看看才行呀。
hillfree 2002-01-11
  • 打赏
  • 举报
回复
呵呵,搞定了,在加入成员的那个窗口类中调用一下它的Create()就行了。

一个新问题:那么如果在非窗口类中是不是不能使用ActiveX控件呢?(不好意思,我这部分的概念比较昏。)

//老潘那本《原理与应用》俺也看过一些,因为连做一个试验,写个例子都要从零开始比较困难。所以就放下了。总是想怎么傻瓜怎么来。唉,土呀。

Jady 2002-01-10
  • 打赏
  • 举报
回复
你需要进行COM的初始化,CoInitialize;
还有使用CoCreateInstance得到该组件;
否则怎么使用呢?
而在对话框rc中加的话,系统已经帮你做了这些工作。

--Jady
hillfree 2002-01-10
  • 打赏
  • 举报
回复
在此求解,大家多多指教。

-=--------------------三人行,必有我师。
hillfree 2002-01-10
  • 打赏
  • 举报
回复
试了一个办法,还是不行。
比如:我把这个组件插入到一个FormView中,并将其声明为一个成员。

1。在FormView的OnInitialUpdate中调用m_Alert.memfunction();没有问题。

2。在formView中声明一个公用方法Notification{ m_Alert.memfunction()};

3. 在其他地方得到这个View的指针后。pView->Notification(),间接调用。也不行!!!
也是说not an Ole control!!!


望大家给点想法。谢谢了。
fiolin 2002-01-10
  • 打赏
  • 举报
回复
I'm sorry!! I don't know!
hillfree 2002-01-10
  • 打赏
  • 举报
回复
比较着急请大家多多指教。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧