本人在学activex,我想在一个窗口显示word文档,编写了一个程序,但运行不正常

wushaowu 2009-05-19 10:37:34
我的程序如下,但窗口内没显示word文档(我想在窗口内显示word文档)。请问该改哪里?

//displaywordinwindow.cpp
#define UNICODE
#include <windows.h>
#include "interfacehead.h"

HWND hwndContain;//容器窗口句柄
WCHAR szFileName[MAX_PATH];//文件名称,c:\path\A.doc
IStorage * lpIStorage=NULL;
HRESULT hr;
CLSID clsid;
IOleObject* pIOleObject= NULL;
IOleInPlaceActiveObject * pIOleInPlaceActiveObject=NULL;
IPersistStorage* pIPersistStorage=NULL;
RECT rcView;

CMyCom * MyCom;
IOleClientSite * pIOleClientSite;
HWND DocWin;



//回调函数的申明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//入口主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
MyCom=new CMyCom;
WCHAR szAppName[]=L"显示Word内容";
WCHAR szClassName[]=L"DisplayWordClass";
WNDCLASSEX wndclassex;
MSG msg;
//取得当前路径
WCHAR path[]=L"\\a.doc";
GetCurrentDirectory(MAX_PATH,szFileName);
wcscat(szFileName,path);
//开始给窗口类赋值
wndclassex.cbSize=sizeof(WNDCLASSEX);
wndclassex.style=CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wndclassex.lpfnWndProc=WndProc;
wndclassex.cbClsExtra=0;
wndclassex.cbWndExtra=0;
wndclassex.hInstance=hInstance;
wndclassex.hIcon=NULL;
wndclassex.hCursor=LoadCursor (NULL, IDC_ARROW) ;
wndclassex.hbrBackground=(HBRUSH)COLOR_APPWORKSPACE;
wndclassex.lpszMenuName=NULL;
wndclassex.hIconSm=NULL;
wndclassex.lpszClassName=szClassName;
//注册窗口
if (!RegisterClassEx (&wndclassex))
{
MessageBox (NULL, L"程序要求windows 2000或xp兼容的版本!",szAppName, MB_ICONERROR) ;
return 0 ;
}
//建立窗口
hwndContain=CreateWindowEx(0,
szClassName,szAppName,
WS_SYSMENU|WS_OVERLAPPED | WS_VISIBLE,
0,
0,
800,
600,
NULL,
NULL,
hInstance,
NULL);

ShowWindow (hwndContain, iCmdShow);
UpdateWindow (hwndContain) ;
//循环程序
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

