网上参考别人利用skinmagic换肤的代码,代码如下
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL,NULL ));
VERIFY( 1 == LoadSkinFile("BlueHorn.smf"));
奇怪的是,有时候正常,有时候在VERIFY( 1 == LoadSkinFile("BlueHorn.smf"));处触发断言。一开始不断百度,发现别人都是这么写的,所以认为没错。但是后来自己的代码实在是没发现什么错误,于是打开SkinMagicLib.h头文件,查看了LoadSkinFile函数的说明,说明如下
//Function: LoadSkinFile( LPCTSTR SkinFile )
// Load skin from file.
//Parameters:
// SkinFile
// [in] Specifies the skin file name.
//Return Values:
// If the function success, the return value is nonzero
// If the function fail, the return value is zero
//Remarks:
// Load skin from file.
也就是说啊,函数调用成功了不一定是返回1的,但是失败了一定是返回0.于是将代码改成
VERIFY( 0 != InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL,NULL ));
VERIFY( 0 != LoadSkinFile("BlueHorn.smf"));
-----------------------------------------分割线--------------------------------------------------------------------------------------------
在后来的测试中,问题仍然出现。仔细检查之后,注意到了一个地方,因为我的程序需要调用MFC DLL,所以使用了静态加载dll的方式加载dll,调试时发现,每次都是先加载我的mfc dll再加载skinmagic的dll。问题就出现在这里了!若是先加载skinmagic的dll,就不会出错。这可能是mfc dll先加载进内存,skinmagic的dll再对其换肤的操作非法吧。最后将mfc dll改成动态加载,加载顺序在skinmagic的dll后面,问题就再没出现过了。