>>谁遇到过:用 ATL 生成的 ActiveX 控件不能在 VB 中使用!

Edward 2001-02-23 08:42:00
在 VB 中,运行时出现错误:0x80004005 - Unspecified error。然后连设计时的 Form 都无法显示了。神啊,救救我吧!
...全文
213 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
skt642 2001-05-31
  • 打赏
  • 举报
回复
24431关注!
vcmfc 2001-05-31
  • 打赏
  • 举报
回复
又学到了东东了。


谢谢老师。
Edward 2001-04-16
  • 打赏
  • 举报
回复
Please refer to
http://263.csdn.net/edyang/
IPAddress ActiveX Control
Edward 2001-03-11
  • 打赏
  • 举报
回复
终于找到了:

BUG: "Unspecified error" When Running VB Program That Hosts an ATL Control

--------------------------------------------------------------------------------
The information in this article applies to:

The Microsoft Active Template Library (ATL) 3.0, included with:
Microsoft Visual C++, 32-bit Editions, version 6.0
Microsoft Visual Basic Professional and Enterprise Editions for Windows, version 6.0

--------------------------------------------------------------------------------


SYMPTOMS
When you run a Visual Basic program that contains an ATL ActiveX control, you may get the following error message:


System Error &H80004005 (-2147467259). Unspecified error.



CAUSE
If you created the control using the ATL Object Wizard and added the "HWND" option in the Stock Properties tab, you will get an entry in the .IDL for a [propget] function for the "Window" stock property.

In addition, the property map will contain a PROP_ENTRY(HWND...) macro. When the control is first initialized, the persistence code will go through the property map and call the [propput] functions for each entry via ITypeInfo::Invoke(). Because there is no [propput] function in the .IDL for the Window property, the type library won't have this function, and ITypeInfo::Invoke() will fail.



RESOLUTION
Persisting an HWND doesn't make sense; just comment out the PROP_ENTRY(HWND...) macro in the property map. To prevent this line from being added in the future, remove the following line from Control.h in \Program Files\Microsoft Visual Studio\Common\MSDev98\Template\ATL:



[!if=(SP_HWND, "TRUE")] PROP_ENTRY("HWND", DISPID_HWND, CLSID_NULL)[!endif]



STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

Additional query words:

Keywords : kbActiveX kbCOMt kbContainer kbCtrl kbCtrlCreate kbPersistSt kbVBp600 kbATL300bug kbGrpMFCATL
Version : WINDOWS:3.0,6.0
Platform : WINDOWS
Issue type : kbbug
Technology : kbvc


Last Reviewed: February 4, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.


saliven 2001-03-09
  • 打赏
  • 举报
回复
你的UUID搞对了没有,这是重要的一点。在你的控件编译完后,会生成一个以你的控件为名的后缀为htm的文件,在那里去找UUID吧,不会有错的。
另外,在VB中使用要建立FULL CONTROL控件。
在Web页面中使用还要再加入一个安全接口,但可以不使用FULL CONTROL,不过用了也没多少坏处,代码稍长一点而已。
Edward 2001-03-05
  • 打赏
  • 举报
回复
我又重新生成了一个新的工程,加入了一个 Full Control,代码丝毫不动。

// IPAddressCtl.h : Declaration of the CIPAddressCtl

#ifndef __IPADDRESSCTL_H_
#define __IPADDRESSCTL_H_

#include "resource.h" // main symbols
#include <atlctl.h>

