Ошибка COM 0x80004003 (неверный указатель) доступа к контактам MS Outlook - PullRequest
3 голосов
/ 22 мая 2009

Я - некоторый код ATL, который использует умные COM-указатели для перебора контактов MS Outlook, а на некоторых ПК я получаю COM-ошибку 0x80004003 («Неверный указатель») для каждого контакта. Этот же код отлично работает на других ПК. Код выглядит так:

_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());
    }
}

Интересно, могут ли другие приложения / надстройки вызывать это? Любая помощь будет приветствоваться.

Ответы [ 4 ]

1 голос
/ 28 мая 2009

FullName - это свойство, и вы выполняете операцию GET (вероятно, что-то подобное в IDL: get_FullName ([out, retval] BSTR * o_sResult)). Такая операция работает нормально с нулевыми значениями.

Я предполагаю, что contactItem умный указатель указывает на любой допустимый COM-объект. В таком случае операция форматирования, выполняемая ATLTRACE, может вызвать проблему. Внутренне он ведет себя, вероятно, как стандартная sprintf("",args...) функция.

Чтобы избежать таких проблем, просто сделайте что-то вроде ниже:

ATLTRACE(_T("\tContact name: %s\n"),
_bstr_t(contactitem->FullName)?static_cast<LPCTSTR>(contactitem->FullName):"(Empty)")
0 голосов
/ 16 июня 2009

В моем примере вы форматируете значение NULL в правильное текстовое значение.

Если вопрос касается разницы между FullName (как свойство) и GetFullName () (как метод), то ответ - нет. Свойство и метод должны давать одинаковый результат. Иногда свойство может быть сопоставлено с различными методами, затем setXXX и getXXX. Это может быть достигнуто путем использования определенного синтаксиса в IDL (и в действительности в TLB после компиляции IDL в TLB). Если свойство FullName не сопоставлено с методом GetFullName, вы получите другой результат.

Поэтому, пожалуйста, проверьте файл * .tlh после импорта какой-либо библиотеки типов в ваш проект ...

0 голосов
/ 12 июня 2009

Имеет ли это какое-то значение?

ATLTRACE(_T("\tContact name: %s\n"), static_cast<LPCTSTR>(contactitem->GetFullName()));
0 голосов
/ 22 мая 2009

Просто предположение: Может быть, поле «FullName» в адресной книге пустое, и поэтому указатель недействителен?

Трудно сказать, потому что ваш код не указывает, какие COM-интерфейсы вы используете.

...