|
thank you for the anwser.
|
|
|
|
|
As JohnCz said, use a manifest file. The manifest needs to specify using the Common Control 6.0. Here's a sample (change the app name as you see fit):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.1" processorArchitecture="X86" name="KRM.Undecorate" type="win32" />
<description>Undecorate a C++ name.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
thank you for the anwser,but your way can't solve my question.
|
|
|
|
|
Strange. It is working for me...
Did you follow all steps?
Perhaps if you explained all steps you have taken it would explain why it does not work.
What is the name of your application?
What is the name of your manifest file.
Did you copy manifest text from Karl’s post?
Directory where did placed manifest file.
JohnCz
MS C++ MVP
|
|
|
|
|
Hi,
Given a Mapped Drive i.e.'F:\' Is itpossible to recover the Server Name and Path .
Regards,
Bram van Kampen
|
|
|
|
|
I thought the information was available in the 'Netshare' API's - these days its likely to be available through WMI as well - if only a bit more convoluted to access
'g'
|
|
|
|
|
|
You also can read the RemotePath key in HKEY_CURRENT_USER\Network\DRIVE_LETTER to get the mapping information
|
|
|
|
|
Thanks for that info - filed away for future use
'G'/Remote/via Blackberry
|
|
|
|
|
Thanks.
I used this to write an "API" as follows:-
<br />
SGAPI BOOL GetUNCA(LPCSTR DriveSpec, LPSTR pstrResult,LPDWORD pcbSize){<br />
if((DriveSpec==NULL)||(pstrResult==NULL)||(pcbSize==NULL)){<br />
SetLastError(ERROR_INVALID_PARAMETER);<br />
return FALSE;<br />
}<br />
if(strlen(DriveSpec)!=3){<br />
SetLastError(ERROR_BAD_FORMAT);<br />
return FALSE;<br />
}<br />
if((DriveSpec[1]!=':')||(DriveSpec[2]!='\\')){<br />
SetLastError(ERROR_BAD_FORMAT);<br />
return FALSE;<br />
}<br />
<br />
char ch=toupper(DriveSpec[0]);<br />
if((ch<'A')||(ch>'Z')){<br />
SetLastError(ERROR_BAD_FORMAT);<br />
return FALSE;<br />
}<br />
CString SubKey="Network\\";<br />
SubKey+=ch;<br />
<br />
HKEY hkResult;<br />
if(RegOpenKeyExA(HKEY_CURRENT_USER,SubKey,NULL,NULL,&hkResult)!=ERROR_SUCCESS){<br />
<br />
SetLastError(ERROR_INVALID_CATEGORY);<br />
return FALSE;<br />
}<br />
<br />
DWORD Type=REG_SZ;<br />
DWORD dwRes=RegQueryValueExA(hkResult,"RemotePath",NULL,&Type,(LPBYTE)pstrResult,pcbSize);<br />
RegCloseKey(hkResult);<br />
<br />
if(dwRes==ERROR_SUCCESS)return TRUE;<br />
<br />
SetLastError(ERROR_INVALID_CATEGORY);<br />
<br />
return FALSE;<br />
}<br />
One of the Things is: How do those Subkeys Translate in Foreign Languages... ???
Thanks A lot for the Info
Bram van Kampen
|
|
|
|
|
hmmm!
GetUNC is a Commandline Utility. Maybe as a Last Resort.
Thanks for your comment though.
Regards,
Bram van Kampen
|
|
|
|
|
the CNetservice I showed from CodeGuru is NOT a command line utility - why would I have shown you something sooo useless, hmmmm ???
If you look for CNetService by Jay Wheeler, and get the download, you'll see GetUNC() uses APU WNetGetUniversalName
I was thinking one of is crazy, glad its not me, ok, for once
'g'
|
|
|
|
|
Hi,
Garth J Lancaster wrote: the CNetservice I showed from CodeGuru is NOT a command line utility - why would I have shown you something sooo useless, hmmmm ??
Well, that's what the link appeared to be pointed to. I asked myself the same question.
Garth J Lancaster wrote: If you look for CNetService by Jay Wheeler, and get the download, you'll see GetUNC() uses APU WNetGetUniversalName
I was thinking one of is crazy, glad its not me, ok, for once
Well maybe the gremlins...
Found that site, its very usefull.
Thanks.
Bram van Kampen
|
|
|
|
|
|
Bingo!
Just the Ticket. Thanks.
As a Side Line, The MS Windows API is growing that wide that even googeling, or MSDN becomes difficult, if you don't remember the name of an API in the first place. Many of the 10,000 or so Microsoft engineers seem to be having the same problem. They have another weapon though, access to the windows code, and it occurs to me that if they cannot find quikly what they need, that they just introduce another API to add to the pile.
In the mean time I wrote:
<br />
SGAPI BOOL GetUNC(LPCSTR DriveSpec, LPSTR pstrResult,LPDWORD pcbSize)<br />
based on the previous replies. That was not difficult, but WNetGetUniversalName() is more universal, and less likely to break in future versions.
Thanks,
Bram van Kampen
|
|
|
|
|
rats - he beat me to it - see my prev response - lest you got there in the end - have fun
'g'
|
|
|
|
|
Hi,
BTW.
That Reg Entry. If you delete that, does that 'Undo' Drive mapping. I know of no way to 'Unmap' a drive in XP. Does not bother me much, I never realy use this 'Drive Mapping Feature' I personally think that it is a leftover from the DOS days, (maybe you don't remember those)
Those where the days that God was with us in Paradise, and all of us had Floppies. Lo and Behold, Someone invented the CD. Everybody took a step back and admired in awe, and all those guru's, came up with further int14's and complicated code, to assign those horrid things a drive letter, using a device called MSCDEX, etc. Afterall, DOS could only deal with Block devices if they had a Drive Letter, so a drive letter it got.
Then some Nasty bugger invented Networking! Not to worry, MS had already a Mechanism to map Drives... Just another Interrupt, And, Presto, we had 'Share', with, guess it... A Drive Letter!
Me thinks, No real need for all that crap. UNC Names are about as good as it gets.
The problem occurs, where XP supports this anachronism. Some of my customers use Network Shares assigned to a Mapped Drive. Over Time, Things break, and I have to unravel the mess in a Fix, but, Idealy trap it during the Setup.
Thanks for your Contribution.
Regards
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: I know of no way to 'Unmap' a drive in XP
chuckle - in the old days it used to be (command line)
net use drive: path to map
net use drive: /delete to unmap/delete
still works on xp last time I looked - I suspect (going back to the 'NetShare API' you can do it programmtically through them as well)
shows ya what an ol' fart I am - but willing to learn new tricks, like as you suggest, deleting that reg entry - didnt know that one
'g'
|
|
|
|
|
In the case we setting WM__TIMER to the small value for example 20 msec that mean the thread will work on OnTimer function every 20 msec.
Assume that, during the thread work on the first period time message in OnTimer function but still not finish, then the second period time message overlap happen so that this message should wait for the first message finish before it continue.
Again assume that, the first message not finish and the second message wait for first message, then the third period time message happen.
How windows manage this situation.
Thanks.
|
|
|
|
|
WM_TIMER is only posted once.
That means that if there is already a WM_TIMER in the message queue it is not posted again.
So at any time there is only one WM_TIMER in the message queue.
|
|
|
|
|
What about another message, for example WM_MOUSTMOVE if we have a lot of code within OnMouseMove function the first message not finish but another one come in.
How windows manage this situation or just ignore it?
|
|
|
|
|
There are certain rules involved:
1. Main window procedure can process only one message at the time.
2. WM_TIMER message is posted to a thread’s queue.
3. Messages posted to the queue are retrieved and removed in a main message loop by GetMessage. There is always one global message loop per process. Local message loops can be created but that is not a case here and it does not change this set of rules.
4. Retrieved messages are delivered to a window procedure by DispatchMessage call.
5. When message is processed, system posted messages are not delivered to a message queue, since the thread is blocked.
Let’s assume you register timer calling SetTimer. After time elapses, system posts the WM_TIMER message to a queue.
Message is then removed and window procedure or callback is called.
If timer message is processed for a time much longer that time interval used to register timer, thread id blocked and no messages are added to a queue.
If processing time is very long, it will render application unresponsive.
After processing is done, queue receives all new messages that are posted by the system.
WM_MOUSEMOVE message as other mouse messages are also posted to the queue, hence if thread is blocked by long processing of any message window will loose WM_MOUSEMOVE, resuming receiving after processing is done.
Timer is not precise. It has low priority and GetMessage can retrieve other messages first before WM_TIMER is retrieved; it is really at the bottom of the food chain.
There is also a set of messages that are delivered by SendMessage directly to a window procedure without being posted.
Considering this and low priority of the WM_TIMER it should not be used when timing is crucial. If that is a case, use another thread to handle such a case.
JohnCz
MS C++ MVP
|
|
|
|
|
|
This is a misuse of WM_TIMER, because it is to often so it will lower performance with its overhead.
If you need such high frequencies of calling write a seperate thread which handles such stuff.
Press F1 for help or google it.
Greetings from Germany
|
|
|
|
|
Well, I do not think this is a WM_TIMER misuse issue. Timer is not posted as high priority message and is retrieved as the last after all others and only during a system idle, that is why is not guaranteed that it will be delivered in intervals it was registered with.
The issue here is the fact that timer can be used to handle some long processing and that is what can cause problems.
JohnCz
MS C++ MVP
|
|
|
|
|