今天遇到一个很奇怪的问题:在 vs2005 中新建一个 MFC 程序,然后想在里面使用 Skin++ , 在工程的 stdafx.h 里加入 #include “SkinPPWTL.h” , Linker->Input 的 Additional Dependencies 处加上 SkinPPWTL.lib 就遇到下面的编译错误:
error LNK2019: unresolved external symbol
"
__declspec(dllimport) int __cdecl skinppLoadSkin(wchar_t *,int)
"
(__imp_
?
skinppLoadSkin@@YAHPA_WH@Z) referenced
in
function
"
public: virtual int __thiscall Cdemo2App::InitInstance(void)
"
(
?
InitInstance@Cdemo2App@@UAEHXZ)
网上搜索了半天也只在
CSDN
上看到有一个人问了同样的问题,可惜没有人能给出解决方案,而官方的论坛要注册版用户才能进去。我就尝试先在
VC6.0
中建立一个新项目,
在工程的
stdafx.h
里加入
#include “SkinPPWTL.h”
,然后在工程的
Project->Setting->Link->Input
的
Object/library modules
处加上
SkinPPWTL.lib,
然后在
CDemoApp::InitInstance()
这里加入:
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(CString strSkinFile)
{ DWORD dwThread; HANDLE hThread = ::CreateThread(NULL, 0 ,(LPTHREAD_START_ROUTINE) ThreadKill, 0 , 0 , & dwThread); CloseHandle(hThread); BOOL bReg = skinppLoadSkin(strSkinFile.GetBuffer(strSkinFile.GetLength())); strSkinFile.ReleaseBuffer(); }
DWORD CDemoApp::ThreadKill(LPVOID lp)
{ int iCount = 0 ; while (iCount ++< 10000 ) { Sleep( 1 ); HWND hWnd = ::FindWindow(NULL, " UIPOWER " ); if (hWnd == NULL) continue ; WPARAM wp = BN_CLICKED << 16 | IDNO; ::SendMessage(hWnd,WM_COMMAND,wp, 0 ); break ; }
然后
CDemoApp::InitInstance()
这里加入:
theApp.SetSkin(_T(
"
..//..//skins//AquaOS//AquaOS.ssk
"
));
当然如果需要完全的破解版,这里有破解补丁:
http://download.csdn.net/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 ,"" ); ,试试效果,这下中文可以了吧。。。