未处理的异常:_com_error内存位置 0x0040f4ac

Unhandled exception : _com_error at memory location 0x0040f4ac

本文关键字:内存 位置 0x0040f4ac error com 异常 未处理      更新时间:2023-10-16

我正在使用外部库EASendMail使用gmail作为SMTP服务器发送电子邮件。

导致错误的行

oSmtp->许可证代码 = _T("TryIt");

用于安装外部库的链接。

#include "stdafx.h"
#include <iostream>
#include "easendmailobj.tlh"
#include <string>
using namespace EASendMailObjLib;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    string Lrecipient_email = "foobar@hotmail.com";
    ::CoInitialize( NULL );
    IMailPtr oSmtp = NULL;
    oSmtp.CreateInstance( "EASendMailObj.Mail");
    oSmtp->LicenseCode = _T("TryIt");  //error is here
    // Set your gmail email address
    oSmtp->FromAddr = _T(" mygmailacc@gmail.com");
    // Add recipient email address
    oSmtp->AddRecipientEx( _T(recipient_email.c_str()), 0);
    // Set email subject
    oSmtp->Subject = _T("Payment of Desposit Required");
    // Set email body
    oSmtp->BodyText = _T("Dear Customer , Please pay your deposit now !!!");
    // Gmail SMTP server address
    oSmtp->ServerAddr = _T("smtp.gmail.com");
    // If you want to use direct SSL 465 port, 
    // Please add this line, otherwise TLS will be used.
    // oSmtp->ServerPort = 465;
    // detect SSL/TLS automatically
    oSmtp->SSL_init();
    // Gmail user authentication should use your 
    // Gmail email address as the user name. 
    // For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
    oSmtp->UserName = _T("username");
    oSmtp->Password = _T("password");
    _tprintf(_T("Start to send email via gmail account ...rn" ));
    if( oSmtp->SendMail() == 0 )
    {
        _tprintf( _T("email was sent successfully!rn"));
    }
    else
    {
        _tprintf( _T("failed to send email with the following error: %srn"),
            (const TCHAR*)oSmtp->GetLastErrDescription());
    }
    if( oSmtp != NULL )
        oSmtp.Release();
    return 0;
}

我不知道为什么我会收到以下错误:

Unhandled exception at 0x7558c41f in SendEmail.exe: Microsoft C++ exception: _com_error at memory location 0x0040f4ac..

MS Studio调试器将此显示为文件中的错误源:easendmailobj.tli

错误 1

 Interface* operator->() const 
    { 
        if (m_pInterface == NULL) 
        {
            _com_issue_error(E_POINTER);
        }
        return m_pInterface; 
    }

错误 2

inline void IMail::PutLicenseCode ( _bstr_t pVal ) {
    HRESULT _hr = put_LicenseCode(pVal);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
}

oSmtp->LicenseCode = _T("TryIt");当您的试用版到期时,会发生此错误。

"TryIt"是评估许可证代码,只能用于演示目的。许可证到期 1 个月后,它会引发 COM 异常。

您可以进一步查看这些链接

https://www.emailarchitect.net/easendmail/sdk/html/LicenseCode.htmhttps://www.emailarchitect.net/easendmail/sdk/html/license.htm

最好的办法是用

try{
....
}catch(_com_error& ex){
e=e;//a break point here
}

并使用调试器单步执行代码。一旦它进入捕获部分,它就是先前调用的方法导致了它。通常对于这个 COM 的东西(我不喜欢它,但对它有些熟悉)它发生是因为早期的方法获得了错误的参数,所以它返回了一个空指针或类似的东西。

IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");

这可能是问题所在。首先,您将 NULL 分配给 oSmtp ,而不是尝试访问它。请验证,oSmtp可能为空。