网页加入新做的ActiveX控件后,预览该网页,会弹出提示框 所属类别: C/C++-ActiveX技术编号:QA003913 建立日期: 2001年2月22日 最后修改日期:2001年6月26日 Xuys: 用VC新建一个项目,选择MFC ActiveX Control Wizard其他为默认选项,编译之后,用Frontpage新建一个网页,加入新做的ActiveX控件后,预览该网页,会弹出提示框,但你加入微软的ActiveX控件,却不会弹出对话框;我推断可能是在编写ActiveX控件时有设置的代码,具体设置什么代码,请指教。 回答: (主持人注:VB的用户可以参考微 软 的 Knowledge Base的 文 章:“Q182598 OWTO: 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
// 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';
/***************************************** 修改如下函数 *****************************************/ 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");
dalinda的意见: 我有几点补充: 1.在XXXXctl.cpp中加入//////// //Copied form the ActiveX SDK......... 时,不要忘了在头文件里加入函数声名。注意:要加在类的声明前 2.在UpdateRegistry(BOOL bRegister)中 第31行的IDS_DIEROLL 应为IDS_XXXXXXX 第32行的IDB_DIEROLL 应为IDS_XXXXXXX 第34行的_dwDierollOleMisc 应为_dwXXXXOleMisc 其中的XXXX为你的文件名。 此问题由Xuys回答。
UpdateRegistry(BOOL bRegister) { if (bRegister) { BOOL retval = AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_MADMETHODCALL, IDB_MADMETHODCALL, afxRegApartmentThreading, _dwMadMethodCallOleMisc, _tlid, _wVerMajor, _wVerMinor); // as safe for scripting--failure OK HRESULT hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls that are safely scriptable"); if (SUCCEEDED(hr)) // only register if category exists RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting); // don't care if this call fails // as safe for data initialization hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data"); if (SUCCEEDED(hr)) // only register if category exists RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing); // don't care if this call fails return retval; } else { return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } } HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) { ICatRegister* pcr = NULL ; // interface pointer 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();
所属类别: C/C++-ActiveX技术编号:QA003913
建立日期: 2001年2月22日 最后修改日期:2001年6月26日 Xuys:
用VC新建一个项目,选择MFC ActiveX Control Wizard其他为默认选项,编译之后,用Frontpage新建一个网页,加入新做的ActiveX控件后,预览该网页,会弹出提示框,但你加入微软的ActiveX控件,却不会弹出对话框;我推断可能是在编写ActiveX控件时有设置的代码,具体设置什么代码,请指教。 回答: (主持人注:VB的用户可以参考微 软 的 Knowledge Base的 文 章:“Q182598 OWTO: 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.在XXXXctl.cpp中加入////////
//Copied form the ActiveX SDK.........
时,不要忘了在头文件里加入函数声名。注意:要加在类的声明前
2.在UpdateRegistry(BOOL bRegister)中
第31行的IDS_DIEROLL
应为IDS_XXXXXXX
第32行的IDB_DIEROLL
应为IDS_XXXXXXX
第34行的_dwDierollOleMisc
应为_dwXXXXOleMisc
其中的XXXX为你的文件名。 此问题由Xuys回答。
{ if (bRegister)
{
BOOL retval = AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_MADMETHODCALL,
IDB_MADMETHODCALL,
afxRegApartmentThreading,
_dwMadMethodCallOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
// as safe for scripting--failure OK
HRESULT hr = CreateComponentCategory(CATID_SafeForScripting,
L"Controls that are safely scriptable"); if (SUCCEEDED(hr))
// only register if category exists
RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting);
// don't care if this call fails // as safe for data initialization
hr = CreateComponentCategory(CATID_SafeForInitializing,
L"Controls safely initializable from persistent data"); if (SUCCEEDED(hr))
// only register if category exists
RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing);
// don't care if this call fails return retval;
}
else
{
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
}
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{ ICatRegister* pcr = NULL ; // interface pointer
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;
}http://www.csdn.net/expert/topic/885/885674.xml?temp=.4752161