IOleObject

标准接口:IOleObject

在OLE包容器程序中,以站点对象负责管理链接或嵌入到文档中的服务器对象。这就需要在包容器的站点对象和服务器对象中分别实现相应的必要接口,以完成相互的通信。对于任何一个站点对象,其必须提供的接口是IOleClientSite,服务器对象必须实现的接口为IOleObject。

成员函数:
SetClientSite(IOleClientSite *pClientSite);    //设置OLE包容器的站点对象
GetClientSite(IOleClientSite **ppClientSite);  //获取OLE包容器的站点对象
SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj);  //允许嵌入对象能够在其窗口标题上显示包容器程序名
Close(DWORD dwSaveOption);  //终止嵌入对象的激活状态
SetMoniker(DWORD dwWhichMoniker, IMoniker *pmk);
GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk);
InitFromData(IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved);
GetClipboardData(DWORD dwReserved, IDataObject **ppDataObject);
DoVerb(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect);//激活嵌入对象,并可通过使用不同的动词让嵌入对象执行相应的动作
EnumVerbs(IEnumOLEVERB **ppEnumOleVerb);  //装入上下文菜单
Update();
IsUpToDate();
GetUserClassID(CLSID *pClsid);
GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType);
SetExtent(DWORD dwDrawAspect, SIZEL *psizel);  //设置控件可使用的空间(控件在屏幕上使用的区域范围)
GetExtent(DWORD dwDrawAspect, SIZEL *psizel);  //获取控件可使用的空间
Advise(IAdviseSink *pAdvSink, DWORD *pdwConnection);
Unadvise(DWORD dwConnection);
EnumAdvise(IEnumSTATDATA **ppenumAdvise);
GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus);  //返回OLEMISC状态位
SetColorScheme(LOGPALETTE *pLogpal);

IOleObject接口通常与IDataObject 和IPersistStorage等接口共同使用,虽然该接口提供了21种方法,但只有DoVerb()、SetHostNames()和Close()这三个方法是必须被实现的。调用IOleObject接口提供的方法将能够使包容器程序与嵌入对象进行通信。任何包容器程序都必须调用DoVerb()方法以激活嵌入对象,并可通过使用不同的动词让嵌入对象执行相应的动作。SetHostNames()方法则允许嵌入对象能够在其窗口标题上显示包容器程序名。包容器程序调用Close()方法,可以终止嵌入对象的激活状态

转自:http://shingpha.blog.sohu.com/109400120.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,可以使用 COM 技术来操作 OLE 对象并进行提取。 以下是提取 OLE 嵌入文件的基本步骤: 1. 使用 COM 技术创建一个 OLE 对象。 2. 获取 OLE 对象所包含的数据流,并将其保存到一个文件中。 3. 释放 OLE 对象。 下面是示例代码: ```c #include <windows.h> #include <ole2.h> int main() { // 初始化 COM 环境 CoInitialize(NULL); // 创建 OLE 对象 IOleObject* pOleObject = NULL; HRESULT hr = CoCreateInstance(CLSID_XXX, NULL, CLSCTX_LOCAL_SERVER, IID_IOleObject, (void**)&pOleObject); if (FAILED(hr)) { printf("Failed to create OLE object, error code: 0x%x\n", hr); CoUninitialize(); return -1; } // 获取 OLE 对象数据流 IStream* pStream = NULL; hr = pOleObject->GetClientSite()->GetContainer()->QueryInterface(IID_IStream, (void**)&pStream); if (FAILED(hr)) { printf("Failed to get OLE object data stream, error code: 0x%x\n", hr); pOleObject->Release(); CoUninitialize(); return -1; } // 保存数据流到文件 const WCHAR* filePath = L"ole_file"; HANDLE hFile = CreateFile(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("Failed to create file, error code: 0x%x\n", GetLastError()); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } STATSTG statstg; hr = pStream->Stat(&statstg, STATFLAG_DEFAULT); if (FAILED(hr)) { printf("Failed to get stream size, error code: 0x%x\n", hr); CloseHandle(hFile); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } ULONG written = 0; hr = pStream->CopyTo(hFile, statstg.cbSize, &written, NULL); if (FAILED(hr)) { printf("Failed to save stream to file, error code: 0x%x\n", hr); CloseHandle(hFile); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } CloseHandle(hFile); // 释放资源 pStream->Release(); pOleObject->Release(); CoUninitialize(); return 0; } ``` 需要注意的是,代码中的 CLSID_XXX、IID_IOleObject 等常量需要根据具体的 OLE 对象进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值