win2k下的程序不能在98下使用?

balloy 2002-07-24 03:35:05
我有一个程序,目的是判断出操作系统的版本,2000下运行是正常的,但在98下,却一执行就出错:请各位大侠帮我看看原因,源代码如下:

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

BOOL Is_Win2000_Professional();

PTSTR GetWindowsVersion()
{
OSVERSIONINFOEX osvi;
BOOL bOsVersionInfoEx;

// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
//
// If that fails, try using the OSVERSIONINFO structure.

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
{
// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
return TEXT("ERROR");
}

switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:

if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
{
if (Is_Win2000_Professional())
return TEXT("WIN2000PRO");
else
return TEXT("WIN2000SRV");
}

break;

case VER_PLATFORM_WIN32_WINDOWS:

if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
return TEXT("WIN95");
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
return TEXT("WIN98");
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
return TEXT("WINME");

break;

}

return TEXT("WINXP");
}


//就是这个函数会报错,但奇怪的是98下并不会执行此函数
BOOL Is_Win2000_Professional()
{
// MessageBox(NULL, "Is_Win2000_Professional", "a", MB_OK);

OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;

// Initialize the OSVERSIONINFOEX structure.

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 5;
osvi.wProductType = VER_NT_WORKSTATION;

// Initialize the condition mask.

VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL );
VER_SET_CONDITION( dwlConditionMask, VER_PRODUCT_TYPE, VER_EQUAL );

// Perform the test.

return VerifyVersionInfo( &osvi, VER_MAJORVERSION | VER_PRODUCT_TYPE, dwlConditionMask);

}


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("test") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps;
RECT rect;

switch (message)
{

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);


TextOut(hdc, 0, 0, GetWindowsVersion(), 10);

EndPaint(hwnd, &ps);
return 0;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

谢谢大家!
...全文
89 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
balloy 2002-08-03
  • 打赏
  • 举报
回复
算了,散分把
balloy 2002-08-01
  • 打赏
  • 举报
回复
这个问题难道没有解决办法吗?
balloy 2002-07-29
  • 打赏
  • 举报
回复
我的就是在win2k下编译成功,并运行成功,但在win98下运行失败的

vc升级包我不知道哪儿有,我以前倒是down过一个visual studio6的升级包,大概150M,是在微软down的,不知道你要的是不是那个。
zhuwenzheng 2002-07-28
  • 打赏
  • 举报
回复
我收到了,但是我的winbase.h中的OSVERSIONINFOEX 没有VER_NT_WORKSTATION等等,估计我的需要更新了,我看了程序,在WIN2000下编译的话应该没有问题,然后你在WIN 98 下运行试试
对了,那里可以DOWNLOAD E文的VC升级包
balloy 2002-07-27
  • 打赏
  • 举报
回复
这样也还是不行啊,我的程序你收到了吗?
zhuwenzheng 2002-07-25
  • 打赏
  • 举报
回复
case VER_PLATFORM_WIN32_NT:
if (VI.dwMajorVersion == 5 && VI.dwMinorVersion == 0)
{ if (Is_Win2000_Professional())
eType=WIN2000PRO;
else
eType=WIN2000SRV;}
else if (VI.dwMajorVersion == 5 && VI.dwMinorVersion == 1)
eType = PT_WINXP;
else if (VI.dwMajorVersion == 4 && VI.dwMinorVersion == 0)
eType = PT_WINNT;
break;
case VER_PLATFORM_WIN32_WINDOWS:
if (VI.dwMajorVersion == 4 && VI.dwMinorVersion == 10)
eType = PT_WIN98;
else if (VI.dwMajorVersion == 4 && VI.dwMinorVersion == 90)
eType = PT_WINME;
else
eType = PT_WIN95;
balloy 2002-07-25
  • 打赏
  • 举报
回复
to zhuwenzheng() :
很遗憾,还是不行,唉,这个问题真是古怪,我添加了测试代码:
if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");

MessageBox(NULL, "WIN2000", "a", MB_OK);
return TEXT("WIN2000");
并把剩余的语句注释,98下就可以执行了,但决不会弹出对话框,这是符合设想的。但一旦把注释取消,98下运行立即就会报错,这到底是怎么回事
balloy 2002-07-25
  • 打赏
  • 举报
回复
to zhuwenzheng() :
很遗憾,还是不行,唉,这个问题真是古怪,我添加了测试代码:
if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");

MessageBox(NULL, "WIN2000", "a", MB_OK);
return TEXT("WIN2000");
并把剩余的语句注释,98下就可以执行了,但决不会弹出对话框,这是符合设想的。但一旦把注释取消,98下运行立即就会报错,这到底是怎么回事
zhuwenzheng 2002-07-24
  • 打赏
  • 举报
回复
case VER_PLATFORM_WIN32_NT:

if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
{
if (Is_Win2000_Professional())
return TEXT("WIN2000PRO");
else
return TEXT("WIN2000SRV");
}
balloy 2002-07-24
  • 打赏
  • 举报
回复
我的意思是我的这个程序编译一遍,希望能够在不同的操作系统下使用(否则还有什么意义?)
但如果这样:
case VER_PLATFORM_WIN32_NT:

if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");
break;//add break here

此程序在win2k下运行就判断不出到底是win2kprofessional还是win2kserver,而没有这个break;的话,在win98下运行就会出错
zhuwenzheng 2002-07-24
  • 打赏
  • 举报
回复
在98下当然不会判断是win2kprofessional还是win2kserver,只有在2000的情况下才判断,判断不出是win2kprofessional还是win2kserver,肯定是你的程序问题
zhuwenzheng 2002-07-24
  • 打赏
  • 举报
回复
在98下当然不会判断是win2kprofessional还是win2kserver,只有在2000的情况下才判断,判断不出是win2kprofessional还是win2kserver,肯定是你的程序问题
balloy 2002-07-24
  • 打赏
  • 举报
回复
to zhuwenzheng() :
这样的确不会错了,但这样又无法判断到底是win2kprofessional还是win2kserver了
zhuwenzheng 2002-07-24
  • 打赏
  • 举报
回复
case VER_PLATFORM_WIN32_NT:

if ( osvi.dwMajorVersion <= 4 )
return TEXT("WINNT4");
break;//add break here

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