Wat ik aan het doen ben is een "windows-service" bouwen die fout-geadresseerde email "bounces." (retourneert).
Die service op zich draait al prachtig - no problem - maar ik wil 'm wat te doen geven natuurlijk.
Ik baseer dat op de "Micro$oft Collaboration Data Objects" (CDO) en op zich werkt dat wel.
Als Header gebruik ik b.v. deze code:
CDONoNameSpace.h
Code: Selecteer alles
#import "C:\Program Files\Common Files\System\ado\msado15.dll"\
no_namespace rename("EOF","adoEOF")
#import <cdosys.dll> no_namespace
#include <cdosysstr.h>
#include <cdosyserr.h>
Maar nu wil ik een email-bestand (.eml-file) inlezen volgens dit:
CDOReadMail.cpp
Code: Selecteer alles
#include "CDONoNameSpace.h"
IMessagePtr readMailMessage(_bstr_t filePath)
{
// Creëer een (ADODB) data-stream object
_StreamPtr pStm(__uuidof(Stream));
// Source is niet van belang - komt later wel
_variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
try {
// Open die stream
pStm->raw_Open(
varOptional,
adModeUnknown,
adOpenStreamUnspecified,
NULL,
NULL);
// Lees data uit een gespecificeerd file
pStm->LoadFromFile(filePath);
// en zorg dat dat bewaard blijft
pStm->Flush();
}
catch(_com_error e)
{
// Iets in het bovenstaande ging niet goed
// en deze afhandeling vind ik erg slordig
throw e;
}
// Nu gaan we kijken wat die steam ons te bieden heeft:
// Creëer een Message-object
IMessagePtr iMsg(__uuidof(Message));
// Maak dat dat ingelezen kan worden
IDataSourcePtr iDsrc = iMsg;
try {
// en probeer dat ook
iDsrc->OpenObject(pStm,_bstr_t("_Stream"));
}
catch(_com_error e)
{
// Mislukt:
// ook deze afhandeling kan beter
throw e;
}
// Want in die Catch-statements wordt de geopende stream niet gesloten
// en na een throw-statement wordt deze opdracht niet meer bereikt
pStm->raw_Close();
// Maar DIT is het probleem:
// hoe lever ik dit af aan een aanroepende functie?
return iMsg;
}
Maar wat beslist niet werkt is dus dit:
Code: Selecteer alles
int main(int argc, char* argv[])
{
CoInitialize(NULL);
HRESULT hr = S_OK;
IMessagePtr imp;
try {
imp = readMailMessage("c:\\sample_mail.eml");
} catch( _com_error err) {
// ...
hr = err.Error();
wprintf(L"Exeption occured: %s\n", err.ErrorMessage());
}
CoUninitialize();
return (int)hr != S_OK;
}
Code: Selecteer alles
Unhandled exception at 0x<where_ever> in CDOReadMail.exe: 0xC0000005: Access violation reading location 0x<where_ever>.
Alvast bedankt.