powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / IConverterSession::MIMEToMAPI ошибка при вызове
3 сообщений из 3, страница 1 из 1
IConverterSession::MIMEToMAPI ошибка при вызове
    #36215834
gogen600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь вызвать функцию 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
IConverterSession::MIMEToMAPI ошибка при вызове
    #36217930
gogen600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснилось, что я допустил ошибку при описании интерфейса 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
Период между сообщениями больше года.
IConverterSession::MIMEToMAPI ошибка при вызове
    #38528749
Wizard2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gogen600,

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

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


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