C++ 函数get_tables()在Windows 7中失败,但在Windows XP中正常工作

C++ 函数get_tables()在Windows 7中失败,但在Windows XP中正常工作,c++,windows,C++,Windows,当我在Windows XP中调试代码(如下所列)时,get_tables(&_result)将表列表分配给\u result,并且hr的值变为S_OK 如果我在Windows 7(32位)上尝试相同的代码,get_tables函数将NULL(0X00000)赋值给\u result(这不例外),并且hr的值变为“调用为不同线程封送的接口的应用程序”。然后我的应用程序崩溃了 为什么Windows 7(32位)会出现这种情况 我应该走编组线吗 或者我需要更改Windows 7的一些设置 在调试过程

当我在Windows XP中调试代码(如下所列)时,
get_tables(&_result)
将表列表分配给
\u result
,并且
hr
的值变为
S_OK

如果我在Windows 7(32位)上尝试相同的代码,
get_tables
函数将NULL(0X00000)赋值给
\u result
(这不例外),并且
hr
的值变为“调用为不同线程封送的接口的应用程序”。然后我的应用程序崩溃了

为什么Windows 7(32位)会出现这种情况

我应该走编组线吗

或者我需要更改Windows 7的一些设置


在调试过程中,我转到这一点(见下文)


pTableNew是在一个线程上获得/创建的,而不是现在使用它的线程-这是您的错误

COM接口(包括IDispatch)需要在线程之间封送,除非两个线程都在MTA内(Conit_多线程)。封送处理有几种方法,但是让跨线程共享接口的一种简单方法是使用全局接口表并存储GIT cookie,而不是接口指针。本文

对GIT有一个很好的基本解释

<>如果COM对象是您在C++中实现的(而不是由第三方代码提供的)之一,则另一个高级解决方案将转换为让对象聚合自由线程封送器(允许它直接从任何线程使用)。这样做需要在代码中进行其他更改(例如对外部对象一致使用GIT Cookie),并且需要更加小心。唐的文章很好:


Martyn

请提供更多的上下文谢谢Lovell…我忘了写一件事。请阅读“我的目标是创建报告,我可以从两个不同的选项创建报告,一个选项(一个场景)工作正常,但另一个场景失败…”你认为我真的应该进行编组吗???你是否在没有编组的情况下将接口指针移动到另一个线程?
// Append the new table
m_pCatalog->Tables->Append(_variant_t((IDispatch *) pTableNew)); 
inline TablesPtr _Catalog::GetTables()
{
    struct Tables * _result;
    HRESULT _hr = get_Tables(&_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return TablesPtr(_result, false);
}