为什么我在Windows 7和Windows XP中为LPUNKNOWN对象获取不同的结构

时间:2015-12-03 21:46:46

标签: c++ windows mfc

我们的应用程序的代码库是Visual C ++ 98.对于Windows 7用户,该应用程序从OLE模块抛出一个错误,它不会从Windows XP中抛出。

我有两个用于跟踪代码的开发系统。一个是Windows 7 Professional 64位,另一个是Windows XP Professional 32位。每个都有自己的VS 6安装和完整代码库的单独(相同)副本。问题区域似乎位于

中的OLECLI1.CPP模块(Microsoft MFC代码)中
void COleClientItem::ReadItemCompound(CArchive& ar)

文件中的相同位置有断点:

else
{
    // get item name
    TCHAR szItemName[OLE_MAXITEMNAME];
    GetItemName(szItemName);

    // open storage for this item
    LPSTORAGE lpStorage;
    SCODE sc = pDoc->m_lpRootStg->OpenStorage(T2COLE(szItemName), NULL,
        STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_EXCLUSIVE,
        0, 0, &lpStorage);
    if (sc != S_OK)
    {
        TRACE1("Warning: unable to open child storage %s.\n", szItemName);
        // upon failure throw file exception (item will be cleaned up)
        AfxThrowOleException(sc);
    }
    ASSERT(lpStorage != NULL);

    // remember the storage
    m_lpStorage = lpStorage;
    ASSERT(m_lpStorage != NULL);
    // attempt to load the object from the storage
    LPUNKNOWN lpUnk = NULL;

>>>> BREAKPOINT <<<<

    sc = ::OleLoad(m_lpStorage, IID_IUnknown, GetClientSite(),
        (LPLP)&lpUnk);
    CheckGeneral(sc);
    // get IOleObject interface for the newly loaded object
    ASSERT(lpUnk != NULL);
    m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
    lpUnk->Release();
    if (m_lpObject == NULL)
        AfxThrowOleException(E_OUTOFMEMORY);
}

问题似乎在于两个系统处理lpUnk定义的方式。 LPUNKNOWNAFXWIN.H中定义,并且在两个系统上是相同的,尽管在Win7-64系统上它是&#34;程序文件(x86)。&#34;

Windows XP监视框:

lpUnk   0x00000000
    lpVtbl  CXX0017: Error: symbol "" not found

Windows 7监视框:

lpUnk   0x00000000
    __vfptr CXX0030: Error: expression cannot be evaluated

在XP系统中,sc在通话后获得值0。在Win7系统中,它被设置为-2147418113CheckGeneral(sc)功能会比较scS_OK,如果它们不同则会引发错误。由于Windows 7中的两个值不同,因此确实如此。我有什么不同的事情要做吗?我错过了Windows 7系统上的设置吗?

更新:今天早上,我更仔细地查看了从GetClientSite()例程返回的内容。 MFC中的代码非常简单:

LPOLECLIENTSITE COleClientItem::GetClientSite()
{
    ASSERT_VALID(this);

    LPOLECLIENTSITE lpClientSite = 
        (LPOLECLIENTSITE)GetInterface(&IID_IOleClientSite);
    ASSERT(lpClientSite != NULL);
    return lpClientSite;
}

我也看到LPOLECLIENTSITE的定义提供了两个接口,而我得到的接口是&#34; C风格接口。&#34;

typedef struct IOleClientSiteVtbl
{
    BEGIN_INTERFACE

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
        IOleClientSite __RPC_FAR * This,
        /* [in] */ REFIID riid,
        /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);

    ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
        IOleClientSite __RPC_FAR * This);

    ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
        IOleClientSite __RPC_FAR * This);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SaveObject )( 
        IOleClientSite __RPC_FAR * This);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetMoniker )( 
        IOleClientSite __RPC_FAR * This,
        /* [in] */ DWORD dwAssign,
        /* [in] */ DWORD dwWhichMoniker,
        /* [out] */ IMoniker __RPC_FAR *__RPC_FAR *ppmk);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetContainer )( 
        IOleClientSite __RPC_FAR * This,
        /* [out] */ IOleContainer __RPC_FAR *__RPC_FAR *ppContainer);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ShowObject )( 
        IOleClientSite __RPC_FAR * This);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnShowWindow )( 
        IOleClientSite __RPC_FAR * This,
        /* [in] */ BOOL fShow);

    HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestNewObjectLayout )( 
        IOleClientSite __RPC_FAR * This);

    END_INTERFACE
} IOleClientSiteVtbl;

我还注意到,在Windows 7系统上,lpClientSite似乎没有完全定义。

lpClientSite contents

但XP系统上的对象具有一切: enter image description here

0 个答案:

没有答案