MFC ActiveX向导做的控件初始化问题
我想实现这样一个功能:用户在插入我的控件时,首先判断一个条件,如果这个条件成立则插入该控件,否则提示用户缺少...,不插入该控件.
不知道该怎么实现,请高人指点!
就象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




