我们的应用程序的代码库是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
定义的方式。 LPUNKNOWN
在AFXWIN.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系统中,它被设置为-2147418113
。 CheckGeneral(sc)
功能会比较sc
和S_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
似乎没有完全定义。