当使用 CDO 发送电子邮件时,我遇到了四个第一次机会异常,两个 for IMessage::Send()
and IMessage::GetStream()
(所有这些都是无用的“ long at memory location such and such ”)。异常发生在我无法单步执行的代码中,但每个代码都得到了处理,最终我得到了一个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);
}
关于为什么我会看到这些异常的任何线索?似乎很奇怪,例外是用来解决问题而不是先检查,不知道微软为什么会这样设置。