IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

MSOEAPI.h et MSOE.dll : comment les linker ?


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 39
    Points
    39
    Par défaut MSOEAPI.h et MSOE.dll : comment les linker ?
    Bonsoir,

    j'essaye d'utiliser la librairie msoeapi.h du sdk windows, pour pouvoir lire des emails via windows mail (car les comptes sont déjà configuré, toussa...).

    J'ai Visual Studio 2008, et je n'écris qu'une fonction simple, tiré des samples MSDN : http://msdn.microsoft.com/en-us/libr...41(VS.85).aspx


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include<initguid.h>
    #include <msoeapi.h>
    #include <mimeole.h>
    
    INT main()
    {
        IStoreFolder* pFolder = NULL;
      IStoreNamespace* pStore = NULL;
      IStream* pStream = NULL;
      FOLDERPROPS fprops = {0};
      MESSAGEPROPS mprops = {0};
      HENUMSTORE hFEnum = NULL;
      HENUMSTORE hMEnum = NULL;
    
      // Create an instance of an IStoreNamespace object.
      CoCreateInstance(
        CLSID_StoreNamespace,   // Namespace ClassID
        NULL,                   // Outer unknown that aggregates the new object
        CLSCTX_INPROC_SERVER,   // a server dll
        IID_IStoreNamespace,    // interface ID
        (LPVOID*)&pStore);      // The returned IStoreNamespace object
    
      // Initialize the new Namespace object.
      pStore->Initialize(NULL, 0);
    
      // Open the first enumerated folder.
      fprops.cbSize = sizeof(fprops);
      pStore->GetFirstSubFolder(FOLDERID_ROOT, &fprops, &hFEnum);
      pStore->OpenFolder(fprops.dwFolderId, 0, &pFolder);
      
      // If a message exists, ...
      if (fprops.cMessage > 0)
      {
        // ...open the first message in the first folder.
        mprops.cbSize = sizeof(mprops);
        pStore->GetFirstMessage(0, 0, MESSAGEID_FIRST, &mprops, &hMEnum);
        pFolder->OpenMessage(mprops.dwMessageId, IID_IStream, &pStream);
      
        // Print the message content to a stream.
        HRESULT hr = S_OK;
        char szBuff[100];
        ULONG cbRead = 1;
        while (hr == S_OK && cbRead > 0)
        {
          hr = pStream->Read(szBuff, sizeof(szBuff)-1, &cbRead);
          if (hr == S_OK)
          {
            szBuff[cbRead] = NULL;
            puts(szBuff);
          }
        }
      }
      // Release our IStream object.
      pStream->Release();
      
      // Release our IStoreFolder object.
      pFolder->Release();
    
      // Release our IStoreNamespace object.
      pStore->Release();
      
      return 0;
    }
    Dans les propriétés de mon projet, j'ai juste précisé le chemin include vers le header (C:\Programmes\MS SDKs\Windows\SDK 5\Include...aux noms près) et rien d'autre, pas de librairie.

    J'ai les erreurs suivantes :
    • "GetFirstMessage" n'est pas un membre de IStoreNamespace
    • IStoreFolder::OpenMessage : impossible de convertir le paramètre 3 de IStream ** en LPVOID*
    • "puts" identificateur introuvable


    Il semble que j'ai une interface qui ne correspond pas dans mon header, ou que j'ai oublié d'ajouter une quelconque référence de librairie...
    Je suis sous Vista familial premium SDK1, et j'ai windows mail et windows live mail.

    Pourriez vous éclairer ma pauvre lanterne sur ces mystérieuses erreurs alors que je ne fais que suivre l'aide officielle du composant ?

    Bonne soirée !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    1. Comme le dit google, GetFirstMessage() n'est pas dans IStoreNamespace mais dans IStoreFolder.
    2. Il faut un cast explicite, comme pour CoCreateInstance() ou QueryInterface().
    3. Tu n'as pas inclus <stdio.h>
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Erreur
    Bonjour,
    J'ai un petit problème avec mon code. J'écrit une application en visual C++ Api 32, pour l'extraction et la sauvegarde des emails.

    Une partie de mon code, permet l'extraction des emails en provenance de OutlookXpress / Windows Mail.

    tout fonctionne bien sur des PC équipés de Vista ou XP en ce qui concerne l'extraction des emails, par contre sous Windows 2000, au bout d'un moment et de façon alléatoire, j'ai une erreure Unhandled exception

    hRes = pFolder->OpenMessage(mprops.dwMessageId, IID_IMimeMessage, (VOID **) &pMimeMessage);

    et du coup mon application plante.

    Avez vous une idée ?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peut-on avoir plus d'infos sur l'exception?
    Est-ce une exception COM ou une Access Violation ?
    Quel est le type exact de pFolder et pMimeMessage ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    bonsoir Médinoc,

    Le message d'erreur exact est le suivant:

    Unhandled exception at 0x00644561 in Soft.exe: 0xC0000005: Access violation reading location 0x00000000

    Quel est le type exact de pFolder et pMimeMessage ? :

    IStoreFolder* pFolder = NULL;
    IMimeMessage* pMimeMessage = NULL;

    Ce qui est bizarre c'est que je n'ai cette erreure uniquement sous Windows 2000 et Outlook Xpress.

    Alain

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Traduction: Tu déréférences un pointeur nul.

    Vérifie que pFolder n'est pas nul lors de l'appel.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    bonjour médinoc,

    en fait lors de l'erreur (car je suis dans un boulce et donc pour certain email, ça passe), lors de l'appel de :

    hRes = pFolder->OpenMessage(mprops.dwMessageId, IID_IMimeMessage, (VOID **) &pMimeMessage);

    pour PFolder j'ai :

    pFolder 0x01da3db0
    IUnknown {...}
    __Vfptr 0x00000000
    [0] CXX0030: Error: expression cannot be evaluated
    [1] CXX0030: Error: expression cannot be evaluated
    [2] CXX0030: Error: expression cannot be evaluated

    alors que pour mprops.dwMessageId j'ai bien les info concernant l'email (cbSize, dwReserved, dwMessageID, dwLanguage, etc...).

    Par contre, pour pMimeMessage, j'ai :

    pMimeMessage
    pMimeMessage 0x00000000
    IMimeMessageTree {...}
    IPersistStreamInit {...}
    IPersist {...}
    IUnknown {...}
    __vfptr CXX0030: Error: expression cannot be evaluated

    La question est pourquoi tout d'un coup pFolder a pour valeur 0 alors que pour l'email précédant, venant du même répertoire, pFolder a une valeur ?

    je me pose la question.

    Alain

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    J'ai l'impression que ce n'est même pas pFolder qui est nul, mais son pointeur de vtable.
    En clair, soit pFolder ne pointe plus sur une IUnknown, soit il pointe sur une IUnknown qui a été détruite.

    Quant à pMimeMessage, c'est normal (et même recommandé) qu'il soit nul avant l'appel de OpenMessage().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    hum, mais comment ça se fait qu'il ne pointe plus sur le Iunknown ou que le IUnknown soit détruit, uniquement sur certain emails ?

    car si j'ajoute un contrôle d'erreur, qui ignore l'email qui cause le problème, ma boucle continue et le programme se termine bien. Bien sûre, je ne récupère pas les informations des emails qui causent une erreur. Et ce qui est bizarre, c'est que j'ai ça uniquement sous windows 2000.

    y a t'il un moyen si le Iunknown est détruit de le recréer ? ou ré attribuer une valeur pour le pointeur ?

    Alain

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peut-être que pFolder est corrumpu par un débordement de buffer, ou autre chose...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Merci médinoc,
    je vais chercher, car sous XP avec 512Mo de ram, ça passe et sous Windows2000 et 1Go de ram, ça passe pas.
    il faut que je regarde si il y a un débordement de buffer.

    Alain

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Médinoc,

    En fait, après avoir vérifier, lorsque j'ai mon erreur, j'ai pour pFolder :

    pFolder 0x01da3db0
    IUnknown {...}
    __vfptr 0x01bb7c48
    [0]0x01c575fe
    [1]0x01c5769d
    [2]0x01c58645


    alors que Par contre, pour pMimeMessage, j'ai :

    pMimeMessage
    pMimeMessage 0x00000000
    IMimeMessageTree {...}
    IPersistStreamInit {...}
    IPersist {...}
    IUnknown {...}
    __vfptr CXX0030: Error: expression cannot be evaluated


    donc c'est bien la fonction :
    pFolder->OpenMessage(mprops.dwMessageId, IID_IMimeMessage, (VOID **) &pMimeMessage); qui plante.

    Mais je ne vois pas pourquoi.

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Suite du problème
    Je pense avoir trouvé d'où provient le problème.

    Dans mon code, je fait un Do { pour récupérer les infos des tous les messages présent dans un dossier, et sous Windows 2000 avec Outlook Xpress, si un dossier contient plus de 511 messages, le programe plante.

    Je vais donc faire un test sur le nombre de message.

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Bon,

    Après plusieurs test, je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    long ExpressExtract ( VOID * hMail,
                          TCHAR * szFolderFrom, DWORD dwFlags,
                          TCHAR * szTargetFolder, TCHAR * szTargetDB,
                          VOID * CallBackParam,
                          LONG (*CallBack)( VOID* Param, TCHAR * sBuf, FILETIME * ftRecvd, TCHAR * szFromPar, TCHAR * toPar, TCHAR * ccPar, TCHAR * bccPar) )
    //  ================
    //
    //
    {
    UPMAIL * upm;
    DWORD dwFolderId;
    HRESULT hRes = S_OK;
    IStoreFolder* pFolder = NULL;
    LONG lCB, lR = UPMAIL_ERR_NOTFOUND;
    FOLDERPROPS fprops = {0};
    MESSAGEPROPS mprops = {0};
    IMimeMessage* pMimeMessage = NULL;
    HBODY hCurBody;
    PROPVARIANT propValue;
    IMimePropertySet *pPropertySet;
    HENUMSTORE hFEnum = NULL;
    HENUMSTORE hMEnum = NULL;
    TCHAR szBuff[1000], szBuff2[1000], szSize[300];
    TCHAR szSubj[10000], szTo[10000], szFrom[10000], szCc[10000], szBcc[10000];
    TCHAR szName[1000];
    HANDLE hfile;
    ULONG cbRead = 1;
    DWORD lBW;
    IStream* pStreamPart = NULL;
    IStream* pStreamBody = NULL;
    HBODY hBody;
    LARGE_INTEGER dlibMove;
    ULARGE_INTEGER libNewPosition;
    FILETIME ft;
    MESSAGEIDLIST MsgIdList;
    long i;
    
       upm = (UPMAIL *)hMail;
       upm->hDb = NULL;
       upm->dwMessageLimit = 1;
    
       if ( dwFlags & UPMAIL_SCAN_EXTRACT ) {
          // IF EXTRACTING, START THE DATA BASE
          lR = UpMailDBInit( szTargetDB, DB_EMAIL, &upm->hDb );
          if ( lR != UPMAIL_NO_ERROR ) {
             return(lR);
          }
       }
       szSubj[0] = szTo[0] = szFrom[0] = szCc[0] = szBcc[0] = szName[0] = 0x00;
    
       if ( ExpressSearchFolder ( upm->pStore, szFolderFrom, &dwFolderId ) == UPMAIL_NO_ERROR ) {
    
    findutr:
          hRes = upm->pStore->OpenFolder(dwFolderId, 0, &pFolder);
          if ( hRes == S_OK ) {
             fprops.cbSize = sizeof(FOLDERPROPS);
             hRes = pFolder->GetFolderProps( 0, &fprops );
             if ( hRes == S_OK ) {
    
                // IF AT LEAST A MESSAGE EXISTS, ...
                if (fprops.cMessage > 0) {
    
                   // SCAN ALL THE MESSAGES
                   mprops.cbSize = sizeof(mprops);
                   hRes = pFolder->GetFirstMessage(0, 0, MESSAGEID_FIRST, &mprops, &hMEnum);
    
                   do {
    NextMsg:
                      // OPEN THE MESSAGE AND GET ALL THE PIECES
                      hRes = pFolder->OpenMessage(mprops.dwMessageId, IID_IMimeMessage, (VOID **) &pMimeMessage); // C'EST LA QUE ça PLANTE SOUS WINDOWS 2000 SUR LE 512 MESSAGE d'UN DOSSIER
    
    				  if (FAILED(hRes)) {
    
    								upm->dwMessageLimit = mprops.dwMessageId;
    								upm->dwRepFolder = dwFolderId;
    								upm->bSuiteFolder = TRUE;
    									hRes = pFolder->GetNextMessage( hMEnum, 0, &mprops);
    									goto NextMsg;
    				  }
    				  
    				  while ( mprops.dwMessageId < upm->dwMessageLimit ) {
    					  hRes = pFolder->GetNextMessage( hMEnum, 0, &mprops);
    					  goto NextMsg;
    				  }
    
    				  hRes = pMimeMessage->GetBody (IBL_ROOT, 0, &hCurBody);
    
                      hRes = pMimeMessage->BindToObject(hCurBody, IID_IMimePropertySet,	(LPVOID *) &pPropertySet);
    
                      propValue.vt = VT_LPWSTR;
                      hRes = pPropertySet->GetProp((LPCSTR)"Subject", 0, &propValue);
                      szSubj[0] = 0;
                      if ( hRes == S_OK ) {
                         StringCbCopy(szSubj, sizeof(szSubj), propValue.pwszVal);
                         for ( i=0; szSubj[i] != 0x00; i++ ) {
                            if ( szSubj[i] == 0x0D || szSubj[i] == 0x0A ) szSubj[i] = 0x20;
                         }
                      }
                      if ( szSubj[0] == 0 ) {
                         StringCbCopy(szSubj, sizeof(szSubj), L"No Subject");
                      }
                      PropVariantClear(&propValue);
                         
                      propValue.vt = VT_LPSTR;
                      szFrom[0] = 0;
                      hRes = pPropertySet->GetProp((LPCSTR)"From", 0, &propValue);
                      if ( hRes == S_OK ) {
                         StringCbCopy(szFrom, sizeof(szFrom), WS((BYTE*)propValue.pszVal));
                         for ( i=0; szFrom[i] != 0x00; i++ ) {
                            if ( szFrom[i] == 0x0D || szFrom[i] == 0x0A ) szFrom[i] = 0x20;
                         }
                      }
                      PropVariantClear(&propValue);
    
    
                      // SIZE FIELD
                      hRes = pFolder->OpenMessage(mprops.dwMessageId, IID_IStream, (LPVOID *)&pStreamBody);
                      dlibMove.QuadPart = 0;
                      pStreamBody->Seek( dlibMove, STREAM_SEEK_END, &libNewPosition);
                      StringCbPrintf( szSize, sizeof(szSize), L"%d", libNewPosition.LowPart );
                      dlibMove.QuadPart = 0;
                      pStreamBody->Seek( dlibMove, STREAM_SEEK_SET, &libNewPosition);
    
                      //CREATE TO ENTRY
                      propValue.vt = VT_LPSTR;
                      hRes = pPropertySet->GetProp((LPCSTR)"To", 0, &propValue);
                      if ( hRes == S_OK ) {
                         StringCbCopy(szTo, sizeof(szTo), WS((BYTE*)propValue.pszVal));
                         for ( i=0; szTo[i] != 0x00; i++ ) {
                            if ( szTo[i] == 0x0D || szTo[i] == 0x0A ) szTo[i] = 0x20;
                         }
                      }
                      PropVariantClear(&propValue);
    
                      //CREATE CC ENTRY
                      propValue.vt = VT_LPSTR;
                      hRes = pPropertySet->GetProp((LPCSTR)"Cc", 0, &propValue);
                      if ( hRes == S_OK ) {
                         StringCbCopy(szCc, sizeof(szCc), WS((BYTE*)propValue.pszVal));
                         for ( i=0; szCc[i] != 0x00; i++ ) {
                            if ( szCc[i] == 0x0D || szCc[i] == 0x0A ) szCc[i] = 0x20;
                         }
                      }
                      PropVariantClear(&propValue);
    
    
                      //CREATE BCC ENTRY
                      propValue.vt = VT_LPSTR;
                      hRes = pPropertySet->GetProp((LPCSTR)"Bcc", 0, &propValue);
                      if ( hRes == S_OK ) {
                         StringCbCopy(szBcc, sizeof(szBcc), WS((BYTE*)propValue.pszVal));
                         for ( i=0; szBcc[i] != 0x00; i++ ) {
                            if ( szBcc[i] == 0x0D || szBcc[i] == 0x0A ) szBcc[i] = 0x20;
                         }
                      }
                      PropVariantClear(&propValue);
    
                      // CALL THE CALLBACK
                      lCB = CallBack( CallBackParam, szSubj, &mprops.ftReceived, szFrom, szTo, szCc, szBcc );
                      if ( lCB == -1 ) {
                         // ABORT
                         if ( dwFlags & UPMAIL_SCAN_EXTRACT ) {
                            if ( upm->hDb != NULL ) {
                               UpMailDBEnd( upm->hDb );
                            }
                         }
                         if ( hMEnum != NULL ) {
                            pFolder->GetMessageClose(hMEnum);
                         }
                         // RELEASE OUR ISTOREFOLDER OBJECT.
                         pFolder->Release();
                         return(UPMAIL_ERR_ABORT);
                      } else if ( lCB == 0 ) {
                         // SKIP, NOTHING TO DO 
                      } else {
                         // OK THE MSG MUST BE PROCESSED, CHECK THE REQUESTED OPERATION
                         if ( dwFlags & UPMAIL_SCAN_DELETE ) {
                            // MUST BE DELETED
                            pMimeMessage->Release();
                            MsgIdList.cbSize = sizeof(MESSAGEIDLIST);
                            MsgIdList.cMsgs = 1;
                            MsgIdList.prgdwMsgId = &mprops.dwMessageId;
                            hRes = pFolder->DeleteMessages(&MsgIdList,0,NULL);
                            if ( hRes != S_OK ) {
                               if ( upm->hDb != NULL ) {
                                  UpMailDBEnd( upm->hDb );
                               }
                               if ( hMEnum != NULL ) {
                                  pFolder->GetMessageClose(hMEnum);
                               }
                               // RELEASE OUR ISTOREFOLDER OBJECT.
                               pFolder->Release();
                               return(UPMAIL_ERR_REMOVING);
                            }
                            lR = UPMAIL_NO_ERROR;
                         } else {
                            // EXTRACT
                            UpMailDBEmailStart ( upm->hDb, &upm->lCurEmail );
                            upm->dwEmailFlag = 0;
    
                            UpMailDBFieldSet( upm->hDb, TAGEDB_FOLDER, szFolderFrom );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_SUBJECT, szSubj );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_FROM, szFrom );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_SIZE, szSize );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_TO, szTo );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_CC, szCc );
                            UpMailDBFieldSet( upm->hDb, TAGEDB_BCC, szBcc );
                            
                            //CREATE DATE ENTRY
                            propValue.vt = VT_LPSTR;
                            hRes = pPropertySet->GetProp( PIDTOSTR(PID_HDR_DATE), 0, &propValue);
                            if ( hRes == S_OK ) {
                               DecodeDate((char *)propValue.pszVal, &ft);
                               StringCbPrintf(szBuff2, sizeof(szBuff2), L"0x%.8X%.8X",ft.dwHighDateTime, ft.dwLowDateTime);
                            } else {
                               StringCbPrintf(szBuff2, sizeof(szBuff2), L"0x%.8X%.8X",0,0);
                            }
                            PropVariantClear(&propValue);
    
                            propValue.vt = VT_LPSTR;
                            hRes = pPropertySet->GetProp( PIDTOSTR(PID_HDR_RECEIVED), 0, &propValue);
                            if ( hRes == S_OK ) {
                               char * p;
                               p = strchr((char *)propValue.pszVal,(int)';');
                               if ( p != NULL ) {
                                  p+=1;
                                  DecodeDate(p, &ft);
                                  StringCbPrintf(szBuff, sizeof(szBuff), L"0x%.8X%.8X",ft.dwHighDateTime, ft.dwLowDateTime);
                               } else {
                                  StringCbPrintf(szBuff, sizeof(szBuff), L"0x%.8X%.8X",0,0);
                               }
                            } else {
                               //IF THE Received: FIELD IS NOT PRESENT IN THE HEADER, USE THE Date:
                               StringCbPrintf(szBuff, sizeof(szBuff), szBuff2);
                            }
                            PropVariantClear(&propValue);
    
                            // format is RECEIVED SENT
                            StringCbCat(szBuff, sizeof(szBuff), L" ");
                            StringCbCat(szBuff, sizeof(szBuff), szBuff2);
                            UpMailDBFieldSet( upm->hDb, TAGEDB_DATE, szBuff );
                                                         
                            //CREATE CHARSET ENTRY
                            propValue.vt = VT_LPSTR;
                            hRes = pPropertySet->GetProp(PIDTOSTR(PID_PAR_CHARSET),0, &propValue);
                            if ( hRes == S_OK ) {
                               UpMailDBFieldSet( upm->hDb, TAGEDB_CHARSET, WS((BYTE*)propValue.pszVal) );
                            }
                            PropVariantClear(&propValue);
    
                            // GET THE HTML BODY
                            hRes = pMimeMessage->GetTextBody( TXT_HTML, IET_BINARY, &pStreamPart, &hBody);
                            if ( hRes == S_OK ) {
                                  //  CREATE THE NAME OF THE OUTPUT FILE
                               StringCbPrintf(szName, sizeof(szName), L"%sE%06d.html", szTargetFolder, upm->lCurEmail);
    
                               // CREATE OUTPUT FILE
                               hfile = CreateFile(szName,FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
                               cbRead = 1; hRes = S_OK;
                               while (hRes == S_OK && cbRead > 0) {
                                  hRes = pStreamPart->Read(szBuff, sizeof(szBuff)-1, &cbRead);
                                  if ( hRes == S_OK && cbRead != 0 ) {
                                     WriteFile(hfile,szBuff,cbRead,&lBW,NULL);
                                  }
                               }
                               // CLOSE OUTPUT FILE AND RELEASE OUR ISTREAM OBJECT.
                               CloseHandle(hfile);
                               pStreamPart->Release();
                               upm->dwEmailFlag |= UPMAIL_BODYHTML;
    
    
                
                            }
    
      
    
                            // CREATE THE EML FILE
                            // CREATE THE NAME OF THE OUTPUT FILE
                            StringCbPrintf(szName, sizeof(szName), L"%sE%06d.eml", szTargetFolder, upm->lCurEmail);
    
                            // CREATE OUTPUT FILE
                            hfile = CreateFile(szName,FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
                            cbRead = 1; hRes = S_OK;
                            while (hRes == S_OK && cbRead > 0) {
                               hRes = pStreamBody->Read(szBuff, sizeof(szBuff)-1, &cbRead);
                               if ( hRes == S_OK && cbRead != 0 ) {
                                  WriteFile(hfile,szBuff,cbRead,&lBW,NULL);
                               }
                            }
                            // CLOSE OUTPUT FILE AND RELEASE OUR ISTREAM OBJECT.
                            CloseHandle(hfile);
                            pStreamBody->Release();
                            upm->dwEmailFlag |= UPMAIL_BODYEML;
    
    
    lR = ExpressAttachments( upm, szTargetFolder, szTargetDB, pFolder, &mprops);
    
                            // FLAG FIELD
                            StringCbPrintf(szBuff, sizeof(szBuff), L"0x%.8X", upm->dwEmailFlag);
                            UpMailDBFieldSet( upm->hDb, TAGEDB_FLAG, szBuff );
    					
    
                         }
    
                      }
    
                   }
    
    			   while ( pFolder->GetNextMessage( hMEnum, 0, &mprops) == S_OK );
                   if ( hMEnum != NULL ) {
                      pFolder->GetMessageClose(hMEnum);
                   }
                   lR = UPMAIL_NO_ERROR;
                } else {
                   lR = UPMAIL_NO_ERROR;
                }
                // RELEASE OUR ISTOREFOLDER OBJECT.
                pFolder->Release();
             }
          }
       }
       if ( dwFlags & UPMAIL_SCAN_EXTRACT ) {
          UpMailDBEnd( upm->hDb );
       }
    
       return(lR);
    }
    J'ai pensé au départ que celà provenait d'un message a extraire, mais en fait non. Si j'ai un dossier qui comporte plus de 511 messages, alors lors de l'extraction, au 512 éme j'ai cette erreure unhandled exception.... Et ce uniquement sous windows 2000. Et j'arrive pas a trouver la solution.

    Merci pour toutes les suggestions que vous pourrez me faire.

    A.

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Problème corrigé
    Bonjour Médinoc,

    J'ai enfin trouvé ma solution.

    En fait j'ai rajouté pMimeMessage->Release(); juste après le do { pour être certain que pMimemessage soit dispo lors du traitement. Je n'ai plus d'erreur sous Windows 2000 avec Outlook Xpress.

    Merci.

    Alain

Discussions similaires

  1. Les pragma comment pour linker les libraires!
    Par neo62matrix dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 07/11/2007, 11h31
  2. Comment retrouver les Dll ou les OCX suivantes?
    Par nnj dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/08/2007, 13h18
  3. [shell32.dll]comment utiliser les icones ?
    Par deeal dans le forum Visual C++
    Réponses: 8
    Dernier message: 04/12/2006, 11h56
  4. Position des balises H2 ou comment les numéroter
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/07/2003, 20h24
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo