软件注册站
热情软件屋

 
网页加入新做的ActiveX控件后,预览该网页,会弹出提示框
编号: QA003913    
建立日期: 2001年2月22日 最后修改日期: 2003年7月19日
所属类别: C/C++ - ActiveX技术
   
    用VC新建一个项目,选择MFC ActiveX Control Wizard其他为默认选项,编译之后,用Frontpage新建一个网页,加入新做的ActiveX控件后,预览该网页,会弹出提示框,但你加入微软的ActiveX控件,却不会弹出对话框;我推断可能是在编写ActiveX控件时有设置的代码,具体设置什么代码,请指教。(Xuys)
   
    (主持人注:VB的用户可以参考微软的Knowledge Base的文章:“Q182598 HOWTO: Implement IObjectSafety in Visual Basic Controls”
    解决方法如下:
    添加以下代码
    ////////////////////////////////////////////////////////////////
    
// Copied from the ActiveX SDK
    
// This code is used to register and unregister a
    
// control as safe for initialization and safe for scripting
    
    
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
    
{
    
    
ICatRegister* pcr = NULL ;
    
HRESULT hr = S_OK ;
    
    
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    
if (FAILED(hr))
    
return hr;
    
    
// Make sure the HKCR\Component Categories\{..catid...}
    
// key is registered
    
CATEGORYINFO catinfo;
    
catinfo.catid = catid;
    
catinfo.lcid = 0x0409 ; // english
    
    
// Make sure the provided description is not too long.
    
// Only copy the first 127 characters if it is
    
int len = wcslen(catDescription);
    
if (len>127)
    
len = 127;
    
wcsncpy(catinfo.szDescription, catDescription, len);
    
// Make sure the description is null terminated
    
catinfo.szDescription[len] = '\0';
    
    
hr = pcr->RegisterCategories(1, &catinfo);
    
pcr->Release();
    
    
return hr;
    
}
    
    
    
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    
{
    
// Register your component categories information.
    
ICatRegister* pcr = NULL ;
    
HRESULT hr = S_OK ;
    
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    
if (SUCCEEDED(hr))
    
{
    
// Register this category as being "implemented" by
    
// the class.
    
CATID rgcatid[1] ;
    
rgcatid[0] = catid;
    
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
    
}
    
    
if (pcr != NULL)
    
pcr->Release();
    
    
return hr;
    
}
    
    
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    
{
    
ICatRegister* pcr = NULL ;
    
HRESULT hr = S_OK ;
    
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    
if (SUCCEEDED(hr))
    
{
    
// Unregister this category as being "implemented" by
    
// the class.
    
CATID rgcatid[1] ;
    
rgcatid[0] = catid;
    
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
    
}
    
    
if (pcr != NULL)
    
pcr->Release();
    
    
return hr;
    
}
    
    
    
/*****************************************
    
在 xxxctl.cpp 文件中添加如下两个头文件
    
*****************************************/
    
#include "comcat.h"
    
#include "objsafe.h"
    
    
/*****************************************
    
修改如下函数
    
*****************************************/
    
BOOL CxxxCtrl::CxxxCtrlFactory::UpdateRegistry(BOOL bRegister)
    
{
    
// TODO: Verify that your control follows apartment-model threading rules.
    
// Refer to MFC TechNote 64 for more information.
    
// If your control does not conform to the apartment-model rules, then
    
// you must modify the code below, changing the 6th parameter from
    
// afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
    
    
if (bRegister)
    
{
    
HRESULT hr = S_OK ;
    
    
// register as safe for scripting
    
hr = CreateComponentCategory(CATID_SafeForScripting,
    
L"Controls that are safely scriptable");
    
    
if (FAILED(hr))
    
return FALSE;
    
    
hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting);
    
    
if (FAILED(hr))
    
return FALSE;
    
    
// register as safe for initializing
    
hr = CreateComponentCategory(CATID_SafeForInitializing,
    
L"Controls safely initializable from persistent data");
    
    
if (FAILED(hr))
    
return FALSE;
    
    
hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing);
    
    
if (FAILED(hr))
    
return FALSE;
    
    
return AfxOleRegisterControlClass(
    
AfxGetInstanceHandle(),
    
m_clsid,
    
m_lpszProgID,
    
IDS_DIEROLL,
    
IDB_DIEROLL,
    
afxRegInsertable | afxRegApartmentThreading,
    
_dwDierollOleMisc,
    
_tlid,
    
_wVerMajor,
    
_wVerMinor);
    
}
    
else
    
{
    
HRESULT hr = S_OK ;
    
    
hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting);
    
    
if (FAILED(hr))
    
return FALSE;
    
    
hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing);
    
    
if (FAILED(hr))
    
return FALSE;
    
    
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
    
}
    
}
    

    
    
    dalinda的意见:
    我有几点补充:
    1.在xxxctl.h 文件中添加如下两个头文件
    #include "comcat.h"
    #include "objsafe.h"
    注意:要加在类的声明前
    2.在UpdateRegistry(BOOL bRegister)中
    第31行的IDS_DIEROLL
    应为IDS_XXXXXXX
    第32行的IDB_DIEROLL
    应为IDS_XXXXXXX
    第34行的_dwDierollOleMisc
    应为_dwXXXXOleMisc
    其中的XXXX为你的工程名。

    

此问题由Xuys回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, ActiveX技术, activex, com, ado

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio