|
Hi,
I have a SDI application in which I create 2 extra threads. Using the debugger I get the following error intermittently:
Unhandled Exception at 0x77e6d756 in Application.exe: Microsoft C++ exception: _com_error @ 0x02a3f44
Then the file comip.h is opened and the following bit of code generates the afore-mentioned error:
HRESULT hr = CreateInstance( str, pOuter, dwClsContext );
The value of hr is 0x800401f0 CoInitialize has not been callled.
If anyone has any clue what is going on here, feel free to let me know.
I thank you for any suggestions.
Regards
Rui
|
|
|
|
|
If you access any COM objects or make any calls to COM functions you must first call CoInitialize() at the beginning of each thread.
Roger Stewart
"I Owe, I Owe, it's off to work I go..."
|
|
|
|
|
Thanks,
I forgot to add that I do have queries to a dB in my threads and yes I do have
CoInitialize( NULL );
at the beginning of the function called by the thread.
Unless the CoInit is at the wrong place.
I would also like to add that I am running my code in debug and the error does not always occur. It appears randomly and this is what is puzzling me.
Thanks
regards
Rui
|
|
|
|
|
I am using a CTreeCtrl and need to set up images for each Node in the CTreeCtrl .
i am doing the following
1. Setting up an ImagelIst as
CImageList images;<br />
images.Create(IDB_BITMAP1,10,5,1);<br />
m_tree.SetImageList(&images,TVSIL_NORMAL);
2. I insert this way :
HTREEITEM h_node=m_tree.InsertItem(ObjectName.c_str(),1,1,h_parent );
I find that the Image isnt getting displayed , although space is alloted for the size of the image !!
Please help
|
|
|
|
|
You've forgot to add
m_tree.SetItemImage(h_node,nImage,nSelectedImage);
Dmitry Timin
|
|
|
|
|
Hi,
I would like to create a code viewer which would take care of precompiler instructions (such as #define and #ifdef), that is, a viewer that shows only the code which is _really_ being compiled. Since i do not want to reinvent the wheel, do you know about a software already doing this ? Do you know about a place where i could find the sourcecode of a compiler (since i'll have to interprete the #if commands and so on) or anything that would help ?
Thanks a lot,
~RaGE();
|
|
|
|
|
In case this is for your own use as a MSDEV developer, then you should simply use MSDEV:
cl /EP sourcefile.cpp > output.tmp
(type "cl /?" on the command line for a list of options)
You may notice the output file (e.g. "output.tmp") contains long series of empty lines, owing to the fact that the MSDEV preprocessor doesn't strip those.
Again, use a free tool to join subsequent empty lines into one:
more /S output.tmp > output.lst
For example, I use the above tools to run the proprocessor through some XSLT source files that are part of a C++ project. In MSDEV, I create a custom build step like this:
cl /EP /DXSL /I$(ProjDir) /I$(ProjDir)\..\include $(InputPath) > $(IntDir)\$(InputName).xso
more /S /T4 $(IntDir)\$(InputName).xso > $(ProjDir)\tools\$(InputName).xsl
(takes input file, also specifies two include directories, creates intermediate *.xso file, merges multiple subsequent empty lines, replaces tabs with spaces (tabwidth 4), and leaves the result in tools\*.xsl.
Works fine for me.
Bernd
|
|
|
|
|
I'll give it a try. Thanks a lot.
~RaGE();
|
|
|
|
|
Hi all,
When I use 'custom' messages, how can I ensure that they are unique? Let's say I write a static library and I define some messages in there, in the range WM_USER + 100 up to WM_USER + 500. How can I ensure that they do not collide with messages in the same range in the program that will use my library? I know about RegisterWindowMessage, but according to MSDN that should only be used for ipc. Thanks in advance.
|
|
|
|
|
Never ever use WM_USER it was overused by some MFC controls so this
is no longer a save base value.
Instead use WM_APP as base for user defined messages.
Yours,
Alois Kraus
Siemens Medical Solutions
|
|
|
|
|
roel_v wrote:
I know about RegisterWindowMessage, but according to MSDN that should only be used for ipc
Huh? Where does it say that?
MSDN states that RWM are especially useful for inter process communiaction, but can be used anywhere.
In fact, I think they should.
But as an altertnative you have WM_APP+x.
For more info, please read the article about WM_USER. It has some clear guidelines when to use WM_USER, WM_APP and RWMs.
"My opinions may have changed, but not the fact that I am right."
Found in the sig of Herbert Kaminski
|
|
|
|
|
Huh? Where does it say that?
From ms-help://MS.MSDNQTR.2002JUL.1033/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/registerwindowmessage.htm
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF.
But I must say that not all of the documentation states it explicitly as here. Anyway, I'm off to read the WM_USER article now
|
|
|
|
|
You are right - it says explicitly 'only for inter application communication'.
But I can assure you that RWMs work even within an application
Maybe RegisterWindowMessage() has a large overhead or uses limited resources?
--
"My opinions may have changed, but not the fact that I am right."
Found in the sig of Herbert Kaminski
|
|
|
|
|
I thought that MSDN was basically outdated on this, and that there was no reason not to use RWM's. In fact, they are the only way to guarantee a unique id.
-Alex
|
|
|
|
|
RegisterWindowMessage(...)
Should save your life
Roger Allen
Sonork 100.10016
In case you're worried about what's going to become of the younger generation, it's going to grow up and start worrying about the younger generation. - Roger Allen, but not me!
|
|
|
|
|
Read Joseph Newcomer's article, Message Management[^], here on CP concerning this topic. It has a section on generating unique message id's that is very useful.
Roger Stewart
"I Owe, I Owe, it's off to work I go..."
|
|
|
|
|
If I do the following I get "equal" in MFC:
CString c1 = "abc";
CString c2 = "def";
CString c3 = "abcdef";
CString c4 = c1+c2;
if(c4 == c3)AfxMessageBox("equal");
But my Java book says that in java this is not equal. So shall I assume its because strings have different rules in these two cases?
When you say 'the references to the strings are being compared, not the strings themselves", what is meant by the word "reference' . Does it mean the address?
Thanks,
Appreciate your help,
ns
|
|
|
|
|
Yes, it sort of means the address. It means that it check if the two strings are the same strings in memory, in other words, if they are in the same physical memory locations. While the CString == operator is overloaded to compare the actual string contents.
|
|
|
|
|
Ah! Thanks. So CString has more functionality in that it does what one actually needs it to . I wonder what you use == in java for. To check memory locations for whatever reason I suppose. How woukd we do that in MFC if we needed to?
Appreciate your help,
ns
|
|
|
|
|
Well it's true that most of the time you want to compare string values, but it's just to keep everything consistent. When you compare 2 char*'s in C, you compare the addresses there, too:
char* str1 = "Hello";
char* str2 = "Hello";
if(str1 == str2) printf("This line won't be printed\n");
if(!strcmp(str1, str2)) printf("This line will be printed\n");
And in mfc you can just check the addresses of the cstring:
&cstring1 == &cstring2, or I think you can cast them to LPCSTR's, and then you will get a pointer to the internal CString buffer. All of this fully untested ofcourse
|
|
|
|
|
I see that you're confusing some basic principles of memory allocation in C++ vs. Java. In C++ objects (such as CString) can be allocated on the stack or on the heap.
CString s1 = "abc";
CString s2 = "def";
CString* ps1 = new CString("abc");
CString* ps2 = new CString("def");
When you allocate an object on the stack, the variable that you get represents the actual memory block that it takes to hold it. So s1 is the block of memory that holds "abc" and all the members of the object. And &s1 is the address of that block of memory. When you say (s1 == s2), you're comparing the blocks of memory themselves. When you say (&s1 == &s2) you're comparing the address of the blocks of memory.
When you allocate on the heap, the new operator gives you back the address of the block of bytes where the object is allocated -- basically the equivalent of &s1 . When you say (ps1 == ps2), you're comparing the address of the blocks of memory. When you say (*ps1 == *ps2) you're comparing the blocks of memory themselves.
In Java, there's the String object which you can create like this:
String rs1 = "abc";
String rs2 = new String("def");
Either way you do it, you always end up with the equivalent of ps1 and ps2 -- in other words, rs1 basically hold the address of the block of bytes where the actual String is allocated. In Java rs1 and rs2 are called references. In C++, ps1 and ps2 are pointers. So, like in C++, if you say (rs1 == rs2), you're comparing the address of the blocks of memory, not their content. To compare their content you can use the equals method of the String class.
I hope this shed some light on the issue.
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
Hello,
I just can't find how to access my current Doc or View class from my Dialog. I have a simple document application, and my dialog is a toolbar (http://www.codeproject.com/miscctrl/rollupctrl.asp). If I click on a button of my toolbar, it executes :
void CFooDlg::OnButtonMyAction()
So I want here to access my current document, update it, and then update the view.
It looks like a very basic question, but I can't figure out how to do that.
Thank you for your help,
loic
|
|
|
|
|
If your dialog is a toolbar, wht you shoukld do is handle the action (button pressed, or other) on your doc class. You can use the class wizard for that, or you can do it by hand and add an entry on the DOC message map to catch the action.
Good luck.
Hernan
|
|
|
|
|
thx, I will do that through the associate view, so I can easily manage the redraw of the data.
loic
|
|
|
|
|
Easier and better if you do that in the document and then call
UpdateAllViews(NULL);
|
|
|
|