raw_Send()和raw_GetStream()上的CDOSYS第一次机会异常

时间:2017-11-02 21:31:15

标签: c++ first-chance-exception cdo

当使用CDO发送电子邮件时,我遇到了四个第一次机会异常,IMessage::Send()IMessage::GetStream()各有两个(所有这些都是无用的" 长在内存位置这样的")。例外情况发生在我无法通过的代码中,但每个代码都已处理完毕,最终我返回HRESULT S_OK并且电子邮件发送成功。

在设置this issue mentions之类的配置时,我常常遇到第一次机会异常并以相同的方式解决(每个项目使用Append()),所以我在那里思考&#39 ;一些设置信息我错过了引发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);
}

有关我为什么会看到这些例外情况的任何线索?奇怪的是,异常用于解决问题,而不仅仅是先检查,不确定为什么微软会这样设置。

1 个答案:

答案 0 :(得分:0)

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