|
I declared WndProc() as static public function in a form class. It needs to access non-static member function when wparam is DBT_DEVICEARRIVAL.
This non-static function will modify the form panel displaying content. But static member function can only access other static member functions.
How shall I solve this problem???
|
|
|
|
|
(Disclaimer: This is for VC++6.0 and for MFC, and I'm pretty sure that this is not exactly what you use. Anyway, it may give you some ideas.)
(Disclaimer: Untested code)
You have the window handle as a parameter to WndProc, so it's easy to get the MFC C++ class corresponding to the window:
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (wparam == DBT_DEVICEARRIVAL) {
CYourWnd* wnd = (CYourWnd*)CWnd::FromHandlePermanent(hWnd);
if ((wnd != NULL) && (wnd->IsKindOf(RUNTIME_CLASS(CYourWnd))) {
}
}
}
More on-beat C++ programmers will probably object to using the old-style typecasts, but it's safe when checking wnd for NULL and checking the runtime class.
Cheers
Steen.
"Are you gonna check your makeup when you're done whining?" John Simmons, 05/31/2006
|
|
|
|
|
Hi I've got a pretty curious situation occuring in a thread message pump i've written.
The program I've written basically involves a DDE Server passing on messages it receives to a seperate thread using PostThreadMessage with a registered windows message. Two strange things occur: Firstly, whenever a message is sent, two extra messages passing through the pump cause an exception. The messages causing the problem have a decimal value of 1000 (not a message I'm familiar with). Secondly, only ever other message gets through (though this is probably caused by the exceptions).
It's worth noting that this code resides within an ActiveX control, written with VS2003.
<br />
const UINT TM_ON_DDE_MESSAGE = ::RegisterWindowMessage( _T("TM_ON_DDE_MESSAGE"));<br />
<br />
------------------------------------------<br />
::PostThreadMessage(gdwThreadId, TM_ON_DDE_MESSAGE, (WPARAM) pInToWindow, 0); <br />
<br />
------------------------------------------<br />
<br />
gdwThreadId = 0;<br />
ghThread = ::CreateThread( <br />
NULL,
0,
DDEServerThreadFunc,
this,
0,
&gdwThreadId);
<br />
char szMsg[50];<br />
if (ghThread == NULL) <br />
{<br />
wsprintf( szMsg, "CreateThread failed. Unable to receive DDE messages from the Acrobat search plugin" ); <br />
AfxMessageBox( szMsg, MB_OK );<br />
}<br />
<br />
------------------------------------------<br />
<br />
WORD CDDEServer::OnWndThread()<br />
{<br />
MSG msg;<br />
m_keepThreadLoopGoing = TRUE;<br />
while ( ::GetMessage( &msg, NULL, 0, 0 ) != 0 && m_keepThreadLoopGoing) {<br />
if ( !OnThreadProcess( msg.message, msg.wParam, msg.lParam ) ) {<br />
::DispatchMessage( &msg );<br />
}<br />
}<br />
return static_cast<DWORD>( msg.wParam );
}<br />
<br />
BOOL CDDEServer::OnThreadProcess( UINT uMsg, WPARAM wParam, LPARAM )<br />
{<br />
bool bProcessed = true;<br />
if (uMsg == TM_ON_DDE_MESSAGE)<br />
{
if (wParam) {<br />
CCriticalSection threadsafe;<br />
threadsafe.Lock();<br />
OnRunDDECommand( (WINDOW_LUGGAGE*) wParam);<br />
threadsafe.Unlock();<br />
}<br />
bProcessed = true;<br />
} else {<br />
bProcessed = false;<br />
} <br />
return bProcessed;<br />
}
Any ideas or insights would be very welcome.
Thanks in advance
Tom
|
|
|
|
|
Maybe the (WINDOW_LUGGAGE*)wParam pointer in OnThreadProcess is not more valid after you post your custom message? The PostThreadMessage function returns before your receiver processes your message.
|
|
|
|
|
Thanks, I'll look into that.
Tom
|
|
|
|
|
The exception is occuring at the call to ::DispatchMessage( &msg );
curiouser and curiouser.
|
|
|
|
|
MSDN documentation for PostThreadMessage function says that "Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function". Maybe you should not call DispatchMessage ?
|
|
|
|
|
Thank you, would you suggest something like this then
<br />
while ( m_keepThreadLoopGoing ) {<br />
if (::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE) != 0 ) {<br />
if ( !OnThreadProcess( msg.message, msg.wParam, msg.lParam ) ) {<br />
::GetMessage( &msg, NULL, 0, 0 );<br />
}<br />
}<br />
}<br />
Thanks alot
Tom
|
|
|
|
|
My appologies, there should not be a "!" infront of OnThreadProcess
|
|
|
|
|
I want to get the font metrics at runtime for the predefined fonts.
Is it possible. If yes please show me the way.
Thank you
KIRAN PINJARLA
|
|
|
|
|
See there are many api available for get the font metrics.
GetOutlineTextMetrics
GetTextMetrics
|
|
|
|
|
|
hi guys this is rocky,,,,,,
i cant understand one thing please help me to understand that........
check the code .............
// Initialize TAPI
hr = pTapi.CreateInstance((CLSID_TAPI));
hr = pTapi->Initialize();
// Look for the requested line
pEnumAddress = pTapi->EnumerateAddresses();
while ( pEnumAddress->Next(1, &pAddress, &ul) == S_OK )
{
name = pAddress->AddressName;
//if ( name == bstrLine )
//break;
pAddress.Release();
pAddress = 0;
}
// If the line was found, then make a call
if ( pAddress )
{
pCall = pAddress->CreateCall(bstrNumber,
LINEADDRESSTYPE_PHONENUMBER,
TAPIMEDIATYPE_AUDIO);
// Make the call
hr = pCall->Connect(true);
i think what this is doin there are so many numbers are here...........
i want to call only one no example 123456789 lests its hard coded how can i call this no with the above code what change i have to make for this
thnx in advance guys
Best Regards
Rocky
|
|
|
|
|
1. how can i find out if there is any file(s) under a certain directory
2. how can i simply copy a directory from 1 location to the other
thanks in advanced
Yaron
Interface basics click here :
http://www.codeproject.com/com/COMBasics.asp
don't forget to vote
|
|
|
|
|
YaronNir wrote: how can i find out if there is any file(s) under a certain directory
Check out FindFirstFile(..)
YaronNir wrote: how can i simply copy a directory from 1 location to the other
You have to do it...
Use FindFirstFile(..) and FindNextFile(..) to know the files and sub-directories in the folder and duplicate the same in the source location (ie., read the content and open a file with the name in the source location and write the content as on..)
Do your Duty and Don't expect the Result
|
|
|
|
|
YaronNir wrote: 2. how can i simply copy a directory from 1 location to the other
For moving directories, you can use MoveFile() or MoveFileEx()
For copying directories, you can use CopyFile() or CopyFileEx()
-- modified at 8:01 Thursday 10th August, 2006
|
|
|
|
|
I guess he is intrested in copy the file..
if so use CopyFile(..) or CopyFileEx(..)
right now i found these APIs
Do your Duty and Don't expect the Result
|
|
|
|
|
You are right, the question is about copy a directory, not to move it. Sorry
|
|
|
|
|
For #1 - try PathIsDirectoryEmpty(...) since you asked about finding if any files exist, not how to enumerate them. This function also does the right thing by ignoring the . and .. directories.
For #2 - MoveFile(...) , MoveFileEx , and SHFileOperation(...) can all move directories. Which one you use depends on what kind of directory, how it needs to be moved, and where (same drive, same machine, or different ones).
-- modified at 7:55 Thursday 10th August, 2006
Doh! As WhiteSky pointed out, you asked about Copying a directory. SHFileOperation can copy an entire directory, but the other two functions I suggested cannot (at least, not without tricking the system under certain situations).
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
I think he needs to CopyFileEx instead MoveFile
|
|
|
|
|
Doh! Copy! You are correct! Post updated.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
|
will try that!
thanks
Yaron
Interface basics click here :
http://www.codeproject.com/com/COMBasics.asp
don't forget to vote
|
|
|
|
|
FO_COPY instead FO_MOVE in SHFileOperation(&foperation)
|
|
|
|
|
James R. Twine wrote: ...not without tricking the system under certain situations).
What tricks are involved?
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|