/////////////////////////////////////////////////////////////////////////////
// CIPAddressCtl
class ATL_NO_VTABLE CIPAddressCtl :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CIPAddressCtl, IIPAddressCtl, &IID_IIPAddressCtl, &LIBID_IPADDRESSLib>,
public CComControl<CIPAddressCtl>,
public IPersistStreamInitImpl<CIPAddressCtl>,
public IOleControlImpl<CIPAddressCtl>,
public IOleObjectImpl<CIPAddressCtl>,
public IOleInPlaceActiveObjectImpl<CIPAddressCtl>,
public IViewObjectExImpl<CIPAddressCtl>,
public IOleInPlaceObjectWindowlessImpl<CIPAddressCtl>,
public IConnectionPointContainerImpl<CIPAddressCtl>,
public IPersistStorageImpl<CIPAddressCtl>,
public ISpecifyPropertyPagesImpl<CIPAddressCtl>,
public IQuickActivateImpl<CIPAddressCtl>,
public IDataObjectImpl<CIPAddressCtl>,
public IProvideClassInfo2Impl<&CLSID_IPAddressCtl, &DIID__IIPAddressCtlEvents, &LIBID_IPADDRESSLib>,
public IPropertyNotifySinkCP<CIPAddressCtl>,
public CComCoClass<CIPAddressCtl, &CLSID_IPAddressCtl>
{
public:
CContainedWindow m_ctlSysIPAddress32;


CIPAddressCtl() :
m_ctlSysIPAddress32(_T("SysIPAddress32"), this, 1)
{
m_bWindowOnly = TRUE;
}

DECLARE_REGISTRY_RESOURCEID(IDR_IPADDRESSCTL)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CIPAddressCtl)
COM_INTERFACE_ENTRY(IIPAddressCtl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()

BEGIN_PROP_MAP(CIPAddressCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("Appearance", DISPID_APPEARANCE, CLSID_NULL)
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)
PROP_ENTRY("Font", DISPID_FONT, CLSID_StockFontPage)
PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
PROP_ENTRY("HWND", DISPID_HWND, CLSID_NULL)
PROP_ENTRY("TabStop", DISPID_TABSTOP, CLSID_NULL)
PROP_ENTRY("Text", DISPID_TEXT, CLSID_NULL)
PROP_ENTRY("Valid", DISPID_VALID, CLSID_NULL)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_CONNECTION_POINT_MAP(CIPAddressCtl)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
END_CONNECTION_POINT_MAP()

BEGIN_MSG_MAP(CIPAddressCtl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
CHAIN_MSG_MAP(CComControl<CIPAddressCtl>)
ALT_MSG_MAP(1)
// Replace this with message map entries for superclassed SysIPAddress32
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);


LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lRes = CComControl<CIPAddressCtl>::OnSetFocus(uMsg, wParam, lParam, bHandled);
if (m_bInPlaceActive)
{
DoVerbUIActivate(&m_rcPos, NULL);
if(!IsChild(::GetFocus()))
m_ctlSysIPAddress32.SetFocus();
}
return lRes;
}

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
RECT rc;
GetWindowRect(&rc);
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.top = rc.left = 0;
m_ctlSysIPAddress32.Create(m_hWnd, rc);
return 0;
}
STDMETHOD(SetObjectRects)(LPCRECT prcPos,LPCRECT prcClip)
{
IOleInPlaceObjectWindowlessImpl<CIPAddressCtl>::SetObjectRects(prcPos, prcClip);
int cx, cy;
cx = prcPos->right - prcPos->left;
cy = prcPos->bottom - prcPos->top;
::SetWindowPos(m_ctlSysIPAddress32.m_hWnd, NULL, 0,
0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
return S_OK;
}

// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IIPAddressCtl
public:
short m_nAppearance;
OLE_COLOR m_clrBackColor;
BOOL m_bEnabled;
CComPtr<IFontDisp> m_pFont;
OLE_COLOR m_clrForeColor;
BOOL m_bTabStop;
CComBSTR m_bstrText;
BOOL m_bValid;
};

#endif //__IPADDRESSCTL_H_
Un1 2001-02-27
  • 打赏
  • 举报
回复
to edyang:

你应该把出问题的事件(时间)、地点(过程)、任务(环境)写上,否则无法回答问题。
Edward 2001-02-27
  • 打赏
  • 举报
回复
可怜可怜我吧!
Edward 2001-02-26
  • 打赏
  • 举报
回复
有没有用 ATL 做过 ActiveX 控件遇到过同样的问题?
Edward 2001-02-25
  • 打赏
  • 举报
回复
// IPAddressCtl.h : Declaration of the CIPAddressCtl

#ifndef __IPADDRESSCTL_H_
#define __IPADDRESSCTL_H_

#include "resource.h" // main symbols
#include <atlctl.h>


