Проблема с attachment в Extended MAPI
От: chamomilla  
Дата: 19.04.10 18:46
Оценка:
Всех приветствую!!!
столкнулся с такой проблемой: при попытке прочесть (получить) вложения никак не могу обратиться к такому свойству аттачей как PR_ATTACH_DATA_BIN!!!
погуглив малость прочел, что PR_ATTACH_METHOD должен быть установлен ATTACH_BY_VALUE(то есть равен 1). У меня стоит OutlookSpy, я все проверил так и есть...но при попытке выполнить OpenProperty(PR_ATTACH_DATA_BIN... никак не получается достучаться до этого свойства!!!ниже привожу отрывок кода(может я что-то упускаю)

SizedSPropTagArray( 4, rgTags) = { 4, PR_SENDER_EMAIL_ADDRESS, PR_DISPLAY_TO, PR_SUBJECT, PR_BODY }; 
    SizedSPropTagArray( 5, atContents) = { 5, PR_ATTACH_NUM, PR_ATTACH_FILENAME, PR_ATTACH_SIZE, PR_ATTACH_METHOD, PR_ATTACH_DATA_BIN };
    IStream *pAttachstream = NULL;
    //LPSTREAM pAttachstream = NULL;
    HANDLE hAttachFile = NULL;
    TCHAR tchFilePath[MAX_PATH] = TEXT("\0");
    DWORD dwRead = 0, dwWritten = 0;
    LPVOID lpBuffer;
    WCHAR res_file[MAX_PATH];
    //lpBuffer = (LPVOID)LocalAlloc(LPTR, 4096);
    
    lpBuffer = (LPVOID)malloc( 4096);
    if( !lpBuffer )
    
    for(int k=0; k<mescount; k++){ 
        
        hr = lpMessageStore->OpenEntry( pRow->aRow[k].lpProps[0].Value.bin.cb, (LPENTRYID)pRow->aRow[k].lpProps[0].Value.bin.lpb, 
                        NULL, 0, &ulObjType, (LPUNKNOWN FAR *)&lpMessage); 
        
        hr = lpMessage->GetProps((LPSPropTagArray) &rgTags, MAPI_UNICODE, &cCount, &rgprops); 
        if(FAILED(hr)){
            printf("ERROR GetProps\n");
            MAPIUninitialize();
            return hr;
        }
        
        hr = lpMessage->GetAttachmentTable( MAPI_UNICODE, &lpAttachTable);
        if(FAILED(hr)){
            printf("ERROR GetAttachmentTable\n");
            MAPIUninitialize();
            return hr;
        }
        //else 
        //printf("SUCCESS GetAttachmentTable\n");

        hr = lpAttachTable->GetRowCount(0,&atcount); 
        
        hr = lpAttachTable->SetColumns( (LPSPropTagArray)&atContents, 0 ); 
        if(FAILED(hr))
        {
            printf("ERROR SetColumns\n");
            MAPIUninitialize();
            return hr;
        }
            
        if (atcount > 0){
        
            printf("atcount = %d\n", atcount);
            
                hr = lpAttachTable->QueryRows( atcount, 0, &pRow1 ); 
                if(FAILED(hr)){
                    printf("ERROR QueryRows\n");
                    MAPIUninitialize();
                    return hr;
                }
                /*
                hr = lpMessage->GetProps((LPSPropTagArray) &atContents, MAPI_UNICODE, &propCount, &atrgprops); 
                    
                    if(FAILED(hr)){
                        printf("ERROR GetProps\n");
                        MAPIUninitialize();
                        return hr;
                    }
                */
                for( int m=0; m<atcount; m++)
                {    
                    //for( int n=0; n<propCount; n++){    
                        
                        atnum = pRow1->aRow[m].lpProps[0].Value.l;
                        printf( "Number = %u\n", atnum );
                        printf("PR_ATTACH_METHOD = %u \n", pRow1->aRow[m].lpProps[3].Value.l);
                        
                        //hr = lpMessage->OpenAttach( atnum, NULL, MAPI_BEST_ACCESS, &pAttach );
                        hr = lpMessage->OpenAttach( atnum, NULL, NULL, &pAttach );
                        if(FAILED(hr))
                        {    
                                                      return hr;
                        }
                        wsprintf(tchFilePath, TEXT("\\%s"), pRow1->aRow[m].lpProps[1].Value.lpszA);
                        hAttachFile = CreateFile(tchFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
                        hr = pAttach->OpenProperty( PR_ATTACH_DATA_BIN, (LPIID)&IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY,IUnknown **)&pAttachstream);
                                            //ИМЕННО ТУТ ВОЗНИКАЕТ ОШИБКА
                        if( FAILED(hr))
                        {
                            wprintf( L"ERRRRRRR: hr = 0x%p\n", hr );
                            return hr;
                        }
                        else
                            printf("OK!!!!\n");
                        
                        do {
                           memset(lpBuffer, 0, 4096);
                           dwRead = 0;
                           wprintf( L"pAttachstream = 0x%p\n", pAttachstream );

                           pAttachstream->Read(lpBuffer, 4096, &dwRead);
                           
                           if(dwRead > 0)
                              if( !WriteFile(hAttachFile, lpBuffer, dwRead, &dwWritten, NULL) )
                        } while(dwRead > 0);
                        
                        CloseHandle(hAttachFile);
                }
                LocalFree(lpBuffer);
        }
        else
            printf("there is no attach\n");
        
        for(int i=0; i<cCount; i++){ 
            
            if ( rgprops[i].Value.err & 0x80000000 ){
                //printf("ERRORRRRR\n"); 
            }
            if( rgprops[i].ulPropTag == PR_SENDER_EMAIL_ADDRESS ){
                printf("FROM: %s\n",rgprops[i].Value.lpszW); 
            }
            if( rgprops[i].ulPropTag == PR_DISPLAY_TO ){
                printf("TO: %s\n", rgprops[i].Value.lpszW); 
            }
            if( rgprops[i].ulPropTag == PR_SUBJECT ){
                printf("SUBJECT: %s\n", rgprops[i].Value.lpszW); 
            }
            printf( "\r\n" );
            if( rgprops[i].ulPropTag == PR_BODY ){
                printf("%s\n", rgprops[i].Value.lpszW); 
            }    
        }
    }

//////////все релизим и отлогиниваемся
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.