//主窗口的回调函数
LRESULT CALLBACK WndProc (HWND hwndmain, UINT message, WPARAM wParam, LPARAM lParam){

switch (message){
case WM_CREATE:
CoInitialize(NULL);
hr=StgIsStorageFile(szFileName);
if(FAILED(hr)){
MessageBox(hwndmain,L"不是复合文件",L"ok",0);
CoUninitialize();
return 0;
}
hr=StgOpenStorage(szFileName,NULL,STGM_READ|STGM_SHARE_DENY_WRITE,NULL,0,&lpIStorage);
if(FAILED(hr)){
MessageBox(hwndmain,L"建立存储对象失败",L"ok",0);
CoUninitialize();
return 0;
}
hr=ReadClassStg(lpIStorage, &clsid);
if(FAILED(hr)||(clsid == GUID_NULL))
{
MessageBox(hwndmain,L"clsid为空",L"ok",0);
lpIStorage->Release();
CoUninitialize();
return 0;
}
hr=CoCreateInstance(clsid, NULL, CLSCTX_INPROC, IID_IOleObject, (void**)&pIOleObject);
if(FAILED(hr))
{
MessageBox(hwndmain,L"建立实例失败",L"ok",0);
lpIStorage->Release();
CoUninitialize();
return 0;
}
hr = pIOleObject->QueryInterface(IID_IPersistStorage, (void**)&pIPersistStorage);
if(FAILED(hr))
{
MessageBox(hwndmain,L"取得IPersistStorage接口失败",L"ok",0);
lpIStorage->Release();
CoUninitialize();
return 0;
}
hr=pIPersistStorage->Load(lpIStorage);
pIPersistStorage->Release();
return 0;
case WM_SHOWWINDOW:
GetClientRect(hwndmain, &rcView);
hr=MyCom->QueryInterface(IID_IOleClientSite,(void**)&pIOleClientSite);
pIOleObject->SetClientSite(pIOleClientSite);
hr = pIOleObject->DoVerb(OLEIVERB_SHOW, NULL, pIOleClientSite, 0, hwndmain, &rcView);


if(FAILED(hr))
{
MessageBox(hwndmain,L"DoVerb失败",L"ok",0);//每次执行都会有该提示
return 0;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0 ;
}
return DefWindowProc (hwndmain, message, wParam, lParam);
}




...全文
203 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-05-19
  • 打赏
  • 举报
回复
到codeproject.com搜索吧,有现成的源码
wushaowu 2009-05-19
  • 打赏
  • 举报
回复
//InterFace.cpp
#include "InterFaceHead.h"
extern HWND hwndContain;//容器窗口句柄

CMyCom::CMyCom(){
m_cRef=1;
}

CMyCom::~CMyCom(){
}

STDMETHODIMP CMyCom::QueryInterface(REFIID riid, void** ppv){
if(NULL==ppv){
return E_POINTER;
}
HRESULT hr = S_OK;
if (IID_IUnknown == riid){
*ppv = (IUnknown*)this;
}else if(IID_IOleClientSite == riid){
*ppv = (IOleClientSite*)&m_xOleClientSite;
}else if(IID_IOleInPlaceSite == riid){
*ppv = (IOleInPlaceSite*)&m_xOleInPlaceSite;
}else{
*ppv = NULL;
hr = E_NOINTERFACE;
}
if (NULL != *ppv){
((IUnknown*)(*ppv))->AddRef();
}
return hr;
}

STDMETHODIMP_(ULONG) CMyCom::AddRef(void){
return ++m_cRef;
}

STDMETHODIMP_(ULONG) CMyCom::Release(void){
m_cRef--;
if (m_cRef==0){
delete this;
}
return m_cRef;
}

IMPLEMENT_INTERFACE_UNKNOWN(CMyCom, OleClientSite)

STDMETHODIMP CMyCom::XOleClientSite::SaveObject(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleClientSite::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk)
{
if (ppmk) *ppmk = NULL;
return E_NOTIMPL;
}

STDMETHODIMP CMyCom::XOleClientSite::GetContainer(IOleContainer** ppContainer)
{
if (ppContainer) *ppContainer = NULL;
return E_NOINTERFACE;
}

STDMETHODIMP CMyCom::XOleClientSite::ShowObject(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleClientSite::OnShowWindow(BOOL fShow)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleClientSite::RequestNewObjectLayout(void)
{
return E_NOTIMPL;
}

IMPLEMENT_INTERFACE_UNKNOWN(CMyCom, OleInPlaceSite)

STDMETHODIMP CMyCom::XOleInPlaceSite::GetWindow(HWND* phwnd)
{
if (phwnd) *phwnd = hwndContain;
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::ContextSensitiveHelp(BOOL fEnterMode)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::CanInPlaceActivate(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::OnInPlaceActivate(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::OnUIActivate(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::GetWindowContext(IOleInPlaceFrame** ppFrame,
IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::Scroll(SIZE sz)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::OnUIDeactivate(BOOL fUndoable)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::OnInPlaceDeactivate(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::DiscardUndoState(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::DeactivateAndUndo(void)
{
return S_OK;
}

STDMETHODIMP CMyCom::XOleInPlaceSite::OnPosRectChange(LPCRECT lprcPosRect)
{
return S_OK;
}



//InterFaceHead.h
#include "OLEHead.h"
//#include <ole2.h>
//#include <olectl.h>



//定义主类
class CMyCom : public IUnknown
{
public:
CMyCom();
~CMyCom();

// IUnknown Implementation
STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);

// IOleClientSite Implementation
BEGIN_INTERFACE_PART(OleClientSite, IOleClientSite)
STDMETHODIMP SaveObject(void);
STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
STDMETHODIMP GetContainer(IOleContainer** ppContainer);
STDMETHODIMP ShowObject(void);
STDMETHODIMP OnShowWindow(BOOL fShow);
STDMETHODIMP RequestNewObjectLayout(void);
END_INTERFACE_PART(OleClientSite)

// IOleInPlaceSite Implementation
BEGIN_INTERFACE_PART(OleInPlaceSite, IOleInPlaceSite)
STDMETHODIMP GetWindow(HWND* phwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
STDMETHODIMP CanInPlaceActivate(void);
STDMETHODIMP OnInPlaceActivate(void);
STDMETHODIMP OnUIActivate(void);
STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO

lpFrameInfo);
STDMETHODIMP Scroll(SIZE sz);
STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
STDMETHODIMP OnInPlaceDeactivate(void);
STDMETHODIMP DiscardUndoState(void);
STDMETHODIMP DeactivateAndUndo(void);
STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
END_INTERFACE_PART(OleInPlaceSite)


private:
//计数参考变量
ULONG m_cRef;
};


//OLEFead.h
#if !defined(WUSHAOWU_HEAD_INCLUDED)
#define WUSHAOWU_HEAD_INCLUDED
#define UNICODE
#include <windows.h>
////////////////////////////////////////////////////////
//定义接口用到的宏
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
class X##localClass : public baseClass \
{ public: X##localClass(){}; \
~X##localClass(){}; \
STDMETHOD(QueryInterface)(REFIID iid, PVOID* ppvObj); \
STDMETHOD_(ULONG, AddRef)(); \
STDMETHOD_(ULONG, Release)();

#define END_INTERFACE_PART(localClass) \
} m_x##localClass; \
friend class X##localClass;

#define METHOD_PROLOGUE(theClass, localClass) \
theClass* pThis = \
((theClass*)(((BYTE*)this) - (size_t)&(((theClass*)0)->m_x##localClass)));

#define IMPLEMENT_INTERFACE_UNKNOWN(theClass, localClass) \
ULONG theClass::X##localClass::AddRef() { \
METHOD_PROLOGUE(theClass, localClass) \
return pThis->AddRef(); \
} \
ULONG theClass::X##localClass::Release() { \
METHOD_PROLOGUE(theClass, localClass) \
return pThis->Release(); \
} \
STDMETHODIMP theClass::X##localClass::QueryInterface(REFIID iid, void **ppvObj) { \
METHOD_PROLOGUE(theClass, localClass) \
return pThis->QueryInterface(iid, ppvObj); \
}

#endif
/////////////////////////////////////////////

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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