对Skin++在VS2005中的一个问题的解决方案

   今天遇到一个很奇怪的问题:在vs2005中新建一个MFC程序,然后想在里面使用Skin++在工程的stdafx.h里加入 #include “SkinPPWTL.h” Linker->InputAdditional 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->InputObject/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


   到这就一切搞定,下面是效果图:

2008041403.jpg

到这里还没完呢,现在对中文是不支持的!所以我上面都是用的英文(^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,"");,试试效果,这下中文可以了吧。。。

posted on   Phinecos(洞庭散人)  阅读(5327)  评论(10编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示