今天遇到一个很奇怪的问题:在vs2005中新建一个MFC程序,然后想在里面使用Skin++,在工程的stdafx.h里加入 #include “SkinPPWTL.h”, Linker->Input的Additional Dependencies处加上SkinPPWTL.lib就遇到下面的编译错误:
errorLNK2019:unresolvedexternalsymbol
"
__declspec(dllimport)int__cdeclskinppLoadSkin(wchar_t*,int)
"
(__imp_
?
skinppLoadSkin@@YAHPA_WH@Z)referenced
in
function
"
public:virtualint__thiscallCdemo2App::InitInstance(void)
"
(
?
InitInstance@Cdemo2App@@UAEHXZ)
网上搜索了半天也只在
优快云
上看到有一个人问了同样的问题,可惜没有人能给出解决方案,而官方的论坛要注册版用户才能进去。我就尝试先在
VC6.0
中建立一个新项目,
在工程的
stdafx.h
里加入
#include “SkinPPWTL.h”
,然后在工程的
Project->Setting->Link->Input
的
Object/library modules
处加上
SkinPPWTL.lib,
然后在
CDemoApp::InitInstance()
这里加入:
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
skinppLoadSkin(_T(
"
..//..//skins//AquaOS//AquaOS.ssk
"
));
恩,这次编译通过。最后把项目转换为2005下的项目,运行ok。
然后我就想如何处理才能直接在2005下建立新项目呢?查阅了些资料后,发现其实很简单,前面报错的原因是:项目的字符属性设置不正确。
这是我的第一个解决方案:在工程的属性页(AudioOrtpRecv Property Pages)里的Configuration Properties中的General 有一个Characoer Set,把这里设置成Use Multi-Byte Character,再次运行第一个程序就ok了,大功告成。
此外,试用版每次运行起来都会先跳出个“注册”页面,让人十分反感,我们可以加入下列代码将这个窗口自动处理掉,注意ThreadKill要声明成static方法哦,因为要创建线程嘛。
void
CDemoApp::SetSkin(CStringstrSkinFile)

{
DWORDdwThread;
HANDLEhThread=::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadKill,0,0,&dwThread);
CloseHandle(hThread);
BOOLbReg=skinppLoadSkin(strSkinFile.GetBuffer(strSkinFile.GetLength()));
strSkinFile.ReleaseBuffer();
}

DWORDCDemoApp::ThreadKill(LPVOIDlp)

{
intiCount=0;
while(iCount++<10000)


{
Sleep(1);
HWNDhWnd=::FindWindow(NULL,"UIPOWER");
if(hWnd==NULL)continue;
WPARAMwp=BN_CLICKED<<16|IDNO;
::SendMessage(hWnd,WM_COMMAND,wp,0);
break;
}
然后
CDemoApp::InitInstance()
这里加入:
theApp.SetSkin(_T(
"
..//..//skins//AquaOS//AquaOS.ssk
"
));
当然如果需要完全的破解版,这里有破解补丁:
http://download.youkuaiyun.com/source/361720
到这就一切搞定,下面是效果图:

到这里还没完呢,现在对中文是不支持的!所以我上面都是用的英文(^o^),那么就开始自己动手修正这个bug吧。我在第一个解决方案中 把Characoer Set设置成Use Multi-Byte Character,这样是不行地。应该还原为Use Unicode Character Set,这样才能支持unicode编码。
然后这里要改为:skinppLoadSkin("..//..//skins//skin//Phenom//Phenom.ssk");然后我们在SkinPPWTL.h头文件里定义一个typedef char MYCHAR;把所有的TCHAR都改成MYCHAR,再把 _tcscpy(szResImageName,_T(""));改为strcpy(szResImageName,"");,试试效果,这下中文可以了吧。。。