Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在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 - Fatal编程技术网

为什么我在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;

为什么我在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

我有两个用于跟踪代码的开发系统。一个是64位Windows 7 Professional,另一个是32位Windows XP Professional。每个版本都有自己的VS6安装版本和完整代码库的独立(相同)副本。问题区域似乎位于中的Olceli1.CPP模块(Microsoft MFC代码)中

文件中的相同位置存在断点:

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;