/////////////////////////////////////////////////////////////////////////////
// CIPAddressCtl
class ATL_NO_VTABLE CIPAddressCtl :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CIPAddressCtl, IIPAddressCtl, &IID_IIPAddressCtl, &LIBID_IPADDRESSLib>,
public CComControl<CIPAddressCtl>,
public IPersistStreamInitImpl<CIPAddressCtl>,
public IOleControlImpl<CIPAddressCtl>,
public IOleObjectImpl<CIPAddressCtl>,
public IOleInPlaceActiveObjectImpl<CIPAddressCtl>,
public IViewObjectExImpl<CIPAddressCtl>,
public IOleInPlaceObjectWindowlessImpl<CIPAddressCtl>,
public IQuickActivateImpl<CIPAddressCtl>,
public CComCoClass<CIPAddressCtl, &CLSID_IPAddressCtl>
{
public:
CContainedWindow m_ctlSysIPAddress32;

CIPAddressCtl() :
m_ctlSysIPAddress32(_T("SysIPAddress32"), this, 1)
{
static FONTDESC fd = {
sizeof(FONTDESC), OLESTR("Fixedsys"),
FONTSIZE(10), FW_NORMAL, ANSI_CHARSET, FALSE, FALSE, FALSE};

::OleCreateFontIndirect(&fd, IID_IFontDisp, (void **)&m_pFont);
if(!SUCCEEDED(GetAmbientAppearance(m_nAppearance)))
m_nAppearance = 1;
m_bWindowOnly = TRUE;
}

DECLARE_REGISTRY_RESOURCEID(IDR_IPADDRESSCTL)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CIPAddressCtl)
COM_INTERFACE_ENTRY(IIPAddressCtl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
//COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
END_COM_MAP()

BEGIN_PROP_MAP(CIPAddressCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("Appearance", DISPID_APPEARANCE, CLSID_NULL)
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)
PROP_ENTRY("Font", DISPID_FONT, CLSID_StockFontPage)
PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
PROP_ENTRY("HWND", DISPID_HWND, CLSID_NULL)
PROP_ENTRY("TabStop", DISPID_TABSTOP, CLSID_NULL)
PROP_ENTRY("Text", DISPID_TEXT, CLSID_NULL)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
PROP_PAGE(CLSID_StockColorPage)
PROP_PAGE(CLSID_StockFontPage)
END_PROP_MAP()

BEGIN_MSG_MAP(CIPAddressCtl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
CHAIN_MSG_MAP(CComControl<CIPAddressCtl>)
ALT_MSG_MAP(1)
// Replace this with message map entries for superclassed SysIPAddress32
END_MSG_MAP()

// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lRes = CComControl<CIPAddressCtl>::OnSetFocus(uMsg, wParam, lParam, bHandled);
if (m_bInPlaceActive)
{
DoVerbUIActivate(&m_rcPos, NULL);
if(!IsChild(::GetFocus()))
m_ctlSysIPAddress32.SetFocus();
}
return lRes;
}

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
RECT rc;

GetWindowRect(&rc);
rc.bottom = rc.top + 32;
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.top = rc.left = 0;
m_ctlSysIPAddress32.Create(m_hWnd, rc);
return 0;
}
STDMETHOD(SetObjectRects)(LPCRECT prcPos,LPCRECT prcClip)
{
IOleInPlaceObjectWindowlessImpl<CIPAddressCtl>::SetObjectRects(prcPos, prcClip);
int cx, cy;
cx = prcPos->right - prcPos->left;
cy = prcPos->bottom - prcPos->top;
::SetWindowPos(m_ctlSysIPAddress32.m_hWnd, NULL, 0,
0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
return S_OK;
}

// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IIPAddressCtl
public:
short m_nAppearance;
OLE_COLOR m_clrBackColor;
BOOL m_bEnabled;
CComPtr<IFontDisp> m_pFont;
OLE_COLOR m_clrForeColor;
BOOL m_bTabStop;
CComBSTR m_bstrText;
};

#endif //__IPADDRESSCTL_H_
Edward 2001-02-23
  • 打赏
  • 举报
回复
在 VC 对话框里面,如果我要把我的控件加上,就说我的空间缺少一个必要的接口!?谁知道一个 ActiveX 控件至少要实现哪些接口?OC96 规范?
Edward 2001-02-23
  • 打赏
  • 举报
回复
用 Wizard 生成代码后,一点儿都没有变动!怎会如此?
vcmfc 2001-02-23
  • 打赏
  • 举报
回复
前提是你的CODE没有ERROR!
vcmfc 2001-02-23
  • 打赏
  • 举报
回复
老师你好,可能是VB有问题,要么重装OS!,这是学生的xx看法!

3,245

社区成员

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

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