2011-06-15 4 views
-1

을 위해 노력하고, get_tables(&_result)_result에 테이블의 목록을 지정하고 hr의 값은 S_OK된다. 나는 윈도우 7 (32 비트)와 동일한 코드를하려고하면기능 get_tables()는 윈도우 7에 대한 실패,하지만 난 (아래) 코드를 디버깅 할 때 Windows XP에서 윈도우 XP

get_tables 기능 _result에 NULL (은 0x00000)을 (즉,이 제외되지 않음)에 할당되고, 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

pTableNew는 현재 사용중인 스레드가 아닌 다른 스레드에서 얻거나 생성했습니다. 이것은 사용자 버그입니다.

COM 인터페이스 (IDispatch 포함)는 두 스레드가 MTA (COINIT_MULTITHREADED) 내에 있지 않으면 스레드간에 마샬링되어야합니다. 마샬링하는 방법은 여러 가지가 있지만 스레드간에 공유되는 인터페이스를 사용하는 쉬운 방법은 전역 인터페이스 테이블을 사용하고 인터페이스 포인터 대신 GIT 쿠키를 저장하는 것입니다. 이 문서

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

는 GIT의 좋은 기본적인 설명이있다.

우연히 COM 개체가 C++ (타사 코드가 제공하는 것보다는)에서 구현 된 것일 경우 다른 고급 솔루션은 개체에 자유 스레드 마셜 러를 집계하여 사용하도록 허용합니다 모든 스레드에서 직접). 이렇게하면 코드에 다른 변경 사항 (예 : 외부 객체에 대한 GIT 쿠키의 일관된 사용) 및 더 많은주의가 필요합니다. 돈의 기사는 아주 좋은 것입니다 :

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

마틴이

+0

감사에게 로벨을 좀 더 컨텍스트를 제공하시기 바랍니다 .... 내가 하나가 읽어 thing.pls 쓰기 forgeted했다 "내 목표는 보고서를 작성하는 것입니다, 그리고 나는 두 가지 옵션에서 하나의 옵션 (하나의 시나리오)에 대한 리포트를 작성할 수 있지만, 다른 시나리오에서는 실패합니다. "마샬링을 위해 정말로해야한다고 생각합니까 ??? – runa

+0

마샬링하지 않고 인터페이스 포인터를 다른 스레드로 옮겼습니까? –

관련 문제