|
I had no problem with:
_bstr_t *arr = new _bstr_t[10];
BSTR bstrName = L"Howard";
arr[0] = L"string_one " + _bstr_t(bstrName) + L" string_three";
arr[1] = L"string";
arr[2] = L"Moe";
arr[3] = L"Larry";
arr[4] = L"Curly";
TRACE("%s\n", (char *) arr[0]);
TRACE("%s\n", (char *) arr[2]);
TRACE("%s\n", (char *) arr[4]);
|
|
|
|
|
Me neither.
I checked the memory again and there are differences between creating _bstr_t using SysAllocString and not using it.
Not using SysAllocString has overwritten one of my other variables! That seems to be THE problem. Is there an easy way how to Alloc and Free all the variables regarding the internally use of pointers (_bstr_t wrapper class)?
I need to create long strings out of smaller ones. The length is variable.
|
|
|
|
|
Hi guys
How can I manage the right click message in a CListBox Control?
Best Regards
Dr.Pi
|
|
|
|
|
subclass it and handle it's WM_RBUTTONDOWN message
|
|
|
|
|
Oh , stupid of me. It was really easy.
Thanks a lot
Dr.pi
|
|
|
|
|
now it's me who has a question...
i need some information on how to retrieve the hardware's name by irq or the other way round!
any1 got an idea?
thx for every answer
Don't try it, just do it!
|
|
|
|
|
AFAIK,
Either you do it the no-brains VB-way and use WMI, or you do it the more low-level DDK way using... well, the NT Object API (not sure if that' documented though - you might need to go undocumented).
AFAIK there is no Win32 way (if you want to, you might read that as "MS never considered us Win32 developers 'worthy' to know this").
Sorry for the bad news, even that this is only AFAIK. Sucks, doesn't it.
|
|
|
|
|
lol, i won't do this the vb way of course
i'll check the kernel's api, maybe i'll find a useful one..
thx 4 you answer
Don't try it, just do it!
|
|
|
|
|
muhaha, i've just found a way!
there are some registry keys for it!
Don't try it, just do it!
|
|
|
|
|
I am attempting to write a simple MFC application that can pass user defined messages across classes.
I start a new MFC app and created 2 classes via classwizard, say CSendClass and CReceiveClass (both derived from generic Cwnd). To create the user-defined message stuff, I:
1. add the line "#define WMU_FUN_MSG (WM_APP + 20)" to stdafx.h (making it global)
2. Add the line "ON_MESSAGE(WMU_FUN_MSG, OnFunMessage)" in CReceiveClass.cpp, inbetween the lines BEGIN_MESSAGE_MAP(CReceiveClass, CWnd) and END_MESSAGE_MAP()
3. Add the line "afx_msg LRESULT OnFunMessage(WPARAM wParam, LPARAM lParam)" in CReceiveClass.h, just before DECLARE_MESSAGE_MAP()
4. Add the following message handling function to the end of CReceiveClass:
LRESULT CReceiveClass::OnFunMessage(WPARAM wParam, LPARAM lParam){
MessageBox("In WMU_FUN_MSG handler", NULL, MB_OK);
return 0;
}
Now that all the Message Handler stuff resides in CReceiveClass, I add the following line to the constructor of CSendClass:
"PostMessage(WMU_FUN_MSG, 0, 0);"
Finally, I added the following two lines to the Dialog Box's OnCreate Function:
CReceiveClass obj1; //Create instance of the receiving class
CSendClass obj2; //Create an instance of the sending class
Ideally, this is what the program should do:
1.. Program starts, creates CReceiveClass obj1 and CSendClass obj2.
2. In constructor for CSendClass obj2, PostMessage() is called, send a user defined message
3. CReceiveClass's message handler function is called, printed a MessageBox to the screen.
Unfortunately, it doesnt work that way. My program crashes when it gets to the PostMessage command, displaying a "Debug Assertion Failed!" dialog box. Because of this, my MessageBox is never displayed.
Any insight you can give would be most appreciated.
-Joel L.
Joel L.
|
|
|
|
|
Joel Lipschultz wrote:
"PostMessage(WMU_FUN_MSG, 0, 0);"
For user defined messages, I have found that this line should be:
PostMessage (WM_COMMAND, WMU_FUN_MSG, 0);
Dave
"You can say that again." -- Dept. of Redundancy Dept.
|
|
|
|
|
no change, my program still crashes. Thanks anyways.
Joel L.
|
|
|
|
|
Not sure about that. In this case you'll have to manage ON_COMMAND handler and no more ON_MESSAGE !!
But you can use PostMessage(WMU_FUN_MESSAGE,0,0) if you want!
|
|
|
|
|
cedric moonen wrote:
But you can use PostMessage(WMU_FUN_MESSAGE,0,0) if you want!
his message handler isn't in the same window, he has to use
::PostMessage(m_hWnd_of_CReceive, WMU_FUN_MESSAGE,0,0);
When he's checked ASSERT(::IsWindow(::FromHandle(m_hWnd_of_CReceive)));
|
|
|
|
|
Joel Lipschultz wrote:
Unfortunately, it doesnt work that way. My program crashes when it gets to the PostMessage command, displaying a "Debug Assertion Failed!" dialog box. Because of this, my MessageBox is never displayed.
Any insight you can give would be most appreciated.
You have given no information about the assertion (i.e., file, line). Have you stepped into the PostMessage() function to see what is happening?
|
|
|
|
|
I stepped into the PostMessage() function, and it crashes in the afxwin2.inl file on line 41:
{ASSERT(::IsWindow(m_hWnd)); return PostMessage(m_hWnd, message, WPARAM, LPARAM);}
Joel L.
|
|
|
|
|
Which means the window you are trying to post the message to is invalid.
|
|
|
|
|
OK... here's where the MFC abstraction fails
Win32::PostMessage puts a message for a HWND ("Windows Window") into the message queue.
MFC::CWnd::PostMessage does that for the HWND wrapped by CWnd instance.
In the constructor of CSendClass, the HWND is not yet created - hence you get an ASSERT in the PostMessage call.
1st question: Are you sure you need PostMessage?
2nd question: Why two classes (send ¨ receive), why postmessage, what exactly are you trying to do?
"Der Geist des Kriegers ist erwacht / Ich hab die Macht" StS
sighist | Agile Programming | doxygen
|
|
|
|
|
In answer to your first question, I want to eventually be able to pass user-defined messages between UI threads. I need to use PostMessage(), as (I think) SendMessage could result in deadlock.
In answer to your second question, I thought it would be easier to figure out how to pass a user-defined message between two regular classes. Once I have that mastered, I was going to try the same procedure with UI threads (i.e. each thread is a separate class).
Joel L.
|
|
|
|
|
Joel Lipschultz wrote:
Now that all the Message Handler stuff resides in CReceiveClass, I add the following line to the constructor of CSendClass: "PostMessage(WMU_FUN_MSG, 0, 0);"
::PostMessage((CReceiveClass*)->m_hWnd, WMU_FUN_MSG, 0, 0);
The way you have it, you're sending the message to "this"
|
|
|
|
|
I tried adding the line you suggested, and it gave me the following syntax error:
error C2059: syntax error : "->"
Is there another way that I can get a handle to my CReceiveClass?
Joel L.
|
|
|
|
|
I didn't mean for you to literally add that line, that was just a template like example where you're supposed to replace the CReceive* with the actual pointer to the other window.
That or you can just pass the handle directly in the constructor of the send window
in header
public:
CSend(CWnd* pParent = NULL, HWND h_recievewnd = NULL); // standard constructor
in implementation
CSend::CSend(CWnd* pParent, HWND h_recievewnd)
{
ASSERT(h_recievewnd);
ASSERT(::IsWindow(::FromHandle(h_recievewnd)));
::PostMessage(h_recievewnd, WMU_FUN_MSG, 0, 0);
}
Of course you should make sure and Create CReceive first to get the handle to pass to the constructor of CSend
|
|
|
|
|
Joel Lipschultz wrote:
I start a new MFC app and created 2 classes via classwizard, say CSendClass and CReceiveClass (both derived from generic Cwnd). To create the user-defined message stuff, I:
Joel Lipschultz wrote:
I add the following line to the constructor of CSendClass:
Further more you should do ::FromHandle on your CReceive HWND and then ::IsWindow() to make sure the window has been created and the Message Proc has been started. If ::IsWindow is NULL you can not send messages.
You definately should put that elsewhere than the constructor of the other CWnd if they are created "at the same time"
|
|
|
|
|
First of all, thanks for your help. I stepped into the PostMessage function and the Program crashes on the following line, in afxwin2.inl, line 41: (basically what you suspected)
{ASSERT(::IsWindow(m_hWnd)); return PostMessage(m_hWnd, message, WPARAM, LPARAM);}
Given that the program fails when IsWindow returns false -- what would you recommend doing? You mention putting the PostMessage() call in somewhere other than the constructor, but I don't know where else to put it. I tried the Destructor, and it gives the same result.
I am just starting to learn MFC, so please be as descriptive as possible. I appreciate it.
Joel L.
|
|
|
|
|
I did as you suggested, and now the program doesn't go into the if statement (i.e. receiveClass->handle equals NULL).
Joel L.
|
|
|
|
|