|
I would put a breakpoint inside LoadLibraryW (and friends) and try to get a call stack of the code which loads "winmm.dll".
Steve
|
|
|
|
|
Good idea. Tried it, but the call stack doesn't tell me that much:
<br />
KERNEL32! 7c80acd3()<br />
COMCTL32! 5d0f0541()<br />
COMCTL32! 5d0f08a0()<br />
COMCTL32! 5d097aae()<br />
USER32! 77d48709()<br />
USER32! 77d487eb()<br />
USER32! 77d4c00e()<br />
USER32! 77d4c034()<br />
esListVw::OnMessage<br />
The bottom one is my own code, calling CallWindowProc(...) in response to a WM_LBUTTONDOWN .
I think this is spooky. I would feel more comfortable if the app just crashed ...
Btw, tried to remove all custom stuff from the control (subclassing and responding to WM_NOTIFY's), but the multimedia DLL's get loaded anyway at first click (left or right mouse button doesn't matter, same behaviour if tabbing to the label).
Any idea on how to move forward? I'm stuck.
Thanks
|
|
|
|
|
Don't use MSVC6 to get the stack. Use WinDBG. You can get it from here[^]. Configure the symbol path (in the "File" menu) with this string:
SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
You will need an internet connection. This will cause WinDBG to download symbols as needed from Microsoft and store them on your machine at "C:\Symbols". With these symbols you will get a more meaningful stack trace. You can issue the "kvn 1000" command to get a stack trace to send.
Steve
|
|
|
|
|
Hehe, was hoping for that magical non-documentet extended style LVS_EX_NOAUDIO
The call stack looks like this:
<br />
LoadLibraryW<br />
CCPlaySound<br />
ListView_HandleMouse<br />
ListView_OnButtonDown<br />
ListView_WndProc<br />
InternalCallWinProc<br />
UserCallWinProcCheckWow<br />
CallWindowProcAorW<br />
CallWindowProcW<br />
esGridCtrl<br />
Any ideas? Have been using quite a few list views over the years, but this is a total mystery to me.
[Have been away a few days, hoping thread is not dead]
|
|
|
|
|
Can you send more info. i.e. The total info when you enter "kvn 1000" in WinDBG. For examaple where in ListView_HandleMouse did CCPlaySound get called. Also if you issue the "lmv" the results would be useful.
Steve
|
|
|
|
|
Ok, really nice of you to walk me through this. Sorry about late reply, have to do some "real" work as well
<br />
0:000> kvn 1000<br />
# ChildEBP RetAddr Args to Child <br />
00 0012f408 5d0c3011 5d0c3070 00000000 00000000 kernel32!LoadLibraryW (FPO: [Non-Fpo])<br />
01 0012f890 5d0f0541 5d0bd028 001e0020 00145690 COMCTL32!CCPlaySound+0xaf (FPO: [Non-Fpo])<br />
02 0012f904 5d0f08a0 0003056e 00000000 00000020 COMCTL32!ListView_HandleMouse+0x24d (FPO: [Non-Fpo])<br />
03 0012f924 5d097aae 00145690 00000000 00000020 COMCTL32!ListView_OnButtonDown+0x1b (FPO: [Non-Fpo])<br />
04 0012faa4 77d48709 0003056e 00000201 00000001 COMCTL32!ListView_WndProc+0x70c (FPO: [Non-Fpo])<br />
05 0012fad0 77d487eb 5d09637c 0003056e 00000201 USER32!InternalCallWinProc+0x28<br />
06 0012fb38 77d4c00e 00000000 5d09637c 0003056e USER32!UserCallWinProcCheckWow+0x150 (FPO: [Non-Fpo])<br />
07 0012fb68 77d4c034 5d09637c 0003056e 00000201 USER32!CallWindowProcAorW+0x98 (FPO: [Non-Fpo])<br />
08 0012fb88 004039dd 5d09637c 0003056e 00000201 USER32!CallWindowProcW+0x1b (FPO: [Non-Fpo])<br />
the lvm output can be found here: http://www.esaro.se/lvmoutput.txt
Nothing suspicious as far as I can tell, however, my experience with WinDbg is somewhat limited ...
/M
|
|
|
|
|
Does it do this when your program is *not* under the control of a debugger? There could be additional DLLs loaded when you are debugging.
Some part of your program is loading those DLLs. Maybe a 3rd-party system-wide hook has injected into your program? See what 3rd-party DLLs are in your address-space by listing all DLLs in your program (do a 'Module List' in VS when debugging).
I would also use DependencyWalker[^] to see what your program's dependencies are.
James
http://www.catch22.net
|
|
|
|
|
Same thing happens when not debuggin. No 3rd party DLLs as far as I can see. Something is seriously wrong here. Made a blank MFC project with a list view (report style), same behaviour.
|
|
|
|
|
I have override the CMyDialog::PreTranlateMessage() and traslate VK_DOWN to VK_TAB, but how can I translate VK_UP to VK_SHIFT + VK_TAB?Thanks
|
|
|
|
|
Why would you want to? An easier way would be to call CDialog::NextDlgCtrl() and CDialog::PrevDlgCtrl() depending on which arrow key is pressed.
You may be right I may be crazy -- Billy Joel --
Within you lies the power for good, use it!!!
|
|
|
|
|
sendinput
|
|
|
|
|
I'm linking unicows to my app to have a single unicode exe that also runs on Win9x.
Everything works fine but if the unicows.dll is not present the app crashes at startup.
I would like to avoid this and give the user a message that he needs the dll.
|
|
|
|
|
If you linked unicows.dll implicitly (using an import library), then you can't detect that the DLL is not present yourself. The Windows loader is looking for it at startup.
You can correct this in one of two ways.
First, you can set a linker option to delay load unicows.dll . When you do this, the DLL isn't loaded until the first call to it. You can then check in your startup logic, before the first unicows call, and issue an error message. Look in the MSDN for /DELAYLOAD .
Secondly, you can use the LoadLibrary() and GetProcAddress() mechanism to explicitly load the library.
Software Zen: delete this;
|
|
|
|
|
Unicows already uses delay-loading (not really delay-loading but a similar technology) and only loads the DLL on Win9x systems.
Also if the Windows loader can't find a DLL the user gets a message box and the app doesn't crash.
Seems like I have to override the unicows loader because otherwise MFC initialization crashes.
|
|
|
|
|
Hi Friends
How to get Serial No of computer processor in Visual C/C++
Thanx in advance
KK
|
|
|
|
|
|
That only owrks on the PIII.
I fell victim to trying that a couple of years ago. Don't waste your time with it. Intel pulled that capability after a massive uproar. Try it on a P4 and you'll see what I mean.
WMI will give you other hardware information like Motherboard serial, Bios serial, etc...
|
|
|
|
|
|
|
Hi
thanx for your information
Regards
KK
|
|
|
|
|
Hello all.
I am currently working on an application which requires to add new fonts in Fonts folder in Windows directory. I am copying the new fonts in the Fonts folder programatically. According to my knowledge I need to open and then close the Fonts folder to Register the newly added fonts with OS.
To register these fonts I am opening the Fonts folder from my application by using following code snippet
STARTUPINFO si;
PROCESS_INFORMATION pi;
LPTSTR szCmdline=_tcsdup(TEXT("C:\\WINDOWS\\explorer.exe c:\\windows\\fonts"));
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if(!CreateProcess( NULL,szCmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi ))
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
I just have to wait for say 2 secons after opening the Fonts folder to register new fonts. So after opening the folder I am using following code to wait for 2 secs and close the child process and thus the Fonts foloder that I have opened through that child process.
HANDLE handle = pi.hProcess;
Sleep(2000);
int i = ::TerminateProcess(handle,0);
if (0 == i)
{
DWORD err = GetLastError();
}
While debugging I found that the TerminateProcess() function fails and GetLastError() returns value 5.
Is there something that I am not doing properly?
Why the TerminateProcess() is failing?
Please guide me.
Rakesh
|
|
|
|
|
error 5 is "access denied"
Has the process already terminated by itself?
Suggestion:
Try adding GetExitCodeProcess() to the code before TerminateProcess() to check
cheers,
Neil
|
|
|
|
|
check this
<br />
CWnd *pWnd=FindWindow(0,"Fonts");<br />
pWnd->PostMessage(WM_CLOSE);<br />
whitesky
|
|
|
|
|
Thankyou very much....
Such a nice and effective way you have suggested.
It worked as per my requirement..
Thanks again.
Rakesh
|
|
|
|
|
Hey but there is one issue.
If I change the settings from Control pannel
1. Not to Display the full path in title bar
2. To Display the full path in title bar
then the proposed solution doesn't work properly. I need to change the Text from
FindWindow(0,"C:\\Windows\\Fonts)
to
FindWindow(0,"Fonts")
Is there any solution for this ? Please help.
Thanks
Rakesh
|
|
|
|