При использовании CDO для отправки электронных писем я беру четыре исключения из первых шансов, по два для каждого IMessage::Send()
а также IMessage::GetStream()
(все бесполезно «долго в памяти места такие-то«). Исключения случаются в коде, недоступном для меня, чтобы пройти через него, но каждый обрабатывается, и в конечном итоге я получаю обратно HRESULT
из S_OK
и письмо успешно отправлено.
Я имел обыкновение сталкиваться с исключениями первого шанса при настройке конфигурации, как эта проблема упоминает и решил это так же (использовал Append()
для каждого элемента), так что я думаю, что есть некоторая информация о настройке, которую мне не хватает, что вызывает проблемы с Send()
/GetStream()
,
Вот суть того, что у меня есть:
IMessagePtr message(__uuidof(Message));
IConfigurationPtr config = message->Configuration;
FieldsPtr configFields = config->Fields;
configFields->Item[cdoSendUsingMethod]->Value = _variant_t(cdoSendUsingPort);
configFields->Append(cdoSMTPServerPort, DataTypeEnum::adBSTR, SysStringLen(cdoSMTPServerPort), FieldAttributeEnum::adFldUnspecified, _variant_t(m_lSMTPServerPort));
configFields->Append(cdoSMTPServer, DataTypeEnum::adBSTR, SysStringLen(cdoSMTPServer), FieldAttributeEnum::adFldUnspecified, _variant_t(m_sSMTPServer));
configFields->Append(cdoSMTPConnectionTimeout, DataTypeEnum::adBSTR, SysStringLen(cdoSMTPConnectionTimeout), FieldAttributeEnum::adFldUnspecified, _variant_t(m_lSMTPConnectionTimeout));
configFields->Append(cdoSMTPAuthenticate, DataTypeEnum::adBSTR, SysStringLen(cdoSMTPAuthenticate), FieldAttributeEnum::adFldUnspecified, _variant_t(cdoBasic));
configFields->Append(cdoSendUserName, DataTypeEnum::adBSTR, SysStringLen(cdoSendUserName), FieldAttributeEnum::adFldUnspecified, _variant_t(m_sUserName));
configFields->Append(cdoSendPassword, DataTypeEnum::adBSTR, SysStringLen(cdoSendPassword), FieldAttributeEnum::adFldUnspecified, _variant_t(m_sPassword));
configFields->Update();
message->put_To(bsRecipients);
message->put_From(bsFrom);
message->put_Subject(bsSubject);
message->put_TextBody(bsMessage);
message->Send();
_StreamPtr stream = message->GetStream();
Это насколько я вижу в cdosys.tli
inline HRESULT IMessage::Send ( ) {
HRESULT _hr = raw_Send();
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}
inline _StreamPtr IMessage::GetStream ( ) {
struct _Stream * _result = 0;
HRESULT _hr = raw_GetStream(&_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _StreamPtr(_result, false);
}
Любая подсказка, почему я вижу эти исключения? Кажется странным, что исключения используются для решения проблем, а не просто проверяют сначала, не зная, почему Microsoft так настроила.
Возможно, вам придется настроить фильтры исключений в Visual Studio (если вы используете VS, что, кажется, имеет место). Перейдите в Главное меню -> Dubug -> Windows -> Настройки исключений и снимите флажок с соответствующим типом исключений, чтобы VS не прерывался при их выбросе.
Других решений пока нет …