Функция get_tables () не работает для Windows 7, но работает для Windows XP - PullRequest
0 голосов
/ 15 июня 2011

Когда я отлаживаю код (указанный ниже) в Windows XP, get_tables(&_result) назначает список таблиц для _result, и значение hr становится S_OK.

Если я попробую тот же код с Windows 7 (32-разрядная версия), функция get_tables назначает NULL (0X00000) для _result (что не исключено), и значение hr становится " Приложение называется интерфейсом, который был назначен для другого потока ". Моё приложение вылетает.

Почему это происходит в Windows 7 (32-разрядная версия)?

Должен ли я пойти на сортировку?

Или мне нужно изменить некоторые настройки для Windows 7?


// 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);
} 

1 Ответ

0 голосов
/ 16 июня 2011

pTableNew был получен / создан в потоке, отличном от того, в котором он сейчас используется - это ваша ошибка.

COM-интерфейсы (включая IDispatch) необходимо распределять между потоками, если оба потока не находятся в MTA (COINIT_MULTITHREADED). Существует несколько способов маршалинга, но простой способ иметь интерфейсы, которые совместно используются потоками, состоит в том, чтобы использовать глобальную таблицу интерфейсов и сохранять GIT-cookie вместо указателя интерфейса. Эта статья

http://msdn.microsoft.com/en-us/library/ms678517(VS.85).aspx

имеет хорошее базовое объяснение GIT.

Если случайно COM-объект является одним из ваших, реализованных в C ++ (а не предоставленным сторонним кодом), другое продвинутое решение переключилось бы на то, чтобы ваш объект агрегировал маршаллер со свободным потоком (позволяя использовать его напрямую. из любой темы). Для этого требуются другие изменения в вашем коде (например, постоянное использование файлов cookie GIT для внешних объектов), а также повышенная осторожность. Статья Дона довольно хороша:

http://www.microsoft.com/msj/0997/activex0997.aspx

Martyn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...