!!关于动态ocx注册的问题!!

mfctony 2003-09-13 10:27:34
我有一个ocx控件,注册时总是要手动注册,总不能让用户也去手动注册吧,有没有什么方法用程序的方式注册?谢谢!
...全文
70 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chao1977 2003-09-21
  • 打赏
  • 举报
回复
mark
mfctony 2003-09-13
  • 打赏
  • 举报
回复
谢谢gzshd(郁闷)兄,成功搞定,不过在你的程序上也加了一点修改,嘿嘿
同时也谢谢ylc001(白面包青天)兄
gzshd 2003-09-13
  • 打赏
  • 举报
回复
可以在程序里注册,就是下面的方法,如果你要原码的话,就留个邮箱吧:

你可以让你程序来注册,如下:
首先在初始化时加入:
OleInitialize(NULL);
而在OnDestroy()里加入:
OleUninitalize();
在注册的文件前加:
#ifdef _WIN32
#define LOADLIBRARY_FAILED(x) (x == 0)
#else
#define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
#endif


//检查控件是否支持注册
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 ;
}

//注册控件
BOOL CRegisterOcxDlg::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 CRegisterOcxDlg::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 ;

}
ylc001 2003-09-13
  • 打赏
  • 举报
回复
安装程序里打包注册啊。
或者你程序启动时判断组件是否注册,调用DLL中注册函数注册也可以啊。

3,245

社区成员

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

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