NSIS 2.0版本支持定制的用户界面。所谓的Modern
UI(下称MUI)就是一种模仿最新的Windows界面风格的界面系统。MUI改变了NSIS脚本的编写习惯,它使用NSIS的宏来表达,指定MUI的
属性需要使用宏。所以,诸如LicenseText, Icon, CheckBitmap, InstallColors在MUI中失去意义。
NSIS 2.0版本支持定制的用户界面。所谓的Modern UI(下称MUI)就是一种模仿最新的Windows界面风格的界面系统。MUI改变了NSIS脚本的编写习惯,它使用NSIS的宏来表达,指定MUI的属性需要使用宏。所以,诸如LicenseText, Icon, CheckBitmap, InstallColors在MUI中失去意义。
UI(下称MUI)就是一种模仿最新的Windows界面风格的界面系统。MUI改变了NSIS脚本的编写习惯,它使用NSIS的宏来表达,指定MUI的
属性需要使用宏。所以,诸如LicenseText, Icon, CheckBitmap, InstallColors在MUI中失去意义。
NSIS 2.0版本支持定制的用户界面。所谓的Modern UI(下称MUI)就是一种模仿最新的Windows界面风格的界面系统。MUI改变了NSIS脚本的编写习惯,它使用NSIS的宏来表达,指定MUI的属性需要使用宏。所以,诸如LicenseText, Icon, CheckBitmap, InstallColors在MUI中失去意义。
之前一直觉得,_T("")是空字符,第一个字符就是结束符,即0,所以与NULL应该是一样的。
直到今天碰到API:SHDeleteKey,才知道自己错了。
我现在理解为:_T("")作为参数,则还是会传递一个内存地址的,只是,该地址处为0而已。而NULL,则直接传递0地址了。
比如:SHDeleteKey(hKey, _T(""));会将所有键值删除,而SHDeleteKey(hKey, NULL);就不会。
具体可以自己尝试效果。
直到今天碰到API:SHDeleteKey,才知道自己错了。
我现在理解为:_T("")作为参数,则还是会传递一个内存地址的,只是,该地址处为0而已。而NULL,则直接传递0地址了。
比如:SHDeleteKey(hKey, _T(""));会将所有键值删除,而SHDeleteKey(hKey, NULL);就不会。
具体可以自己尝试效果。
有时候比较管用,具体实现看代码吧。子类实现:
#include "Parent.h"
class CSub
{
public:
CSub(void);
~CSub(void);
public:
void Sub();
public:
CParent * m_pParent;
};
void CSub::Sub()
{
if (m_pParent != NULL) m_pParent->Parent();
}
class CSub
{
public:
CSub(void);
~CSub(void);
public:
void Sub();
public:
CParent * m_pParent;
};
void CSub::Sub()
{
if (m_pParent != NULL) m_pParent->Parent();
}
#define MAX_COUNT 1000000
int _tmain(int argc, _TCHAR* argv[])
{
CString str;
GetModuleFileName(NULL, str.GetBuffer(MAX_PATH), MAX_PATH);
str.ReleaseBuffer();
DWORD t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
PathRenameExtension((PTSTR)(PCTSTR)str, _T(".ini"));
}
std::cout << GetTickCount() - t << std::endl;
t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
str = str.Left(str.ReverseFind(_T('.'))) + _T(".exe");
}
std::cout << GetTickCount() - t << std::endl;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CString str;
GetModuleFileName(NULL, str.GetBuffer(MAX_PATH), MAX_PATH);
str.ReleaseBuffer();
DWORD t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
PathRenameExtension((PTSTR)(PCTSTR)str, _T(".ini"));
}
std::cout << GetTickCount() - t << std::endl;
t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
str = str.Left(str.ReverseFind(_T('.'))) + _T(".exe");
}
std::cout << GetTickCount() - t << std::endl;
return 0;
}
Life++对插件的支持是比较保守的,主要考虑到Life++本身的安全问题。所以,为Life++写的插件,也只能完成一些独立于Life++的功能。下面附上源代码,VS2005下编译通过。
下载文件 (已下载 63 次)
下载文件 (已下载 63 次)




2007/11/19

