0

当使用 CDO 发送电子邮件时,我遇到了四个第一次机会异常,两个 for IMessage::Send()and IMessage::GetStream()(所有这些都是无用的“ long at memory location such and such ”)。异常发生在我无法单步执行的代码中,但每个代码都得到了处理,最终我得到了一个HRESULTS_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);
}

关于为什么我会看到这些异常的任何线索?似乎很奇怪,例外是用来解决问题而不是先检查,不知道微软为什么会这样设置。

4

1 回答 1

0

您可能需要在 Visual Studio 中配置异常过滤器(如果您使用的是 VS,似乎就是这种情况)。转到主菜单 -> Dubug -> Windows -> 异常设置并取消选中相应的异常类型,以便 VS 在抛出它们时不会中断。

于 2017-11-02T21:37:56.217 回答