Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: VC8.0
i m using vs 2008 for my program which should work in winxp,vista,win7 ...
cfiledialog has a last parameter bVistaStyle which should be set to true
for vista style dialog
 
and also the doc says that the ApplyOFNToShellDialog(); function is called in domodal() and
UpdateOFNFromShellDialog(); in ok
 
and i compiling my program with
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
 
but the declarations of function ApplyOFNToShellDialog() and UpdateOFNFromShellDialog()
are inside the compiler if block
#if WINVER >= 0x0600
 
.....
#endif
 
and still my programme is compiling properly.why?
and also the purpose of WINVER is setting the minimum version on which the application should work and keeping it in WINVER > = 0x0600 is wrong
because a program meant to work on winxp is also meant on any other higher verions
Posted 18-Jan-11 6:23am
Edited 18-Jan-11 6:35am
v2

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

The CFileDialog constructor calls GetVersionEx to determine the current OS version. If you set the vista style to TRUE, and the app is running in a pre-Vista OS, it will reset the flag to FALSE.
 
And as to your code compiling, unless you explicitly try to call a method not defined for your version, it will compile. This actual determination of the OS is a runtime behavior.
  Permalink  
v2
Comments
Rajesh Katalkar at 18-Jan-11 11:38am
   
if u see the domodal code of cfiledialog
 
if (m_bVistaStyle == TRUE)
{
ApplyOFNToShellDialog();
HRESULT hr = (static_cast(m_pIFileDialog))->Show(m_ofn.hwndOwner);
nResult = (hr == S_OK) ? IDOK : IDCANCEL;
}
 

ApplyOFNToShellDialog(); is called explicitly
Nishant Sivakumar at 18-Jan-11 11:44am
   
Yes, but m_bVistaStyle is set to FALSE in the constructor if you run it on a pre-Vista OS.
Rajesh Katalkar at 18-Jan-11 11:51am
   
you are not getting the point .
m_bVistaStyle is a normal variable not a compiler variable
 
and ApplyOFNToShellDialog(); is decalred
inside
#if WINVER >= 0x0600
 
.....
#endif
 
and if my WINVER is less than 0x0600
the program should not compile because the function does not get declared in the first place.
Nishant Sivakumar at 18-Jan-11 11:58am
   
I have VS 2010 and both ApplyOFNToShellDialog and UpdateOFNFromShellDialog are declared outside the #ifdef WINVER >= 0x0600 block.
 
Both their implementations assert if the vista flag is true via: ASSERT(m_bVistaStyle == TRUE). The assumption is these get called only if the flag is true. This is not compiler related at all.

That said, I notice you are on VS 2008. Let me see if I can check this out on a VS 2008 installation.
Rajesh Katalkar at 18-Jan-11 12:07pm
   
my question is why does the program gets compiled when function is not declared at all.
putting it inside #if #endif is as good as not declaring it
Nishant Sivakumar at 18-Jan-11 12:09pm
   
Ok I checked VS 2008 sources. The header file indeed has those functions inside the #ifdef block. That is a bug in my opinion, and one that they have rightly fixed in VS 2010.
 
Anyway it will compile for you, unless you try to call those methods yourself. The cpp file you are looking at is just provided for you, the actual code that is executed is from the pre-compiled DLLs which were compiled with the right version-macros defined.
 
When you do a build, dlgfile.cpp does not get compiled. Does that make sense?
Rajesh Katalkar at 18-Jan-11 22:23pm
   
ok ..
so could you tell whats declared in vs2010 header file for cfiledialog and also the WINVER of #if block if defined...it should 0x501 and not 0x0600 according to me because its a minimum version on which an application can run and cfiledialog supports both vista and non-vista versions ..
 
one more thing could you tell in which precompiled dll is this cfiledialog going
Nishant Sivakumar at 19-Jan-11 9:08am
   
I don't want to paste the header file here, but the methods you mentioned are not conditionally defined (means they are always present irrespective of the version definition). And as for the compiled DLL, I am not sure, it should be in one of the 2 or 3 major MFC DLLs that are shipped with the MFC runtime.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 OriginalGriff 304
1 Sergey Alexandrovich Kryukov 255
2 Shweta N Mishra 216
3 Maciej Los 210
4 PIEBALDconsult 184
0 OriginalGriff 7,660
1 Sergey Alexandrovich Kryukov 7,072
2 DamithSL 5,586
3 Manas Bhardwaj 4,946
4 Maciej Los 4,665


Advertise | Privacy | Mobile
Web03 | 2.8.1411023.1 | Last Updated 18 Jan 2011
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100