没有注册类的怪事

baobaodediaozhui 2012-06-24 10:06:20
用了腾讯的一个DLL(ImageOle.dll)实现RichEdit插入图片(.bmp,.gif等格式)的功能,前一段时间,能正常工作.但最近我发现却不能显示图片了,弹出“没有注册类”的MessageBox.
void CExtRichEdit::InsertFace(CString strPicPath)
{
LPLOCKBYTES lpLockBytes = NULL;
SCODE sc;
HRESULT hr;
//print to RichEdit' s IClientSite
LPOLECLIENTSITE m_lpClientSite;
//A smart point to IAnimator
IGifAnimatorPtr m_lpAnimator;
//ptr 2 storage
LPSTORAGE m_lpStorage;
//the object 2 b insert 2
LPOLEOBJECT m_lpObject;

//Create lockbytes
sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (sc != S_OK)
AfxThrowOleException(sc);
ASSERT(lpLockBytes != NULL);

//use lockbytes to create storage
sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
if (sc != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(sc);
}
ASSERT(m_lpStorage != NULL);

//get the ClientSite of the very RichEditCtrl
GetIRichEditOle()->GetClientSite(&m_lpClientSite);
ASSERT(m_lpClientSite != NULL);

try
{
//Initlize COM interface
hr = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if( FAILED(hr) )
_com_issue_error(hr);

//Get GifAnimator object
//here, I used a smart point, so I do not need to free it
hr = m_lpAnimator.CreateInstance(CLSID_GifAnimator);//!!!!!!!!!!!!!!!
if( FAILED(hr) )
_com_issue_error(hr);
//还有其他的代码,省略......................
}
断点跟踪到我打的感叹号那里后就抛出异常了!!!!!!!!!
catch( _com_error e )//抛出没有注册类
{
AfxMessageBox(e.ErrorMessage());
::CoUninitialize();
}
目前我不知道到底是哪一个类没有被注册......
求各位高手帮忙看看,困惑了我很多时日了.....
解决问题后,拜谢,分立马送上....
...全文
492 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobaodediaozhui 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

regsvr32 D:\Program files\tencent\QQ\ImageOle.dll

这不是编写源代码,所以不需要转义字符。
[/Quote]
嗯,这样注册成功了。
D:\> regsvr32 ImageOle.dll"
谢谢你哈。
Tishion 2012-06-24
  • 打赏
  • 举报
回复
regsvr32 D:\Program files\tencent\QQ\ImageOle.dll

这不是编写源代码,所以不需要转义字符。
baobaodediaozhui 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这个是QQGame的一个组件。


你可能把QQGame卸载了,所以导致这个组件从系统的COM库中的注册信息删除了。

使用regsvr32.exe可以重新注册

regsvr32 dll的全路径
[/Quote]
我的DLL路径是在D:\\Program files\\tencent\\QQ\\ImageOle.dll
于是我这样注册的
C:\Users\Administrator> regsvr32 D:\\Program files\\tencent\\QQ\\ImageOle.dll"
但是。。。。。。
模块D:\\Program 记载失败....
找不到指定的模块.....
求解....
Tishion 2012-06-24
  • 打赏
  • 举报
回复
这个是QQGame的一个组件。


你可能把QQGame卸载了,所以导致这个组件从系统的COM库中的注册信息删除了。

使用regsvr32.exe可以重新注册

regsvr32 dll的全路径
baobaodediaozhui 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

是不是控件被更新了。
[/Quote]
没有啊,程序是我2月份写的,实现后就一直搁着了。现在拿出来用就不行了。
我在codeproject里看到一个例子。http://www.codeproject.com/Articles/10069/Animated-Emoticons-like-those-in-MSN-Messenger
里面有一句话。
First, open your OLE/COM Viewer in Microsoft Visual Studio 6.0 Tools. Use View TypeLib... to open ImageOle.dll (you' d better register it with regsvr32.exe), then you can get the text below:

Collapse | Copy Code
[
uuid(0C1CF2DF-05A3-4FEF-8CD4-F5CFC4355A16),
helpstring("IGifAnimator Interface"),
dual,
nonextensible
]
dispinterface IGifAnimator {
properties:
methods:
[id(0x00000001), helpstring("method LoadFromFile")]
void LoadFromFile([in] BSTR FileName);
[id(0x00000002), helpstring("method TriggerFrameChange")]
VARIANT_BOOL TriggerFrameChange();
[id(0x00000003), helpstring("method GetFilePath")]
BSTR GetFilePath();
[id(0x00000004), helpstring("method ShowText")]
void ShowText([in] BSTR Text);
};
它说你得先注册,(you' d better register it with regsvr32.exe)
但是我不知道注册什么啊???regsvr32.exe 后面跟什么?
oyljerry 2012-06-24
  • 打赏
  • 举报
回复
是不是控件被更新了。

3,245

社区成员

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

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