Archive for the ‘东东博客’ Category

InstallShield判断DotNetFramework指定版本是否安装的脚本代码

星期四, 19 11 月, 2009

// @param szVersion Version to check, e.g. "v2.0", "v3.5" and so on.

function DetectDotNet(szVersion)
    NUMBER nRootKey, nResult;
    LIST lstVersions;
    BOOL bRet;
    STRING szString;
begin
    bRet = FALSE;
    nRootKey = HKEY_LOCAL_MACHINE;
    lstVersions = ListCreate(STRINGLIST);
    if (lstVersions = LIST_NULL) then
        MessageBox ("Unable to create necessary lists.", SEVERE);
        abort;
    endif;
   
    if (RegDBSetDefaultRoot(nRootKey) = 0) then
        nResult = RegDBQueryKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP",
            REGDB_KEYS, lstVersions);
        if (nResult = 0) then
            // Get the first string in the list.
            nResult = ListGetFirstString(lstVersions, szString);
   
            // Loop while list items continue to be retrieved.
            while (nResult != END_OF_LIST)
                // Detect the current element.
                if (StrFind(szString, szVersion) = 0) then
                    bRet = TRUE;
                    nResult = END_OF_LIST;  // Force to exit
                else
                    // Get the next string in the list.
                    nResult = ListGetNextString(lstVersions, szString);
                endif;
            endwhile;
        endif;
    endif;
   
    ListDestroy(lstVersions);  

    return bRet;
end;

无人值守安装.Net Framework 3.5的批处理脚本(传入参数是dotnetfx35.exe所在的绝对目录,解决自动连网下载的问题):

@echo off
setlocal

set INSTALLER31="%~1WindowsInstaller-KB893803-v2-x86.exe"
set DOTNETFX35="%~1dotnetfx35.exe"
set NDP35SP1="%~1NDP35SP1-KB958484-x86.exe"

echo Installing %INSTALLER31%
%INSTALLER31% /quiet /norestart /nobackup

echo Extracting %DOTNETFX35%
%DOTNETFX35% /x:%TEMP% /passive

cd /d "%TEMP%\wcu\dotNetFramework"

echo Installing dotNetFx35setup.exe
dotNetFx35setup.exe /lang:ENU /norestart /passive

echo Removing extracted files
cd /d "%TEMP%"
rd /s /q wcu

echo Installing %NDP35SP1%
%NDP35SP1% /norestart /passive

endlocal

解决网上邻居无法访问时显示打开或另存对话框长时间不响应的思路

星期四, 19 11 月, 2009

C#中使用OpenFileDialog或SaveFileDialog对话框选择文件时,假设A机最后一次访问了B机上的共享目录,之后B机断开了网络,A机再选择文件时软件会长时间不响应。

解决思路是在显示对话框之前先获取最后一次选择文件的目录,然后检查该目录是否可以访问,如果不能访问则设置初始目录为系统当前目录。

经研究发现选择文件对话框在选择文件后会在注册表保存最后一次访问的目录,每个程序都有自己的最后访问目录,对应注册表键是[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU]。

