为什么我在Windows7和WindowsXP中得到不同的未知对象结构 (它使用一个带有函数指针的显式结构)。但是你在Windows 7上得到C++定义(它使用了一个带有虚拟方法的类)。两者布局兼容,但编程方式不同。不清楚您是在两个系统上运行相同的二进制文件,还是正在重新编译。 LPOLECLIENTSITE COleClientItem::GetClientSite() { ASSERT_VALID(this); LPOLECLIENTSITE lpClientSite = (LPOLECLIENTSITE)GetInterface(&IID_IOleClientSite); ASSERT(lpClientSite != NULL); return lpClientSite; } 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;
我有两个用于跟踪代码的开发系统。一个是64位Windows 7 Professional,另一个是32位Windows XP Professional。每个版本都有自己的VS6安装版本和完整代码库的独立(相同)副本。问题区域似乎位于中的Olceli1.CPP模块(Microsoft MFC代码)中 文件中的相同位置存在断点:为什么我在Windows7和WindowsXP中得到不同的未知对象结构 (它使用一个带有函数指针的显式结构)。但是你在Windows 7上得到C++定义(它使用了一个带有虚拟方法的类)。两者布局兼容,但编程方式不同。不清楚您是在两个系统上运行相同的二进制文件,还是正在重新编译。 LPOLECLIENTSITE COleClientItem::GetClientSite() { ASSERT_VALID(this); LPOLECLIENTSITE lpClientSite = (LPOLECLIENTSITE)GetInterface(&IID_IOleClientSite); ASSERT(lpClientSite != NULL); return lpClientSite; } 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;,c++,windows,mfc,C++,Windows,Mfc,我有两个用于跟踪代码的开发系统。一个是64位Windows 7 Professional,另一个是32位Windows XP Professional。每个版本都有自己的VS6安装版本和完整代码库的独立(相同)副本。问题区域似乎位于中的Olceli1.CPP模块(Microsoft MFC代码)中 文件中的相同位置存在断点: else { // get item name TCHAR szItemName[OLE_MAXITEMNAME]; GetItemName(szI
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);
}
Windows 7监视框:
lpUnk 0x00000000
lpVtbl CXX0017: Error: symbol "" not found
lpUnk 0x00000000
__vfptr CXX0030: Error: expression cannot be evaluated
在XP系统中,sc
在调用后获取值0
。在Win7系统中,它被设置为-2147418113
。CheckGeneral(sc)
函数比较sc
和S_OK
并在它们不同时抛出错误。因为这两个值在Windows7中是不同的,所以它是不同的。我有什么不同的事情要做吗?我是否缺少Windows 7系统上的设置
更新:今天早上,我更仔细地查看了从
GetClientSite()
例程返回的内容。MFC中的代码相当简单:
LPOLECLIENTSITE COleClientItem::GetClientSite()
{
ASSERT_VALID(this);
LPOLECLIENTSITE lpClientSite =
(LPOLECLIENTSITE)GetInterface(&IID_IOleClientSite);
ASSERT(lpClientSite != NULL);
return lpClientSite;
}
我还看到,lpolleclientsite
的定义提供了两个接口,我得到的是“C风格的接口”
我还注意到,在Windows7系统上,lpClientSite
似乎没有完全定义
但是XP系统上的对象拥有一切:
-2147418113是
E_意外的
(0x8000FFFF)。如果将二进制文件(EXE、DLL等)从一台机器复制到另一台机器(而不是在每台机器上分别重新编译),会发生什么情况?这至少会提示您是否存在运行时问题和生成问题。此外,未检查GetClientSite()调用的返回值。所讨论的代码似乎来自VC++6附带的MFC版本(可能是MFC 4.2)。大量的错误已经被释放,同时,你应该认真考虑更新到最近的一些(最好是从这个千年)。不知为什么你在Windows XP上的C++代码使用了C定义,用于<代码> LPNUBIONE/CODE>(它使用一个带有函数指针的显式结构)。但是你在Windows 7上得到C++定义(它使用了一个带有虚拟方法的类)。两者布局兼容,但编程方式不同。不清楚您是在两个系统上运行相同的二进制文件,还是正在重新编译。
LPOLECLIENTSITE COleClientItem::GetClientSite()
{
ASSERT_VALID(this);
LPOLECLIENTSITE lpClientSite =
(LPOLECLIENTSITE)GetInterface(&IID_IOleClientSite);
ASSERT(lpClientSite != NULL);
return lpClientSite;
}
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;