就是能够象VB或VC开发环境那样的,选菜单项“插入ActiveX控件”就能把已经注册的ocx控件用列表框列出来,当我点选这个控件时,能够在对话框或View上动态创建。(应该会用到注册表吧)另外,关于动态创建(我说的动态创建是:我的程序已经做好了,然后又要加人新的控件)我发过帖子问过,基本上有两种方式:其一是用CWnd::CreateControl, jiangsheng(蒋晟.MSMVP2004Jan) 大哥说用法参考CHTMLView的源代码,可是我一直没有找到,如果哪位有发到我的信箱里吧,[email protected] 多谢多谢,另外一种方法是用com技术,得到CLSID,我不是很懂,如果哪位有例子,或者知道给讲解一下吧,或发到我得信箱里,分不够可以再加,多谢了!
解决方案 »
- 问一下关于int转float的问题
- 请教一个指针问题
- 巨难的问题,delphi区无人能解,只好到vc区求助,分不够再加。
- 在windows下实现纳秒级延时~~~
- 有人投诉daveice (沙) 与 tt0595(大自然) 有导分嫌疑!大家看看怎么办好呢!http://community.csdn.net/Expert/topic/3059/3059030.xml?t
- InitInstance()中的对象
- CTime问题
- 今天第一次来,先送点分给大家,本来要给一半100分,但好像只能给20分哦,hoho~~
- 我下了一个软件,运行时说找不到mfc4.dll,谁能把他寄给我?收到就结帐。
- 对话框回调函数问题求助:
- 关于listview 右键点击图标弹出对话框的问题!(急……)
- 如何在DoModal##前##修改无模态对话框的标题?
CAxWindow m_ax;
LPCTSTR pszName = __T("yourtlb.controlname");//控件的ProgID
HWND hwndContainer = m_ax.Create(m_hWnd,rect,pszName,WS_CHILD|WS_VISIBLE);
可以通过
IXXXX* pXXXX = NULL;
m_ax.QueryControl(&pXXXX); //得到控件接口
pXXXX->foo(); //调用方法或者设置属性
您给的例子还是在已知Activex控件类的基础上的
我想实现的是这样一个控件容器:只要ocx或dll在系统中注册,我可以不知道它的类
我就可以将其列出,并动态创建。
类似于VB开发环境下,可以将任意的已注册控件的窗体拖到form上。
您给的代码中CAxWindow 是继承自哪个类的?
另外如果我只知道要创建控件的名称(比如mschart.ocx)那么它的ProgID怎么得到呐?
不好意思打扰,希望能得到您的帮助,多谢!
由于文档中心升级,目前还不能发表文章,而你问这个问题又比较急,因此,我只能尽量帮你一下,把动态注册控件的核心代码给你列出如下://------------------------------------------------------------------
// 注册控件函数
BOOL CEx32Dlg::Register(CString strOcxPath)
{
BOOL bResult = FALSE ;
// 检查是否支持注册
if (SupportsSelfRegister(strOcxPath))
{
HMODULE hModule = ::LoadLibrary(strOcxPath) ;
if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
// 获得注册函数地址
CTLREGPROC DLLRegisterServer =
(CTLREGPROC)::GetProcAddress(hModule,"DllRegisterServer" ) ;
if (DLLRegisterServer != NULL)
{
HRESULT regResult = DLLRegisterServer() ;
bResult = (regResult == NOERROR) ;
}
::FreeLibrary(hModule) ;
}
return bResult ;
}//------------------------------------------------------------------
// 卸载注册控件函数
BOOL CEx32Dlg::UnRegister(CString strOcxPath)
{
BOOL bResult = FALSE ;
// 检查是否支持注册
if (SupportsSelfRegister(strOcxPath))
{
HMODULE hModule = ::LoadLibrary(strOcxPath) ;
if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
// 获得注册函数地址
CTLREGPROC DLLUnregisterServer =
(CTLREGPROC)::GetProcAddress( hModule,
"DllUnregisterServer" ) ;
if (DLLUnregisterServer != NULL)
{
HRESULT regResult = DLLUnregisterServer() ;
bResult = (regResult == NOERROR) ;
}
::FreeLibrary(hModule) ;
}
return bResult ;
}//-----------------------------------------------------------------
// 检查控件是否支持注册
BOOL CEx32Dlg::SupportsSelfRegister(CString strOcxPath)
{
BOOL bResult = FALSE;
DWORD handle;
UINT uiInfoSize;
UINT uiVerSize ;
UINT uiSize ;
BYTE* pbData = NULL ;
DWORD* lpBuffer;;
char szName[512] ;
// 获得文件大小信息
uiInfoSize =
::GetFileVersionInfoSize(strOcxPath.GetBuffer(0),
&handle);
if (uiInfoSize == 0) return FALSE ; pbData = new BYTE[uiInfoSize] ;
// 获得文件信息
bResult =
::GetFileVersionInfo(strOcxPath.GetBuffer(0),
handle,
uiInfoSize,
pbData);
if (!bResult) goto NastyGoto ;
// 在注册表中查找
bResult =
::VerQueryValue( pbData,
"\\VarFileInfo\\Translation",
(void**)&lpBuffer,
&uiVerSize);
if (!bResult) goto NastyGoto ;
bResult = uiVerSize ;
if (!bResult) goto NastyGoto ;
// Build the path to the OLESelfRegister key
// using the translation information.
sprintf( szName,
"\\StringFileInfo\\%04hX%04hX\\OLESelfRegister",
LOWORD(*lpBuffer),
HIWORD(*lpBuffer)) ;
// Search for the key.
bResult = ::VerQueryValue( pbData,
szName,
(void**)&lpBuffer,
&uiSize);
NastyGoto:
delete [] pbData ;
return bResult ;
}一般注册控件最好选择在窗体的OnCreate事件中。
在窗体的.cpp文件中加上:#ifdef _WIN32
#define LOADLIBRARY_FAILED(x) (x == 0)
#else
#define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
#endifProject-->Settings的link加上链接库:version.lib