为了获取各个程序最后的访问目录,我写了两个函数,第1个是取得运行程序的程序文件名,参数是程序的命令行参数:

        public string GetAppFileName(string cmdLine)
        {
            string[] parts = cmdLine.Split(new char[] { ‘"’ }, StringSplitOptions.RemoveEmptyEntries);         // 以双引号分隔命令行参数
            int lastPos = parts[0].LastIndexOf(‘\\’);

            return parts[0].Substring(lastPos + 1);
        }

第2个函数是传入上面函数返回值,从注册表中取得该程序最后一次浏览访问的目录:

        public string GetLastVisitedMRU(string appName)
        {
            RegistryKey key = OpenSubKey(Registry.CurrentUser,
                @"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU", false);
            string mruList = key.GetValue("MRUList") as string;

            for (int i = 0; i < mruList.Length; ++i)
            {
                string keyName = mruList.Substring(i, 1);
                string mruKeyValue = null;

                try
                {
                    // Unsafe code section, must be select the ‘Allow unsafe code’ in Build property
                    unsafe
                    {
                        sbyte[] keyVal = key.GetValue(keyName) as sbyte[];

                        fixed (sbyte* pKeyVal = keyVal)
                        {
                            mruKeyValue = new string(pKeyVal, 0, keyVal.Length, Encoding.Unicode);
                        }
                    }

                    int zeroPos = mruKeyValue.IndexOf(‘\0’);
                    string mruAppName = mruKeyValue.Substring(0, zeroPos);

                    if (mruAppName.Equals(appName, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // Remove the last zero character
                        return mruKeyValue.Substring(zeroPos + 1, mruKeyValue.Length – zeroPos – 2);
                    }
                }
                catch (System.Exception)
                {
                    // Do nothing here
                }
            }

            return string.Empty;
        }

这个函数使用到了unsafe块,所以必须修改程序Build的属性,钩选“Allow unsafe code”。

相关OpenSubKey函数:

        public RegistryKey OpenSubKey(RegistryKey keyRoot, string subKey, bool writable)
        {
            RegistryKey result = keyRoot;
            string[] keys = subKey.Split(new char[] { ‘\\’, ‘/’ });

            foreach (string key in keys)
            {
                result = result.OpenSubKey(key, writable);

                if (result == null)
                {
                    break;
                }
            }

            return result;
        }

最后在显示选择文件对话框之前调用这两个函数并判断:

            OpenFileDialog dlg = new OpenFileDialog();

            string lastVisitedMRU = GetLast
VisitedMRU(GetAppFileName(Environment.CommandLine));

            if (!Directory.Exists(lastVisitedMRU))
            {
                dlg.InitialDirectory = Environment.CurrentDirectory;
            }
           
            if (dlg.ShowDialog(this) == DialogResult.OK) { … }

使用过程虽然可以自动判断并切换选择文件对话框的初始目录,但发现调用Directory.Exists()判断网上邻居的目录是否可以访问时仍耗时比较长,有待进一步研究解决。

解决C#窗体在不同操作系统下显示错乱的问题

星期四, 19 11 月, 2009

将所有Form、UserControl所使用的AutoScaleMode由Font修改为None、DPI或者Inherit,界面即可正常显示

关闭Windows XP SP2的数据执行保护DEP方法

星期四, 19 11 月, 2009

修改boot.ini的“/NoExecute=xxx”为“/NoExecute=AlwaysOff”

黑莓手机开工程模式的方法

星期四, 19 11 月, 2009

还是有必要稍作解释,名词注解手机工程模式顾名思义是指手机在工程测试状态下的模式,它是为移动基站负责维护系统的工程人员或手机工程师判断各种通讯参数而设计的。依据在工程模式中的相关数值,工程师们就无须借助大开型维护和控测设备,而准确地掌握基站情况,并且能提早处理可能出现的问题。

注意事项:

①进入工程模式界面修改对您的BB可能有无法预计的影响,请自慎(有同学反映计入工程模式后无法再次回到help me,解决方法:要恢复help me屏幕可以把系统时间调回到激活之前,然后Help me屏幕就回来了,之后再把时间改回来就可以了;)
②工程模式code获得需要PIN,OS版本号,运行时间(这个是即时变化的,意味着你打开help me时显示的运行时间决定了code的变化结果,整个过程直至输入完code)
如果遇到如4.5.0.153(246)正确的输入格式为:4.5.0.153空格(246)必须有空格和括号;如果以上不奏效PIN中字母换成大写试试。(注:我试了几次没成功,原来是没有输入验证码)

进入黑莓的工程模式的操作步骤
1)进入help me界面
Qwert键盘机型:桌面按Alt+Shift+H
ST键盘机型:桌面按 Alt+EACE
2)获取工程模式解锁码:进入help me 界面之后可以看到很多信息,到
这个网站(需要翻墙,翻墙有难度,或者不翻墙的这里)填入所需信息获得Engineering Screen Unlock Code (工程模式解锁码),在help me界面输入这个8字母的code(Qwert键盘需要ALT输入数字,ST键盘需要在multitap 模式下,数字也是需要ALT)

摘自:http://www.leaffly.com/post/blackberry_engineering.html
http://www.bber.info/post/blackberry_escreen

解决VMware Workstation虚拟机支持宽屏的办法

星期四, 19 11 月, 2009

我把支持1280×1024的台试机上安装的VMware Workstation虚拟机文件拷到仅支持1280×800的笔记本上用,结果无法进入全屏模式,因为屏幕设置里没有Nx800的选项,设置的屏宽大于800都无法进入全屏模式。

后来在网上找了相关资料,经过自己的实践解决了这个问题。

首先在启动虚拟机前通过Edit->Preferences的Display页把Full Screen改成Resize guest模式,然后启动虚拟机。

接着修改虚拟机的分辨率为1024×768,然后进入全屏模式,这时分辨率自动调整成1280×800,进入屏幕分辨率设置可以看到可以选1280×800这个模式了。

还原成窗口模式,设置屏幕的分辨率为1280×800,然后修改Display的Full Screen模式为原来的Resize host,成功解决。

安装大型msi程序时出现Error 1718的解决办法

星期四, 19 11 月, 2009

尝试在 Windows Server 2003 或 Windows XP 中安装大型 Windows Installer 程序包或大型 Windows Installer 修补程序包时出现错误消息:“Error 1718. File was rejected by digital signature policy”(错误 1718。文件被数字签名策略拒绝)

原因:
当计算机没有足够的连续内存可供 Windows Server 2003 或 Windows XP 用于验证是否对 .msi 包或 .msp 包正确进行了签名时将出现此问题。

解决办法:
1. 修改HKEY_LOCAL_MACHINESoftwarePoliciesMicrosoftWindowsSaferCodeIdentifiers键值下PolicyScope的值为1(如果该键值不存在则创建一个,类型DWORD)。
2. 在命令行下输入“net stop msiserver”停止Microsoft  Installer服务。
3. 重新运行安装程序。
4. 安装完之后把PolicyScope的值改为0

来源:http://support.microsoft.com/kb/925336

修复WindowsXP字体的方法

星期四, 19 11 月, 2009

我在安装完Windows XP系统后(英文SP2,默认中文),想给系统做一些瘦身操作,把Fonts字体移出系统盘,然后以链接方式加回去,结果导致好多软件的中文字体显示不正常,经常是乱码。

乱码了一段时间总觉得不适,之前试过从别的系统导字体过来、卸载中文字体然后再重装等操作,结果还是没有解决。

今天使用升级操作终于搞定了,下面介绍一下方法。

1. 由于系统打了SP3,运行原来的安装盘时提示无法升级,于是先对安装盘打上SP3。
1.1 使用命令行方式解压SP3的安装包“WINDOWSXP-KB936929-SP3-X86-ENU.EXE -s”,选择一个解压目录。
1.2 把安装盘拷到本地硬盘,然后把整个目录的只读方式去掉。
1.3 在命令行下进入SP3解压目录的i386update子目录下,运行“update -s:<安装盘目录>” ,这个安装盘目录即Setup.exe所在的目录,更新完后该目录下应该会多出来一个win51ip.SP3文件,注意“-s”和目录用“:”分隔,没有 空格。

2. 进入控制面板的“Regional and Language Options”,把默认语言改成英文,然后把已经安装的东方语种卸载(把Install files for East Asian languages前的钩去掉),重启系统。

3. 进入WindowsFonts目录,把所有的文件的只读、隐藏、系统等属性去掉(可以用“attrib -s -h -r”命令行),然后删除所有字体,不允许删除的则跳过(用“del . /s /q”命令行)。

4. 运行安装盘目录下的Setup.exe,选择升级,输入CD-KEY然后让安装系统自己完成升级操作。

5. 升级完后重新安装东方语种字体库和设置默认语言为中文,即可大功告成。

补充:升级完后Microsoft Office、Adobe Acrobat Professional等软件可能会弹出窗体进行更新,在更新过程中需要选择文件时找到对应的安装目录即可。由于Adobe Acrobat Professional安装目录是临时目录,只能找到安装文件,双击让它解压,解压完后不要继续,然后让这个更新完成后再取消安装即可。

合租的DreamHost空间被封,启用新的空间

星期三, 18 11 月, 2009

原来在淘宝上买了合租式DreamHost空间,上周因一起合租的某个网站部署了存在版权问题的blog程序并提供下载而被投诉,这导致了该空间被永久封存,一起合租的所有人员无一幸免,当然我的lordong.cn域名也被封。

经与原卖家沟通,卖家在HostMonster新购买了新的空间,帮大家做域名绑定,现已经成功在该空间上完成dabr、twitter api和wordpress blog的部署。

新空间相比原来的DreamHost存在一些不足:

1. 没有web控制面板,无法自已修改密码。

2. 没有sftp帐户,无法启用ssh实现代理功能。

3. 大家共用一个IP地址,一旦某个网站引起IP被封,大家了一同受牵连。

虽然存在一些问题,但30元/年的海外空间还是值的,专用于测试PHP网站和部署一些代理,够用了。

没有多少写文章的激情了

星期二, 27 10 月, 2009

自从开了DreamHost的空间后,基本上都在那里写技术方面的文章了,试过把这边的文章迁移到那个空间上去,可总是这个或那个的问题不能完美迁移,所以还保持着原来的样子