用Add Component and Control加入一个ocx控件时VC都做了些什么?

ymxl76 2003-09-11 11:54:23
我现在用Add Component and Control加入一个ocx控件,但总提示我:
The ActiveX control is not registerd properly,or its type library version number is incorrect.Try registering the control by removing and importing it in the Component Gallery.这是为什么?
注:我的控件可以在测试容器中正常使用。而且我在VC中用Add Class from a type library...也可以创建ocx的包装类。
...全文
112 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
天限天空 2003-09-12
  • 打赏
  • 举报
回复
遇到过相同的问题,
重启一次就ok了

系统大了,有些莫名其妙的问题
ymxl76 2003-09-12
  • 打赏
  • 举报
回复
我在建立项目时就已经选择了支持OLE Containerv了呀。
ymxl76 2003-09-11
  • 打赏
  • 举报
回复
现场给分。
opentuxedo 2003-09-11
  • 打赏
  • 举报
回复
是不是你的项目不支持OLE Container呀?AfxInitOleContainer了吗?
ymxl76 2003-09-11
  • 打赏
  • 举报
回复
我开始怀疑是没有把类型库信息编译进去。但后来发现可以分析到所有类型信息。
ymxl76 2003-09-11
  • 打赏
  • 举报
回复
已经注册成功了。我的Container都已经可以成功地加载ocx了。
我是用regsvr32注册的。
而且我已经查看过注册表了,绝对是成功的。
gzshd 2003-09-11
  • 打赏
  • 举报
回复
你的ocx还没有注册,你可以在你的程序里注册你的ocx控件,如下:

在C***App的InitInstance()里加入:
//初始化环境
if (FAILED(OleInitialize(NULL)))
{
AfxMessageBox("OLE initialization failed.Make sure that the OLE libraries are the correct version.") ;
return FALSE ;
}

下面的都是在CMainFrm.cpp或是CDailog.cpp里改动:
先响应OnDestroy(),在里加入:
OleUninitialize();

后在CMainFrm.cpp或是CDailog.cpp的开头加入:
#ifdef _WIN32
#define LOADLIBRARY_FAILED(x) (x == 0)
#else
#define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
#endif
//定义函数地址
STDAPI DllRegisterServer(void) ;
typedef HRESULT (STDAPICALLTYPE *CTLREGPROC)();

再给CMainFrm.cpp或是CDailog.cpp加一个成员函数:
//检查控件是否支持注册
BOOL CRegisterOcxDlg::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 ;
}

之后再在CMainFrame或CDialog的初始化函数里加入:

//检查是否支持注册
BOOL bResult = FALSE ;
if (SupportsSelfRegister("C:\\pp.ocx")) //假设控件的路径名是"C:\\pp.ocx",当然也可以用相对路径
{
HMODULE hModule = ::LoadLibrary("C:\\pp.ocx") ;
if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
//获得注册函数地址
CTLREGPROC DLLRegisterServer =
(CTLREGPROC)::GetProcAddress(hModule,"DllRegisterServer" ) ;
if (DLLRegisterServer != NULL)
{
HRESULT regResult = DLLRegisterServer() ;
bResult = (regResult == NOERROR) ;
}
::FreeLibrary(hModule) ;
}
ymxl76 2003-09-11
  • 打赏
  • 举报
回复
没劲!!!!!!!
买单!
ymxl76 2003-09-11
  • 打赏
  • 举报
回复
请教各位高手。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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