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下上面的这句话是不会被执行的为什么还是会出错呢,出现 应用程序正常初始化错误
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下上面的这句话是不会被执行的为什么还是会出错呢,出现 应用程序正常初始化错误
除非在这句话的上面加上bIsWindowsXPorLater = true;
if(!bIsWindowsXPorLater )
USkinInit(NULL,NULL,_T("pifu.u3"));
但实际上bIsWindowsXPorLater 的内容是为true
uskin好像不支持2003,所以我是想当他在2003下的时候不执行USkinInit(NULL,NULL,_T("pifu.u3")); 这句话
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"));
就出错,但上面的代码应该是没有执行的啊。
加载皮肤错误使程序崩溃.
#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;
}
USkinInit(NULL,NULL,_T("soft.u3")); 把这句话改成if(!bIsWindowsXPorLater)
AfxMessagebox("2003");是不会提示信息的,因为可以确定bIsWindowsXPorLater是true的
USkinInit(NULL,NULL,_T("soft.u3")); 把这句话改成 if(!bIsWindowsXPorLater)
AfxMessagebox("2003"); 程序会出现“应用程序正常初始化错误”吗?
if (!bIsWindowsXPorLater)
{
USkinInit(NULL,NULL,_T("soft.u3"));
}
我又装了一台机器2003+vc6
无论怎样改都会出问题
只要有#include "skin.h" 就会有问题,看来是那个库有问题
调试的时候先出现应用程序正常初始化错误,然后出现
unhandle exception in xx.exe(NTDLL.DLL):oxc0000015 access violation在预编译的时候是不是没有办法来控制 #include "skin.h"这句话,能控制在2003下不用这个吗
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
既然这样,你可以判断系统不是2003时,用LoadLibrary动态加载DLL,用GetProcAddress获取函数地址并调用。
我不太明白你说的意思,默认的话是不是自动加载的dll文件,需要怎么改呢?
估计是2003没这个加载库
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"));
}
}
}
This conversion requires a reinterpret_cast, a C-style cast or function-style cast