积极答复者
请问 IOleObject.GetClipboardData() 返回 OLE_E_NOTRUNNING 错误的原因和解决方法

问题
-
在读取 richeditview 中的图片时, IOleObject.GetClipboardData() 函数总是返回 OLE_E_NOTRUNNING ,这是为什么呢?有什么解决方法吗?
REOBJECT reobject; reobject.cbStruct = sizeof(REOBJECT); if (E_INVALIDARG == pOle->GetObject(i, &reobject, REO_GETOBJ_ALL_INTERFACES)) { //正常应该返回 S_OK AfxMessageBox(L"获取对象失败!"); return; } // OleRun(reobject.poleobj); //找了2个api,也不知道对不对 // if (!OleIsRunning(reobject.poleobj)) // { // AfxMessageBox(L"对象未运行!"); //程序直接来到这句 // return; // } IDataObject *pDataObject; if (OLE_E_NOTRUNNING == reobject.poleobj->GetClipboardData(0, &pDataObject))//这里总是返回OLE_E_NOTRUNNING { //错误值有OLE_E_NOTRUNNING,E_NOTIMPL两种S_OK ! AfxMessageBox(L"获取数据失败!"); return; }
- 已编辑 happyhhb 2009年8月26日 11:18
答案
全部回复
-
终于找到最初调用 AfxOleInit() 的地方了,在app.cpp的 InitInstance() 里 :
BOOL C×××App::InitInstance()
{
// Initialize OLE libraries
if (!AfxOleInit()) // ----------> 就是这里
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}AfxEnableControlContainer();
.......
}
既然这里已经调用了 AfxOleInit() ,而别处已无法调用(调用就出错),是否表明了 IOleObject.GetClipboardData() 返回 OLE_E_NOTRUNNING 的真正原因并不在于 AfxOleInit() 呢?还会是在什么地方存在问题呢?
谢谢指教 ^_^- 已编辑 happyhhb 2009年8月30日 6:06
-
非常感谢版主,使用了QueryInterface竟然可以顺利地获取了IDataObject,太开心了,但还没有得到我想要的结果
我修改后的代码如下:IRichEditOle* pOle = edit.GetIRichEditOle(); int nCount = pOle->GetObjectCount(); for (int i = 0; i < nCount; i++) { REOBJECT reobject; ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); //不填这个结构,会导致GetObject()失败 if (E_INVALIDARG == pOle->GetObject(i, &reobject, REO_GETOBJ_ALL_INTERFACES)) { //正常应该返回 S_OK AfxMessageBox(_T("获取对象失败!")); return; } IDataObject *pDataObject; if (S_OK != reobject.poleobj->QueryInterface(IID_IDataObject, (void **)&pDataObject)) { AfxMessageBox(_T("获取数据失败!")); return; } FORMATETC fm; STGMEDIUM sm; pDataObject->GetData(&fm, &sm); if (fm.cfFormat == CF_BITMAP) //fm.cfFormat返回的是52428,显然是一个错误的值 { SaveBMPToFile(sm.hBitmap, _T("d:\\55.bmp")); //根据句柄保存为位图,测试过可用 } //但如果去掉if判断,直接调用句柄生成位图,会导致程序退出 }
似乎表明没能得到正确的 IDataObject,这是为什么呢? -
谢谢,代码不够严谨,确实会带来很多错误判断啊
修改后的代码如下,但 GetData() 怎么会出错呢,莫非获取的 pDataObject 有问题?
IDataObject *pDataObject; if (S_OK != reobject.poleobj->QueryInterface(IID_IDataObject, (void **)&pDataObject)) { AfxMessageBox(_T("获取数据失败!")); return; } FORMATETC fm; STGMEDIUM sm; if (S_OK != pDataObject->GetData(&fm, &sm)) //---->果然这里出错了 { AfxMessageBox(_T("获取结构失败!")); //---->运行结果显示这个 return; } if (fm.cfFormat == CF_BITMAP) // return sm.hBitmap; { SaveBMPToFile(sm.hBitmap, _T("d:\\55.bmp")); } else AfxMessageBox(_T("对象并非位图!"));