2009-05-22 3 views
3

나는 스마트 COM 포인터를 사용하여 MS Outlook 연락처를 반복하는 일부 ATL 코드이며 일부 PC에서는 각각 COM 오류 0x80004003 ('잘못된 포인터')이 표시됩니다. 접촉. 동일한 코드가 다른 PC에서도 잘 작동합니다. 코드는 다음과 같습니다.COM 오류 0x80004003 (잘못된 포인터) 액세스 MS Outlook 연락처

_ApplicationPtr ptr; 
ptr.CreateInstance(CLSID_Application); 

_NameSpacePtr ns = ptr->GetNamespace(_T("MAPI")); 
MAPIFolderPtr folder = ns->GetDefaultFolder(olFolderContacts); 

_ItemsPtr items = folder->Items; 
const long count = items->GetCount(); 

for (long i = 1; i <= count; i++) 
{ 
    try 
    { 
     _ContactItemPtr contactitem = items->Item(i); 
     // The following line throws a 0x80004003 exception on some machines 
     ATLTRACE(_T("\tContact name: %s\n"), static_cast<LPCTSTR>(contactitem->FullName)); 
    } 
    catch (const _com_error& e) 
    { 
     ATLTRACE(_T("%s\n"), e.ErrorMessage()); 
    } 
} 

다른 응용 프로그램/추가 기능이 원인 일 수 있습니까? 어떤 도움이라도 환영받을 것입니다.

+0

하나의 가능한 체크. contactitem은 항상 null입니까? 나는 당신이 카운트를 미리 체크하고 있기 때문에 그렇게 생각하지 않을 것이다. 그러나 시도할만한 가치가있다. –

답변

0

그냥 추측 : 주소록의 "FullName"필드가 비어있어 포인터가 유효하지 않은 것입니까?

당신의 코드가 현재 사용중인 COM 인터페이스를 나타내지 않기 때문에 알기가 어렵습니다.

1

FullName은 속성이며 GET 작업을 수행합니다 (IDL에서는 get_FullName ([out, retval] BSTR * o_sResult)). 이러한 작업은 null 값으로 정상적으로 작동합니다.

제 생각에 contactItem 스마트 포인터는 유효한 COM 개체를 가리 킵니다. 이 경우 ATLTRACE에 의해 행해진 포맷 작업으로 인해 문제가 발생할 수 있습니다. 내부적으로는 표준 sprintf("",args...) 기능처럼 동작합니다.

는 이러한 문제가 바로 아래와 같은 일을 방지하려면 :

ATLTRACE(_T("\tContact name: %s\n"), 
_bstr_t(contactitem->FullName)?static_cast<LPCTSTR>(contactitem->FullName):"(Empty)") 
0

이 어떤 차이가 있습니까?

ATLTRACE(_T("\tContact name: %s\n"), static_cast<LPCTSTR>(contactitem->GetFullName())); 
0

이 예에서는 적절한 텍스트 값에 NULL 값을 지정합니다.

FullName (속성)과 GetFullName() (메서드)의 차이점에 대한 질문은 대답이 아니오입니다. 속성과 메서드는 동일한 결과를 제공해야합니다. 때로는 속성을 다른 메서드에 매핑 한 다음 setXXX 및 getXXX에 매핑 할 수 있습니다. IDL에서 특정 구문을 사용하여 실현할 수 있습니다 (IDL을 TLB로 컴파일 한 후 TLB에서 실제로). FullName 속성이 GetFullName 메서드에 매핑되지 않으면 다른 결과를 얻을 수 있습니다.

프로젝트에 일부 형식 라이브러리를 가져온 후 파일 * .tlh를 확인하십시오.

관련 문제