|
I want to use CMimeMessage and other ATL7 classes to create and decode MIME messages and attachments.For example, I want to create a MIME message with a single attachment like:
IMultiLanguage *pLang = NULL;
CoInitialize(NULL);
CMimeMessage msg(pLang);
if(msg.SetSender("visualcdev@hotmail.com"))
if(msg.SetDisplayName("My custom mime message to be displayed in a string"))
{
msg.SetPriority(ATL_MIME_LOW_PRIORITY );
msg.SetSubject("custom subject");
msg.AddText(_T("hello world from a test message you should also end a string like this."));
msg.AddRecipient(_T("amitdey@softhome.net"),"amitdey@softhome.net",0);
msg.AttachFile("C:\\scantastic.bmp");
}
But when I view the contents of the message, by writing it to a file, the message is not a MIME formatted message( I cannot see the headers or anything.
DWORD dwWritten;
DWORD Ret = WriteFile(hFile,&msg,sizeof(msg),&dwWritten,NULL);
message does not have proper MIME headers.How can I use CMimeMessage to create/modify MIME messages?
Thanks.
Hush,hush...
thought I heard you call my name now.
Kula Shaker.
Amit Dey
Latest articles at CP - PocketPC New menu
Office addin
|
|
|
|
|
Hi,
the first part is OK and works. Your problem is in the WriteFile phase. You cannot use the WriteFile as you did, because then you will just save the CMimeMessage class as is in memory. And because CMimeMessage nearly stores only pointers to other classes (body, attachements etc.) you'll see nothing usefull.
The correct way how can you save the message is:
msg.WriteData( hFile, &overlapped );
This method makes more processing, stores also the aggregated classes etc and makes a mime message for you.
Hope this helps
|
|
|
|
|
Yes, the Overlapped i/o did it. Thanks. From the samples I have seen, CMimeMessage is more for composing and sending messages, what about translating/decoding messages and attachments.
Hush,hush...
thought I heard you call my name now.
Kula Shaker.
Amit Dey
Latest articles at CP - PocketPC New menu
Office addin
|
|
|
|
|
Also, if I have a mime-formatted message as an IStream, can I attach it anyway to a CMimeMessage and then use the classes to parse info? How?
TIA.
Hush,hush...
thought I heard you call my name now.
Kula Shaker.
Amit Dey
Latest articles at CP - PocketPC New menu
Office addin
|
|
|
|
|
I don't think that the CMimeMessage is ready for parsing. It was designed for creating the message & sending.
For parsing it will be required to use another class or build your own.
|
|
|
|
|
Interesting. I can see that the ATL7 CMimeMessage creates correct Outlook Express mail files. i.e. .eml format.
Yes, I guess I would have to write a class myself. But it should not be too difficult, esp with all decoding code in the ATL classes that I can use.
Hush,hush...
thought I heard you call my name now.
Kula Shaker.
Amit Dey
Latest articles at CP - PocketPC New menu
Office addin
|
|
|
|
|
I need to copy results of a multimap search to a vector.
Like in the example below, i need the contents of multimap
start -> end into copiedVector (i.e., copiedVector should have 21,22,23)
Can i use copy algorithm here? Any other efficient way of doing this?
multimap <int, int=""> Multimap;
Multimap.insert(pair<int,int> ( 1,11) );
Multimap.insert(pair<int,int> ( 1,12) );
Multimap.insert(pair<int,int> ( 2,21) );
Multimap.insert(pair<int,int> ( 2,22) );
Multimap.insert(pair<int,int> ( 2,23) );
int toFind = 2;
multimap <int, int="">::iterator start = Multimap.lower_bound(toFind);
multimap <int, int="">::iterator end = Multimap.upper_bound(toFind);
for ( ; start != end; start++ )
cout << start->second << endl;
vector<int> copiedVector;
|
|
|
|
|
If you use the copy algorithm, the vector needs to contain the same data as the multimap. This means that the vector has to contain pair data if you use copy.
So, the following works:
<br />
multimap<int,int> myMap;<br />
<br />
myMap.insert( pair<int,int>(1,11) );<br />
myMap.insert( pair<int,int>(1,12) );<br />
myMap.insert( pair<int,int>(2,21) );<br />
myMap.insert( pair<int,int>(2,22) );<br />
myMap.insert( pair<int,int>(2,23) );<br />
<br />
multimap<int,int>::iterator startRange = myMap.lower_bound(2);<br />
multimap<int,int>::iterator endRange = myMap.upper_bound(2);<br />
<br />
vector< pair<int,int> > myVector;<br />
<br />
copy( startRange, endRange, back_inserter(myVector) );<br />
If you want the vector to contain just the second element, you need to use some algorithm other than copy. One way to do this is to use the transform algorithm.
The following is one way to do this:
<br />
struct copysecond<br />
{<br />
int operator()( const pair<int,int>& value )<br />
{<br />
return value.second;<br />
}<br />
};<br />
<br />
<br />
<br />
<br />
vector<int> myVector;<br />
<br />
transform( startRange, endRange, back_inserter(myVector), copysecond() );<br />
|
|
|
|
|
Personally, I would stick with doing it with using the handwritten loop.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
I would probably use a handwritten loop if I was only coding it for a single time. If I need to do it more than once, I would look at using transform.
John
|
|
|
|
|
Hi, I'm trying to host a WTL modeless dialog as a child window in another dialog. My modeless is WTL based and the dialog is not (it is CBuilder).
I did the same with a Win32 modeless and it works fine but although the WTL dialog behaves like a child window I still can see the borders and caption bar. I think I should change the style or declaration in the .rc to have a real control looking dialog.
Below is the code and .rc, please tell me chat's wrong.
btw The _Module is non functionnal has the main message proc is owned by CBuilder so I hooked the Cbuilder message map to get the WH_GETMESSAGE (tips from a code project article) maybe am I missing some other messages ?
class CMyDialog : public CDialogImpl<CMyDialog>, public CUpdateUI<CMyDialog>,
public CMessageFilter, public CControlWinTraits, public CIdleHandler
{
public:
enum { IDD = IDD_DIALOG1 };
CMyDialog()
{
}
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
return IsDialogMessage(pMsg);
}
virtual BOOL OnIdle()
{
return FALSE;
}
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
BEGIN_UPDATE_UI_MAP(CMyDialog)
END_UPDATE_UI_MAP()
LRESULT OnInitDialog(UINT , WPARAM , LPARAM , BOOL& bHandled)
{
CenterWindow();
UIAddChildWindowContainer(m_hWnd);
return TRUE;
}
LRESULT OnCancel(WORD , WORD wID, HWND , BOOL& )
{
DestroyWindow();
return 0;
}
};
and the .rc declaration:
IDD_DIALOG1 DIALOGEX 0, 0, 187, 95
STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT
CAPTION "Hello World WTL"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,7,88,10
CONTROL "Check2",IDC_CHECK2,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,20,84,10
PUSHBUTTON "Button1",IDC_BUTTON1,130,7,50,14
PUSHBUTTON "Button2",IDC_BUTTON2,130,27,50,14
END
I've been working seriously on WTL for a couple of months now and it's really a powerfull framework base.
Of course the above technique works fine with MFC too
Yarp
http://www.senosoft.com/
|
|
|
|
|
I forgot to say the code to create the dialog is rather trivial:
CMyDialog m_myDialog;
m_myDialog.Create(this->hWnd);
Yarp
http://www.senosoft.com/
|
|
|
|
|
yarp wrote:
STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_CAPTION | WS_SYSMENU
The styles in bold are why the dialog has a caption. The styles (in the resource editor) should be Style=Child, Border=None
--Mike--
THERE IS NO THERE IS NO BUT THERE IS
MAGIC PIXIE DUST BUSINESS GENIE CODE PROJECT
Homepage | RightClick-Encrypt | 1ClickPicGrabber
"You have Erica on the brain" - Jon Sagara to me
|
|
|
|
|
Ok, it works fine, thanks a lot Mike - btw I love your articles especially the last one on WTL.
I now have a CBuilder frame and WTL controls inside, cool )
What I don't understand is that I did the same with a Win32 modeless and it was declared as follows:
IDD_TOOLBAR DIALOGEX 0, 0, 103, 63
STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT
CAPTION "Folders"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "&Press This Button",IDC_PRESS,9,19,79,14
PUSHBUTTON "&Or This One",IDC_OTHER,9,38,79,14
END
So I just copy/pasted those settings in my WTL dialog.
Tha fact is the Win32 dialog was hosted in a .dll but it was very simple with no style overriden:
g_hToolbar = CreateDialog((HINSTANCE)g_hModule, MAKEINTRESOURCE(IDD_TOOLBAR),
hWndParent, ToolDlgProc);
if (g_hToolbar != NULL) {
ShowWindow(g_hToolbar, SW_SHOW);
}
I can't understand the difference but it probably lies inside the WTL headers that overrides default Win32 behaviour ?
The fact is declare the Dialog as a child with no border is better because that's what we are loking for.
Thanks again.
Yarp
http://www.senosoft.com/
|
|
|
|
|
I have data in three separate vectors that I want to send over the network using the The Windows Sockets sendto function.
int sendto(
SOCKET s,
const char FAR *buf,
int len,
int flags,
const struct sockaddr FAR *to,
int tolen
);
But it requires a buffer, *buf, containing the data to be transmitted. How would I take the data from three different vectors and do this? Would I have to copy all the data into a new vector and use that vector to in the sendto function?
Thank you
|
|
|
|
|
One solution is memset(). Make sure you allocate enough memory for all three buffers. Use a pointer as a copy initial location.
Kuphryn
|
|
|
|
|
If it is OK for you to use microsoft extensions for winsock2, you can consider to use the WSASendTo function allowing to pass multiple buffers for one call.
|
|
|
|
|
How do I format a double:
0.015625
to look like this:
1.56250000000000000E-02
Using something like:
ofstream out;
out << MyNumber;
(Oh how I miss CString::Format("%.17E", MyNumber) )!
OK, STL zealots, enlighten me!
(BTW: I really don't wanna use sprintf() )
- Nitron
"Those that say a task is impossible shouldn't interrupt the ones who are doing it." - Chinese Proverb
|
|
|
|
|
Nitron wrote:
OK, STL zealots, enlighten me!
Here I am, although this is not STL, it is iostream.
out << scientific << my_number << endl;
Nitron wrote:
Oh how I miss CString::Format("%.17E", MyNumber)
MFC
|
|
|
|
|
How do I set the precision? I need it to be 17.
- Nitron
"Those that say a task is impossible shouldn't interrupt the ones who are doing it." - Chinese Proverb
|
|
|
|
|
Sorry, forgot about that .
cout << scientific << setprecision(17) << 0.015625f << endl;
Be sure to include <iomanip>
|
|
|
|
|
OK. works like a charm. Now 1 last issue:
I get:
x.xxxxE-002
---
|- 3 digits
instead of:
x.xxxxE-02
--
|- 2 digits
personally I wouldn't care, but the legacy lame-a$$ app that I'm supporting appearently does
- Nitron
"Those that say a task is impossible shouldn't interrupt the ones who are doing it." - Chinese Proverb
|
|
|
|
|
hello,
i created a simple atl coclass with a few _bstr_t members. now i try to
initialize the variables. like m_szName = "1".
if i do so in the constructor it does not work, i have five _bstr_t variables,
and assign strings from "1" to "5", but then one variable has the value of another,
i have one missing and one twice, then it get an error if the strings are released,
and, of course, the wrong value is stored.
but if i use the same initializing in the finalconstruct method, it works.
why is that? what can be initialized in the constructor? when should i use
the finalconstruct? are there any other problems with the _bstr_t, where i cannot
use it? except for the ConvertStringToBSTR bug, i read this, but i do not know, if
it is related to my problem?
if someone knows anything, would be very helpful
thanks
enrico
|
|
|
|
|
well, i just compiled the project again, and now it is not working in the finalconstruct either.
i have following variables:
_bstr_t m_szName;
_bstr_t m_szType;
_bstr_t m_szBatch;
_bstr_t m_szPath;
_bstr_t m_szPathExact;
then i call:
m_szName = "1";
m_szType = "2";
m_szBatch = "3";
m_szPath = "4";
m_szPathExact = "5";
and the result is, that the m_szName has the same value as the m_szBatch, the m_wstr value is exactly the same, but the refcount was not incremented.
i debugged the initializing, and found that the third _com_util::ConvertStringToBSTR(s); returns the exact same pointer as the first one. and if i initialize with m_szName = L"1", i get the same result, both ::SysAllocString(s) functions return the same value.
how can that be?
thanks for help
enrico
|
|
|
|
|
Don't know, on my machine it seems to work correctly. It would probably need deeper insight. If your project is only a simple ATL object, just as was created with wizard (is here someone doing that manually?) with added _bstr_t members, it is really weird stuff.
Anyway for your first part questions, difference between constructor and FinalConstruct is in the virtual method calling - inside c-tor the vtable may not be fully constructed, so the call of a virtual method from c-tor can result in a crash. This is because in ATL your class is not the last one in a chain. (in fact your object is a CComObject<CYourClass> type)
For that reason the FinalConstruct was introduced, because it is called after the whole class hieararchy is created.
But for 'simple' initialization of your members it should make nearly no difference (ommiting the fact that from FinalConstruct you can return an error value).
|
|
|
|
|