Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / IConverterSession::MIMEToMAPI ошибка при вызове / 3 сообщений из 3, страница 1 из 1
24.09.2009, 18:30
    #36215834
gogen600
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IConverterSession::MIMEToMAPI ошибка при вызове
Пытаюсь вызвать функцию IConverterSession::MIMEToMAPI и получаю HRESULT = 0x80030019 (STG_E_SEEKERROR).
Помогите разобраться, в чём проблема.
Код :
Код: plaintext
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.
DEFINE_GUID(CLSID_IConverterSession,    0x4e3a7680, 0xb77a, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);
DEFINE_GUID(IID_IConverterSession,    0x4b401570, 0xb77b, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);

typedef enum tagENCODINGTYPE 
{
    IET_BINARY    =  0 ,
    IET_BASE64    =  1 ,
    IET_UUENCODE    =  2 ,
    IET_QP        =  3 ,
    IET_7BIT    =  4 ,
    IET_8BIT    =  5 ,
    IET_INETCSET    =  6 ,
    IET_UNICODE    =  7 ,
    IET_RFC1522    =  8 ,
    IET_ENCODED    =  9 ,
    IET_CURRENT    =  10 ,
    IET_UNKNOWN    =  11 ,
    IET_BINHEX40 =  12 ,
    IET_LAST    =  13 
} ENCODINGTYPE;

typedef enum tagMIMESAVETYPE 
{
    SAVE_RFC822    =  0 ,
    SAVE_RFC1521    =  1 
} MIMESAVETYPE;

typedef enum tagCCSF 
{
    CCSF_SMTP        = 0x0002,
    CCSF_NOHEADERS        = 0x0004,
    CCSF_NO_MSGID        = 0x4000,
    CCSF_USE_RTF        = 0x0080,
    CCSF_INCLUDE_BCC    = 0x0020
} CCSF;

interface DECLSPEC_UUID("4B401570-B77B-11D0-9DA5-00C04FD65685") IConverterSession : public IUnknown
{
    private:
        STDMETHOD(placeholder0)() PURE;
    public:
        STDMETHOD(SetAddressBook) ( LPADRBOOK pAddrBook ) PURE;
        STDMETHOD(SetEncoding)(ENCODINGTYPE et) PURE;
    private:
        STDMETHOD(placeholder1)() PURE;
    public:
        STDMETHOD(MIMEToMAPI)(LPSTREAM        pstm,
                              LPMESSAGE        pmsg,
                              LPCSTR        pszSrcSrv,
                              ULONG            ulFlags) PURE;
        STDMETHOD(MAPIToMIMEStm)(LPMESSAGE pmsg,LPSTREAM pstm,ULONG ulFlags)
    PURE;
    private:
        STDMETHOD(placeholder2)() PURE;
        STDMETHOD(placeholder3)() PURE;
        STDMETHOD(placeholder4)() PURE;
    public:
        STDMETHOD(SetTextWrapping(BOOL fWrapText,ULONG ulWrapWidth)) PURE;
        STDMETHOD(SetSaveFormat(MIMESAVETYPE mstSaveFormat)) PURE;
    private:
        STDMETHOD(placeholder5)() PURE;
        STDMETHOD(placeholder6)() PURE;
};

int _tmain(int argc, _TCHAR* argv[])
{
    IConverterSession    *pConverterSession = NULL;
    LPMESSAGE*            message            = new LPMESSAGE();
    LPSTREAM            pMimeStream        = NULL;
    DWORD                dwFileSize        =  0 ;
    HANDLE                hFile            = NULL;
    LPVOID                pvData            = NULL;
    HGLOBAL                hGlobal            = NULL;
    DWORD                dwBytesRead        =  0 ;
    BOOL                bRead            = FALSE;
    HRESULT                hresult            =  0 ;
    LPCWSTR                filename        = L"c:\\temp\\file.eml";
    
    hresult = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if(hresult != S_OK)
        return  0 ;        

    hFile = CreateFile(    filename, GENERIC_READ,  1 , NULL, OPEN_EXISTING,  0 , NULL);
    dwFileSize = GetFileSize(hFile, NULL);
    
    hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    pvData = GlobalLock(hGlobal);    
    bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    GlobalUnlock(hGlobal);
    CloseHandle(hFile);

    hresult = CreateStreamOnHGlobal(hGlobal, TRUE, &pMimeStream);
    
    if(hresult == S_OK)
    {
        hresult = CoCreateInstance(CLSID_IConverterSession, 
                    NULL, 
                    CLSCTX_INPROC_SERVER, 
                    IID_IConverterSession, 
                    (void **)&pConverterSession);

        if(hresult == S_OK)
        {            
            hresult = pConverterSession->MIMEToMAPI(pMimeStream, *message, NULL, CCSF_USE_RTF);
            //"приплыли"
        }
    }

    std::cout << "abracadabra";
    CoUninitialize(); 
    return  0 ;
}
...
Рейтинг: 0 / 0
25.09.2009, 16:59
    #36217930
gogen600
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IConverterSession::MIMEToMAPI ошибка при вызове
Выяснилось, что я допустил ошибку при описании интерфейса IConverterSession.
Согласно справки MSDN http://msdn.microsoft.com/en-us/library/aa192944(office.11).aspx,
описание этого интерфейса должно выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
interface DECLSPEC_UUID("4B401570-B77B-11D0-9DA5-00C04FD65685") 
IConverterSession : public IUnknown
{
	STDMETHOD(placeholder0)() PURE;
	STDMETHOD(SetEncoding)(ENCODINGTYPE et);	
	STDMETHOD(placeholder1)() PURE;
	STDMETHOD(MIMEToMAPI)(LPSTREAM pstm, LPMESSAGE pmsg, LPCSTR pszSrcSrv, ULONG ulFlags) PURE;
	STDMETHOD(MAPIToMIMEStm)(LPMESSAGE pmsg, LPSTREAM pstm, ULONG ulFlags) PURE;	
	STDMETHOD(placeholder2)() PURE;
	STDMETHOD(placeholder3)() PURE;
	STDMETHOD(placeholder4)() PURE;
	STDMETHOD(SetTextWrapping(BOOL fWrapText,ULONG ulWrapWidth)) PURE;
	STDMETHOD(SetSaveFormat(MIMESAVETYPE mstSaveFormat)) PURE;
	STDMETHOD(placeholder5)() PURE;
	STDMETHOD(placeholder6)() PURE;
};

Кроме этого, перед вызовом функции MIMEToMAPI нужно вызвать SetEncoding.
В результате, SetEncoding вызывается нормально, но вот при вызове MIMEToMAPI возникает исключение
"First-chance exception at 0x35655c31 in cpp_CONS.exe: 0xC0000005: Access violation reading location 0x00000000."

В чём может быть дело?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.01.2014, 18:51
    #38528749
Wizard2007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IConverterSession::MIMEToMAPI ошибка при вызове
gogen600,

Чем дело закончилось у вас? Пробовал ваш код модифицировать и брать другое описание интерфейсам
получаю ошибку

Необработанное исключение по адресу 0x52E84414 (OUTLMIME.DLL) в ConsoltTestMimeToMapi.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / IConverterSession::MIMEToMAPI ошибка при вызове / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]