OSVERSIONINFO osvi;
    BOOL bIsWindowsXPorLater;    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);    GetVersionEx(&osvi);    bIsWindowsXPorLater = 
       
       ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 2) );
//在2003下上面的bIsWindowsXPorLater 为true,这个可以确定,
if(!bIsWindowsXPorLater )
USkinInit(NULL,NULL,_T("pifu.u3"));在2003下上面的这句话是不会被执行的为什么还是会出错呢,出现 应用程序正常初始化错误

解决方案 »

  1.   

    把USkinInit(NULL,NULL,_T("pifu.u3")); 这个去掉就没事了。
    除非在这句话的上面加上bIsWindowsXPorLater  = true;
    if(!bIsWindowsXPorLater ) 
    USkinInit(NULL,NULL,_T("pifu.u3")); 
      

  2.   

    不明白你的问题,与USkinInit是否执行有何关系?“应用程序正常初始化错误”是你的程序显示的错误提示吗?
      

  3.   

    前面加上bIsWindowsXPorLater = true;就不出错是吗?
      

  4.   

    是的
    但实际上bIsWindowsXPorLater 的内容是为true
    uskin好像不支持2003,所以我是想当他在2003下的时候不执行USkinInit(NULL,NULL,_T("pifu.u3")); 这句话
      

  5.   

    确定bIsWindowsXPorLater 是否为true,改成下面这样
    OSVERSIONINFO osvi; 
        BOOL bIsWindowsXPorLater;     ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); 
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);     GetVersionEx(&osvi);     bIsWindowsXPorLater = 
          
          ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 2) ); 
    //在2003下上面的bIsWindowsXPorLater 为true,这个可以确定, 
    if(bIsWindowsXPorLater ) 
    AfxMessageBox("2003");
    是会有提示信息出来的,
    改成if(!bIsWindowsXPorLater ) 
    USkinInit(NULL,NULL,_T("pifu.u3")); 
    就出错,但上面的代码应该是没有执行的啊。
      

  6.   

    USkinInit(NULL,NULL,_T("pifu.u3"));//从函数 字面意思来看,这个应该加载皮肤
    加载皮肤错误使程序崩溃.
      

  7.   

    头文件#include "stdafx.h"
    #include "testskin.h"
    #include "testskinDlg.h"
    #include "skin.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif#ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif  OSVERSIONINFO osvi;
        BOOL bIsWindowsXPorLater;    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);    GetVersionEx(&osvi);    bIsWindowsXPorLater = 
           
           ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 2) ); if(!bIsWindowsXPorLater) 
    USkinInit(NULL,NULL,_T("soft.u3")); 
    CTestskinDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: Place code here to handle when the dialog is
    //  dismissed with Cancel
    } // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
    }
      

  8.   

    if(!bIsWindowsXPorLater) 
    USkinInit(NULL,NULL,_T("soft.u3")); 把这句话改成if(!bIsWindowsXPorLater) 
    AfxMessagebox("2003");是不会提示信息的,因为可以确定bIsWindowsXPorLater是true的
      

  9.   

    if(!bIsWindowsXPorLater) 
    USkinInit(NULL,NULL,_T("soft.u3")); 把这句话改成 if(!bIsWindowsXPorLater) 
    AfxMessagebox("2003"); 程序会出现“应用程序正常初始化错误”吗?
      

  10.   

    我大概猜到问题了,这样改试试:
    if (!bIsWindowsXPorLater)
    {
        USkinInit(NULL,NULL,_T("soft.u3"));
    }
      

  11.   

    莫非USkinInit是个宏?并非函数?
      

  12.   

    不是这个问题
    我又装了一台机器2003+vc6
    无论怎样改都会出问题
    只要有#include "skin.h" 就会有问题,看来是那个库有问题
    调试的时候先出现应用程序正常初始化错误,然后出现
    unhandle exception in  xx.exe(NTDLL.DLL):oxc0000015 access violation在预编译的时候是不是没有办法来控制  #include "skin.h"这句话,能控制在2003下不用这个吗
      

  13.   

    skin.h中的
    USkin_InitUSkin是个函数 //------------------------------------------------
    // Author   : ThirdWolf
    // 
    // CopyRight: By ThirdWolf ,All Rights Reserved
    // Comments : This Comments must reserved when you use uskin lib.
    //            if you use uskin in free mode,you must show thirwolf,
    //   www.thirdwolf.com,uskin in you help about message
    //   box or in you help file about page.
    //------------------------------------------------
    #ifndef _USKININCLUDE_H_
    #define _USKININCLUDE_H_#ifdef USKIN_DLL
    #define USKIN_DECLARE  _declspec(dllexport)
    #else
    #define USKIN_DECLARE
    #ifdef USKIN_DLL_IMPORT
    #undef USKIN_DECLARE
    #define USKIN_DECLARE  _declspec(dllimport)
    #endif #ifdef USKIN_LIB_IMPORT
    #pragma comment(lib,"USkin_StaticLib.lib")
    #pragma message("Automatically linking USkin_StaticLib.lib") 
    #endif #ifdef USKIN_DLL_IMPORT
    #pragma comment(lib,"skin.lib") 
    #pragma message("Automatically linking USkin.lib") 
    #endif
    #endif
    #pragma pack(push, 8)//Function :Init USkin
    //Param : char* lpszFileName 
    //    Skin File Name .For example "corona.uskn"
    //Return : BOOL
    //Desc : Must call in first step
    USKIN_DECLARE BOOL  __stdcall USkin_InitUSkin(char* lpszUserName,char* lpszRegCode,char* lpszFileName);
    //Exit USkin
    USKIN_DECLARE BOOL  __stdcall USkin_ExitUSkin();//Like Init USkin ,but to change skin
    USKIN_DECLARE BOOL  __stdcall USkin_LoadUSkin(char* lpszFileName);
    //Popup Message Box Show Skin File Info
    USKIN_DECLARE void __stdcall USkin_AboutSkin();
    //Restore to windows default theme
    USKIN_DECLARE BOOL  __stdcall USkin_RemoveUSkin();
    //If use RemoveUSkin To Restore to windows default theme
    //Use this function will restore to uskin theme
    USKIN_DECLARE BOOL  __stdcall USkin_RestoreUSkin();
    //Apply Skin Effect In Hue Saturation Way
    //fHue 0.0f-360.f
    //fSaturation 0.0f - 1.0f
    USKIN_DECLARE void __stdcall USkin_ApplyEffectHS(float fHue,float fSaturation);
    //Get Window Menu
    USKIN_DECLARE HMENU __stdcall USkin_GetMenuEx(HWND hWnd);
    USKIN_DECLARE   BOOL     __stdcall   USkinInit(LPCTSTR   lpszUserName,LPCTSTR   lpszRegCode,LPCTSTR   lpszFileName); #pragma pack(pop)
    #endif
      

  14.   

    这么说你只调用了USkinInit这一个函数?当没有调用这个函数时,生成程序时自动忽略了这个库。
    既然这样,你可以判断系统不是2003时,用LoadLibrary动态加载DLL,用GetProcAddress获取函数地址并调用。
      

  15.   

    它是有一个lib文件,一个dll文件,一个.h文件,
    我不太明白你说的意思,默认的话是不是自动加载的dll文件,需要怎么改呢?
      

  16.   

    不是自动加载的,那就手动加载。用LoadLibrary
    估计是2003没这个加载库
      

  17.   

    就是不使用h和lib文件,在程序中判断可以使用该库时,用LoadLibrary动态加载DLL。另外,你现在可以确定在2003中只要连接了该库就出错吗?因为我在3楼问你是不是“前面加上bIsWindowsXPorLater = true;就不出错”,你的回答是肯定的。
      

  18.   

    对了,你应该是用Release配置编译的,if(false)和后面的代码被优化掉了。
      

  19.   

    我自己用的机器是xp,我在自己的机器上编译好以后考到2003的机器上,就是上面的情况我在2003上装上开发环境后调试程序的时候无论怎样只要引用的那个.h文件就会出错。
      

  20.   

    就象这样加载,不要包含uskin.h和对应的lib
    if (!bIsWindowsXPorLater)
    {
      HMOUDLE hMoudle = ::LoadLibrary(_T("USkin.dll"));
      if (hMoudle != NULL)
      {
        BOOL (__stdcall* pUInit)(char* ,char* ,char* );
        pUInit = ::GetProcAddress(_T("USkin_InitUSkin"));
        if (pUinit != NULL)
        {
           (*pUinit)(NULL, NULL, _T("soft.u3"));
        }
      }
    }
      

  21.   

    '=' : cannot convert from 'int (__stdcall *)(void)' to 'int (__stdcall *)(char *,char *,char *)'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
      

  22.   

    Sorry没有注意类型pUInit = (BOOL (__stdcall*)(char* ,char* ,char* ))::GetProcAddress(hMoudle, _T("USkin_InitUSkin"));
      

  23.   

    谢谢各位了,使用动态加载dll文件测试成功。结贴了。