in

SDT Community Server

SDT Forums, Blogs, Photos server.

Floating Heart

No description is bad.

September 2006 - Posts

  • How to Get Rid of System and Application Popup Messages

    http://msdn.microsoft.com/embedded/community/community/tips/xp/popups/default.aspx

    This article illustrates how the user can suppress system and application error messages from occurring on an embedded system. This is particularly useful when the embedded device is headless and there is no user interface with which to interact to dismiss the error or in cases where the embedded system is meant to be unattended and the system designer does not want users seeing or interacting with such error dialog boxes.

    • For low-level filtering out visible notification of various errors use registry entry
      HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Windows\ErrorMode.
    • To prevent device-not-functioning errors during the boot, use registry entry
      HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Windows\NoPopupsOnBoot.

    ErrorMode value descriptions:

    0 - All messages are visible (default value).
    1 - Only system messages are invisible. An example of this type of message is: "Virtual Memory Minimum Too Low."
    2 - All messages are invisible. An example of this type of message is: "Unable to Locate Component" shown when application can't load DLL statically linked to it.

    Additional requirement:

    For the ErrorMode value to affect the component, event logging must be turned on.

    Insight into what happens after the event is generated:

    1. winsrv!UserHardErrorEx - is the entry point for system and application errors.
    2. In all modes, system-originated hard errors are logged to the system log.
    3. Based on current ErrorMode value present during the event UserHardErrorEx decides whether to ignore a message or to call ProcessHardErrorRequest.
    4. If ProcessHardErrorRequest is called this means that the message should be presented to the user. How the message will be shown depends on the user shell handlers for each type of message.

    The default behavior for winsrv.dll is to show a message box using the MessageBoxTimeoutW function. But for some types of messages the explorer shell offers another handling mechanism; instead of the message box it will show a notification balloon in system tray.

    NoPopupsOnBoot:

    Adding this value to your image prevents all pop-up messages from opening and notifying you a device is not functioning when you boot up Windows XP Embedded. The NoPopupsOnBoot value data type is REG_DWORD and the data value of 1 enables this option.

    One example of this message is "At least one service failed to start."
    Preventing messages of this type is not recommended, since they tell user that their device has started to malfunction.

    NoInteractiveServices:

    This value is used as a master switch to make all interactive services behave like ordinary services. Interactive services are very rare and they are covered by MSDN articles.

    EnableDefaultReply:

    This value is used for bypassing the creation of all types of MessageBox functions. Since its usage is well covered in the "Message Box Interception" section of Tareget Designer Help I won't explain it further here. (The complete Target Designer help is available on MSDN.)

    EnableBalloonTips:

    Like its name says, this value is used to enable and disable the notification area balloon tips. Explanation of this value can be found in the Windows XP Embedded tip, Popping "Balloons" in Embedded Images and in the Knowledge Base article, Disable Notification Area Balloon Tips in Windows XP.

    Configuring registry values from Target Designer:

    From the central panel in Target Designer, locate the component "Windows subsystem" and open Registry Data. ErrorMode and NoInteractiveServices values can be found on the right panel.

    Key differences between values:

    • ErrorMode simply tells the operating system to filter out certain notification messages. This does not influence user interface functionality in any way.
    • EnableDefaultReply prevents all message boxes from showing. This switch simply returns the default value associated with message box, it does not care about message box origin or about multiple choice message boxes. This can have a heavy impact on applications that use message boxes to ask users for confirmation or cancellation of some operation.

    When to use:

    For unattended systems it is preferable to set all values to prevent all possible user interactions at all levels. For most embedded applications it is preferable to disable at least system originated messages by using ErrorMode value, since these notifications can often confuse users and make them wonder what they have done wrong.

     

    Posted Sep 22 2006, 05:48 PM by wicky with no comments
    Filed under:
  • C#编程:时间格式的转换

    http://dotnet.chinaitlab.com/CSharp/525282.html

    有时候我们要对时间进行转换,达到不同的显示效果
       默认格式为:2005-6-6 14:33:34
       如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢
       我们要用到:DateTime.ToString的方法(String, IFormatProvider)
       
       using System;
       using System.Globalization;
       String format="D";
       DateTime date=DataTime,Now;
       Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo));
       结果输出
       Thursday, June 16, 2005
       
       参数format格式详细用法
       格式字符 关联属性/说明
       d ShortDatePattern
       D LongDatePattern
       f 完整日期和时间(长日期和短时间)
       F FullDateTimePattern(长日期和长时间)
       g 常规(短日期和短时间)
       G 常规(短日期和长时间)
       m、M MonthDayPattern
       r、R RFC1123Pattern
       s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601)
       t ShortTimePattern
       T LongTimePattern
       u UniversalSortableDateTimePattern 用于显示通用时间的格式
       U 使用通用时间的完整日期和时间(长日期和长时间)
       y、Y YearMonthPattern
       
       下表列出了可被合并以构造自定义模式的模式。这些模式是区分大小写的;例如,识别“MM”,但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。
       
       格式模式 说明
       d 月中的某一天。一位数的日期没有前导零。
       dd 月中的某一天。一位数的日期有一个前导零。
       ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
       dddd 周中某天的完整名称,在 DayNames 中定义。
       M 月份数字。一位数的月份没有前导零。
       MM 月份数字。一位数的月份有一个前导零。
       MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
       MMMM 月份的完整名称,在 MonthNames 中定义。
       y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
       yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
       yyyy 包括纪元的四位数的年份。
       gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。
       h 12 小时制的小时。一位数的小时数没有前导零。
       hh 12 小时制的小时。一位数的小时数有前导零。
       H 24 小时制的小时。一位数的小时数没有前导零。
       HH 24 小时制的小时。一位数的小时数有前导零。
       m 分钟。一位数的分钟数没有前导零。
       mm 分钟。一位数的分钟数有一个前导零。
       s 秒。一位数的秒数没有前导零。
       ss 秒。一位数的秒数有一个前导零。
       f 秒的小数精度为一位。其余数字被截断。
       ff 秒的小数精度为两位。其余数字被截断。
       fff 秒的小数精度为三位。其余数字被截断。
       ffff 秒的小数精度为四位。其余数字被截断。
       fffff 秒的小数精度为五位。其余数字被截断。
       ffffff 秒的小数精度为六位。其余数字被截断。
       fffffff 秒的小数精度为七位。其余数字被截断。
       t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。
       tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项(如果存在)。
       z 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。
       zz 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。
       zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。
       : 在 TimeSeparator 中定义的默认时间分隔符。
       / 在 DateSeparator 中定义的默认日期分隔符。
       % c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。
       \ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“\\”。
       
       只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如,
       
       DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。
       DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。
       DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。
       
       比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式
       如要得到2005年06月 这样格式的时间
       可以这样写:
       date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo)
       如此类推

  • Change Application Default Language

    http://evotalk.net/blog/?p=288

    1. @ECHO OFF
    2. REM 以簡體中文語系打開記事本
    3. SET __COMPAT_LAYER=#ApplicationLocale
    4. SET ApplocaleID=0804
    5. start notepad.exe
    6. REM 0404: 繁體中文
    7. REM 0804: 簡體中文
    8. REM 0411: 日文
    Posted Sep 20 2006, 03:32 PM by wicky with no comments
    Filed under:
  • Applocale右健使用法

    http://www.google.com/notebook/public/18024574115220836814/BDTncIgoQicX-urwh

    就是將Applocale加入在滑鼠右鍵選單中, 以後不用到All Program去開啓它了。

    到登錄值 > HKEY_CLASSES_ROOT\exefile\shell\ ,
    新增key並命名 Applocale(這個可以隨便取,也可以是中文),

    然后在Applocale 目錄下再新增key並命名為Command (這個不可以亂改了)。
    在右邊的default,寫入 C:\WINDOWS\AppPatch\Apploc.exe "%1" 即可。

    如你想要用繁簡中文、日文更加方便。
    就請這樣做。

    在HKEY_CLASSES_ROOT\exefile\shell\ 下
    增加 Applocale (Japanese Mode),command寫成 C:\WINDOWS\AppPatch\AppLoc.exe "%1" "/L0411"

    增加 Applocale (Chinese Traditional Mode),command寫成 C:\WINDOWS\AppPatch\AppLoc.exe "%1" "/L0404"

    增加 Applocale (Chinese Simplify Mode),command寫成 C:\WINDOWS\AppPatch\AppLoc.exe "%1" "/L0804"

    這樣你就可以在.exe檔做出右選了(因Applocale只可以支授EXE File而已)。還有這方法也可用在其他的程式。

    也可以直接將以下的值複製在Notepad並save成App.reg檔。雙擊后就可用了。

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\exefile\shell]

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Chinese Simplified Mode)]

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Chinese Simplified Mode)\command]
    @="C:\\WINDOWS\\AppPatch\\AppLoc.exe \"%1\" \"/L0804\""

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Chinese Traditional Mode)]

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Chinese Traditional Mode)\command]
    @="C:\\WINDOWS\\AppPatch\\AppLoc.exe \"%1\" \"/L0404\""

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Japanese Mode)]

    [HKEY_CLASSES_ROOT\exefile\shell\AppLocale (Japanese Mode)\command]
    @="C:\\WINDOWS\\AppPatch\\AppLoc.exe \"%1\" \"/L0411\""

     

    Posted Sep 20 2006, 02:30 PM by wicky with 1 comment(s)
    Filed under:
  • 人体使用手册

    养生从今天开始。。。

     

    Posted Sep 18 2006, 09:12 AM by wicky with no comments
    Filed under:
  • CHM打不开解决办法

    http://www.programfan.com/blog/article.asp?id=9363

    症状

    安装安全更新 896358 或 Microsoft Windows Server 2003 Service Pack 1 (SP1) 后,在 Internet Explorer 中单击 HTML 帮助 .chm 文件的链接时,可能出现下面的一种或两种症状:
    当在“文件下载”对话框中单击“打开”(而不是“保存”)时,无法查看 .chm 文件中的主题。
    当在“文件下载”对话框中单击“保存”,然后尝试打开此文件时,无法查看 .chm 文件中的主题。
    注意:本文包含以下 Microsoft 知识库文章的补充信息:
    232077 (http://support.microsoft.com/kb/232077/) 通过超链接和“文件下载”对话框执行文件
    896054 (http://support.microsoft.com/kb/896054/) 无法在安装安全更新 896358、安全更新 840315 或 Windows Server 2003 Service Pack 1 后使用 InfoTech 协议打开远程内容
    896358 (http://support.microsoft.com/kb/896358/) MS05-026:HTML 帮助中的漏洞可能允许远程执行代码
     

    原因

    安全更新 896358 和 Windows Server 2003 SP1 包括对 InfoTech 协议的更改,这些更改禁止此功能查看远程内容。引入这些更改的目的是为了减少 HTML 帮助中的安全漏洞。安装 896358 或 Windows Server 2003 SP1 后,Temporary Internet Files 文件夹中的文件被视为来自 Internet 区域的内容。因此,当在“文件下载”对话框中单击“打开”时,文件可能会被禁止。此外,安装 896358 或 Windows Server 2003 SP1 后,附件管理器可能将下载的 .chm 文件当作不受信任的文件。因此,您可能无法打开此文件。安装此安全更新和 Windows Server 2003 SP1 后,这些效果是预料之中的。
     

    解决方案

    为最终用户提供的解决方案

    警告:如果提示从网站打开或保存 .chm 文件,则仅在需要此文件且信任提供此文件的网站的情况下进行此操作。

    在“文件下载”对话框中,单击“保存”,然后选择要保存此 .chm 文件的位置。然后,使用下面的方法之一:

    方法 1

    1. 双击此 .chm 文件。
    2. 在“打开文件安全警告”对话框,单击以清除“打开此文件前始终询问”复选框。
    3. 单击“打开”。

    方法 2

    1. 右键单击该 CHM 文件,然后单击“属性”。
    2. 单击“取消阻止”。
    3. 双击此 .chm 文件以打开此文件。
     

    为系统管理员提供的解决方案

    要解决此问题,请使用下列方法之一。

    使用 UNC 文件路径和文件共享以链接到 .chm 文件

    如果 Intranet 网页使用 HTTP URL 方案链接到 .chm 文件,安全更新 896358 可能阻止用户查看 .chm 文件的主题。使用 UNC 文件路径替换 HTTP 文件路径可以重新从网页打开 .chm 文件。

    要使用 UNC 文件路径替换 HTTP URL,请按照下列步骤操作:
    1. 将 .chm 文件放在可以使用 UNC 文件路径访问的文件共享服务器上。

    UNC 文件路径类似于下面的路径:
    \\productmanuals\helpfiles
    2. 使用 ItssRestrictions\UrlAllowList 值使 Intranet 中的系统能够从此文件共享访问 .chm 文件。

    有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    896054 (http://support.microsoft.com/kb/896054/) 无法在安装安全更新 896358、安全更新 840315 或 Windows Server 2003 Service Pack 1 后使用 InfoTech 协议打开远程内容
    3. 更新 Intranet 网页上的链接,以便在链接到 .chm 文件的 URL 中使用 UNC 文件路径。
    注意:此方法仅对来自 Intranet 区域的页面有效。对于来自 Internet 区域的页面,此方法无效。

    设置 Web 应用程序以下载 .chm 文件

    在链接 .chm 文件的网页上,请添加说明以建议用户保存文件,而不是直接打开此文件。有关更多信息,请参见“为最终用户提供的解决方案”一节。

    您也可以使用 DownloadOptions <META> 标记从在用户单击 .chm 文件的链接后显示的“文件下载”对话框中删除“打开”按钮。将此标记放在 HTML 页面的 <head> 标记内。下面的示例说明了此用法。
    <head>
    <META name="DownloadOptions" content="noopen">
    </head>
    
    注意:<META> 标记仅影响某些操作系统。有关更多信息,请访问下面的 Microsoft 网站:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/name_1.asp (http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/name_1.asp)
     

    更多信息

    系统管理员概述和示例

    有关安全更新 896358 以及如何重新启用受此更新影响的 Web 应用程序的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    896358 (http://support.microsoft.com/kb/896358/) MS05-026:HTML 帮助中的漏洞可能允许远程代码执行
     

    Internet Explorer

    有关在 Internet Explorer 中通过超链接打开文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    232077 (http://support.microsoft.com/kb/232077/) 通过超链接和“文件下载”对话框执行文件
    有关如何在 Internet Explorer 中使用安全区域的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    174360 (http://support.microsoft.com/kb/174360/) 如何在 Internet Explorer 中使用安全区域
     

    对基于 x64 的 Microsoft Windows 版本的技术支持

    在运行基于 x64 的 Microsoft Windows 版本的计算机上,您可能必须适当地更改“解决方案”一节中关于如何修改注册表的说明。例如,根据要修改 32 位功能还是要修改 64 位功能,您可能需要修改注册表中不同的部分。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    896459 (http://support.microsoft.com/kb/896459/) 基于 Windows x64 Edition 的操作系统中的注册表更改
    硬件制造商为基于 x64 的 Windows 版本提供了技术支持和帮助。硬件制造商提供支持是因为基于 x64 的 Windows 版本是随硬件提供的。您的硬件制造商可能已用独特的组件自定义了 Windows 的安装。独特组件可能包括特定的设备驱动程序,或者包括用于将硬件性能发挥到最大的可选设置。如果您需要基于 x64 的 Windows 版本的技术帮助,Microsoft 将尽可能提供合理的帮助。但是,您可能必须与制造商直接联系。您的制造商最有资格为安装在您的硬件上的软件提供支持。

    有关 Microsoft Windows XP Professional x64 Edition 的产品信息,请访问下面的 Microsoft 网站:
    http://www.microsoft.com/china/windowsxp/64bit/default.mspx (http://www.microsoft.com/china/windowsxp/64bit/default.mspx )
    有关基于 x64 的 Microsoft Windows Server 2003 版本的产品信息,请访问下面的 Microsoft 网站:
    http://www.microsoft.com/china/windowsserver2003/64bit/x64/default.mspx (http://www.microsoft.com/china/windowsserver2003/64bit/x64/default.mspx )
     

    这篇文章中的信息适用于:
    Microsoft Windows Server 2003 Service Pack 1 当用于
        Microsoft Windows Server 2003 64-bit Enterprise Edition
        Microsoft Windows Server 2003, Datacenter Edition for 64-Bit Itanium-Based Systems
    Microsoft Windows Server 2003, Enterprise x64 Edition
    Microsoft Windows Server 2003, Standard x64 Edition
    Microsoft Windows Server 2003, Datacenter x64 Edition
    Microsoft Windows 2000 Professional Edition
    Microsoft Windows 2000 Service Pack 3
    Microsoft Windows 2000 Service Pack 4
    Microsoft Windows 2000 Service Pack 3
    Microsoft Windows 2000 Advanced Server
    Microsoft Windows 2000 Advanced Server
    Microsoft Windows 2000 Datacenter Server
    Microsoft Windows 2000 Service Pack 3
    Microsoft Windows XP Service Pack 2
    Microsoft Windows XP Service Pack 1
    Microsoft Windows XP Professional 64-Bit Edition (Itanium) 2003
    Microsoft Windows XP Professional 64-Bit Edition (Itanium)
    Microsoft Windows 98 第二版
    Microsoft Windows 98 Standard Edition
    Microsoft Windows Millennium Edition

    关于96358补丁详细资料可以查看http://support.microsoft.com/kb/896358

    一,没有正确安装或被你删除了hh.exe文件,你可以到Windows\system32下查一下。如果是这样那你可以从别人的电脑上copy一个hh.exe ,放到上面那个目录里,再双击一个chm文件,让你选择程序就选那个C:\windows\hh.exe ,这样就恢复了chm文件和hh.exe的关联
    二,是XP系统的问题。这个问题的发生,是由于hhctrl.ocx的版本号出现错误或未正确注册。
    注册的方法是:
    开始--运行,输入regsvr32 hhctrl.ocx
    之后出来一个注册成功的对话框,确定后重启系统
    三,如果以上几种情况都好的话,删除"hh.dat", 在目录
    \Documents and Settings\%username%\Application Data\Microsoft\HTML Help 下,这个文件包含一些内容可能引起错误

    以上问题以解决,最后的转载的来自百度知道,前面的来自微软,分析的也还不错,可根据情况解决自己的问题,如果是专业人士可以看补丁详细资料。

     

    Posted Sep 17 2006, 11:08 AM by wicky with no comments
    Filed under:
  • 简易饮食起居调病法

    早晨——

    醒后,将两手搓烫,捂双眼上令热,然后起床。

    1、姜枣红糖水(必用):
    生姜4片,大红枣3个(掰开),红糖一匙
    以铝壶盛一碗半水将生姜大枣煮剩一碗,煎开时以药气蒸脸、手,并吸入。煎好后先将生姜吃掉,再将大枣吃掉,然后将红糖冲入调匀,服下。早七时服,早餐忌食牛奶、油炸食品。此饮可代替早餐,代替早餐大枣可放五个。
    --------------------------
    中午——

    2、当归桂圆饮(精神不足、睡眠不好者可用):
    当归7克,桂圆2枚(去壳)
    开水泡服,一杯,午(11时)餐前半小时服。
    --------------------------
    下午——

    3、肉桂枸杞饮(腰酸无力者可用):
    肉桂1克,枸杞6克
    开水泡服,一杯,晚(5时)餐前半小时服。晚餐忌食油腻酸性食品。
    --------------------------
    晚间——

    4、鲜山楂一个(去籽),或冰糖葫芦一颗。
    嚼碎,满口觉酸时咽下。睡前服。

    睡前面南背北站立,双手食指堵住两耳,不透气为度,匀细呼吸60次。然后将两手搓烫,捂在后腰上令热。然后上床睡觉。
    --------------------------
    平时——

    5、五仁代茶饮:
    杏仁4,桃仁3,薏仁5,枣仁2,益智仁1克
    开水泡服,白天渴时即饮此水,最好上午九时、下午三时各服一杯。
    --------------------------
    注意:
    每日尽量得阳光照射半小时以上,劳逸结合,无使太过。
    禁止饮食不节、起居无常、房劳伤精等慢性自戕行为。

    调整以一月为期,可常年保持。
    --------------------------
    附——

    复泰五行蔬菜汤:
    (全家量)胡萝卜2两,土豆5两,豆腐4两,香菇(次日换海带,两种交替用)1两,白菜绿叶3两
    (一人量)胡萝卜一根,土豆(大的一个,小的两个),豆腐四分之一块,香菇(海带手掌大四片)6个,白菜绿叶3叶
    五斤水煮前四种,水开后小火煮一小时,将白菜绿叶放入,闷十分钟(一人量用二斤水)。放入盐6克,花椒面2克,香油数滴,调匀。晚饭时食菜一碗,饮汤一碗。全家同食。不吃主食。
    --------------------------
    说明:以上方法可以同时全用,也可以选择使用。如果时间实在不方便,建议尽量用1、5方与五行蔬菜汤调养。
    Posted Sep 16 2006, 02:30 PM by wicky with no comments
    Filed under:
  • Linux下NFS的配置与注意的问题

    http://www.channel7.cn/2004/10-9/195838.html

    1.什么是NFS(Network FileSystem)
     NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun 所发展出来的。他最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 ( share file ),所以,也可以简单的将他看做是一个 file server 呢!这个 NFS Server 可以让你的 PC 来将网络远程的 NFS 主机分享的目录,挂载到本地端的机器当中,所以,在本地端的机器看起来,那个远程主机的目录就好象是自己的 partition 一般!
     虽然 NFS 有属于自己的协议与使用的 port number ,但是在资料传送或者其它相关讯息传递的时候, NFS 使用的则是一个称为远程过程调用( Remote Procedure Call, RPC )的协议来协助 NFS 本身的运作!

    2.RPC
     当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的IP、服务的 port number、与对应到的服务之 PID 等等,都需要管理与对应!这些管理 port 的对应与服务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了
     NFS 本身的服务并没有提供资料传递的协议,但是 NFS 却能让我们进行档案的分享,这其中的原因,就是 NFS 使用到一些其它相关的传输协议!而这些传输的协议,就是使用到这个所谓的 RPC 的功能啰!这也就是说, NFS 本身就是使用 RPC 的一个 program 就是了!说的更白话一点, NFS 也可以视作是一个 RPC server 啦!同时要注意到的是,在某些状况中,不但跑 NFS 的 Server 需要激活 RPC 的服务,连带的,要挂载 NFS partition 的 Client 机器,也需要同步激活 RPC 才行!这样 Server 端与 Client 端才能藉由 RPC 的协议来进行 program port 的对应喔!NFS 主要在管理分享出来的目录,而至于资料的传递,就直接将他丢给 RPC 的协议来运作就是了!

    3.NFS 激活的 RPC daemons
     o rpc.nfsd:这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其中还包含这个登入者的 ID 的判别
     o rpc.mountd:这个 daemon 主要的功能,则是在管理 NFS 的档案系统!当 Client 端顺利的通过 rpc.nfsd 而登入主机之后,在他可以使用 NFS server 提供的档案之前,还会经过档案使用权限 ( 就是那个 -rwxrwxrwx 与 owner, group 那几个权限啦 ) 的认证程序!他会去读 NFS 的设定档 /etc/exports 来比对 Client 的权限,当通过这一关之后, Client 就可以取得使用 NFS 档案的权限啦!(注:这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方哩)

    4.NFS需要有两个套件才行,分别是:
     nfs-utils
     就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其它相关 documents 与说明文件、执行档等的套件!这个就是 NFS 的主要套件
     portmap
     就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC server program,而要激活任何一个 RPC server program 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才行,这个工作其实就是『 portmap 』这个服务所负责的!也就是说,在激活任何一个 RPC server 之前,我们都需要激活 portmap 才行呢!那么这个 portmap 到底在干嘛呢?就如同这个服务的名称,哈哈!就是作 port 的 mapping 啊!举个例子来说:当 Client 端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的 port 才能够使用 RPC server 所提供的服务,因此, Client 首先就会去跟 portmap 讲『喂!可不可以通知一下,给我个 port number ,好让我可以跟 RPC 联络吧!』这个时候 portmap 就自动的将自己管理的 port mapping 告知 Client ,好让他可以连接上来 server 呢!所以啰:『激活 NFS 之前,请先激活 portmap !』

    5.NFS server端的设定:
     a)./etc/exports
     分享的目录 主机名称1或IP1(参数1,参数2) 主机名称2或IP2(参数3,参数4)
     b).参数
     rw: 可擦写的权限
     ro: 只读的权限
     no_root_squash: 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
     root_squash: 在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个身份;
     all_squash: 不论登入 NFS 的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是 nobody 啦!
     anonuid: 前面关于 *_squash 提到的匿名使用者的 UID 设定值,通常为 nobody,但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中!
     anongid: 同 anonuid ,但是变成 group ID 就是了
     sync: 资料同步写入到内存与硬盘当中
     async: 资料会先暂存于内存当中,而非直接写入硬盘

    6.设置的实例:
     a). /tmp *(rw,no_root_squash)  //*号表示所有的IP都可以访问
     b). /tmp *(rw)
      /home/public 192.168.0.*(rw) *(ro)  //下面两行作用一样
      /home/public 192.168.0.0/24(rw) *(ro)
     c). /home/test 192.168.0.100(rw) //只对某部机器设置权限
     d). /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) //当*.linux.org登陆此NFS主机,并且在/home/linux下面写入档案时,该档案的所有人与所有组,就会变成/etc/passwd里面对应的UID为40的那个身份的使用者了.
     
    7.权限问题
    假设/etc/exports里面的内容为
     #vi /etc/exports
     /tmp *(rw,no_root_squash)
     /home/public 192.168.0.*(rw) *(ro)
     /home/test 192.168.0.100(rw)
     /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)
     假设我们在192.168.0.100这个client端登陆此NFS主机(192.168.0.2),那么
     情况一:在192.168.0.100的帐号为test这个身份,同时,NFS主机上也有test这个帐号
      a).由于NFS主机的/tmp权限为-rwxrwxrwt,所以我(test在192.168.0.100上)在/tmp下面具有存取的权限,并且写入档案的所有人为test.
      b).在/home/public中,由于我有读写的权限,如果NFS主机在/home/public这个目录的权限对于test开放写入的话,那么就可以读写,并且写入档案的所有人是test。如果NFS主机的/home/public对于test这个使用者并没有开放写入权限时,那就无法写入,虽然/etc/exports里面是rw,也不起作用.
      c).在/home/test中,权限与/home/public有相同的状态,需要NFS主机的/home/test对于test有开放的权限.
      d).在/home/linux当中,不论是何种的user,身份都会被变成UID=40的这个帐号
     情况二:如果我们在192.168.0.100的身份为test2,但是NFS主机却没有test2这个帐号时
      a).在/tmp下还是可以写入,但是写入的档案所有人变成nobody.
      b).在/home/public与/home/test里面是否可以写入,还需要看/home/public的权限而定,不过身份就被变成nobody了
      c)/home/linux下的身份还是变成UID=40的帐号.
     情况三:在192.168.0.100的身份为root
      a).在/tmp里面可以写入,但是由于no_root_squash的参数,改变了预设的root_squash的设定值,所以在/tmp写入档案的所有人为root了.
      b).在/home/public底下的身份被压缩成了nobody,因为预设的属性都具有root_squash,所以档案所有人就变成了nobody.
      c)./home/test情况与/home/public相同.
      d)./home/linux中,root的身份也被压缩成UID=40的那个使用者了.

    8.启动服务portmap,nfs
     #/etc/rc.d/init.d/portmap start  (or:#service portmap start)
     #/etc/rc.d/init.d/nfs start   (or:#service nfs start)
     可以到/var/log/messages里面查看是否正确激活
    9.exportfs的用法
     如果我们修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可
     语法: exportfs [-aruv]
     -a: 全部挂载(或卸载) /etc/exports档案内的设定
     -r: 重新挂载/etc/exports里面的设定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的内容
     -u:卸载某一目录
     -v:在export的时候,将分享的目录显示到荧屏上.
     例子
     #exportfs -rv //重新export一次
     #exportfs -au //全部卸载

    10./var/lib/nfs/xtab里面可以查看每个目录的分享权限(但是我怎么也没有找到,靠,找到了,原来要有人mount上nfs后才会出现内容),如:
    /tmp    node3(ro,sync,wdelay,hide,secure,root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
     为什么anonuid=-2呢?呵呵!其实它说的是将 65536 - 2 的值,也就是 65534 的那个 UID 啦!对照一下 /etc/passwd ,你就会发现,哇!原来那就是 nobody 的啦

    11.showmount命令
     语法: showmount [-ae] hostname
     -a: 显示目前主机与client所连上来的使用目录的状态
     -e: 显示hostname的/etc/exports里面共享的目录

    12.查看激活的portnumber
     #netstat -utln
     nfs 自己所开启的 port ,就是那个 2049 的 port 啦!就是 NFS 主要产生的 port NFS server 在前面我们就提过了,他是 RPC server 的一种,而 NFS 由于提供了多个 program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... ) ,因此就需要激活多个 port 了!而且这些 port 是『随机产生的』,也就是那个 port number 不会是固定的啦!每次 restart nfs 都会得到不一样的 port number 呢!那么 Client 端怎么知道要连接上那个 port 来呼叫需要的 program 呢?呵呵!那就是 sunrpc ( port 111 ) 那个 portmap 服务所产生的 port number 的功用啦!Client 会先连接到 sunrpc 那个 port 去知道应该到那个 port 去呼叫所需要的程序!所以啰, rpc.xxxx 等之类的 daemon 自然就不需要有固定的 port number 啰!

    ***********************************************
    NFS客户端的设定
     #mount -t nfs hostname(orIP):/directory /mountpoint   搞定,就这么简单
     为了担心会不小心将 NFS 端挂进来的具有 SUID 权限档案的程序执行,root可以将NFS 所分享的目录以较为安全的情况挂载进来,可以
     #mount -t nfs -o nosuid,ro hostname:/directory /mountponit

    可能出问题的地方:
    1.权限的设定不符合
    2.忘记了激活portmap,此时会报错:
     mount: RPC: Port mapper failure - RPC: Unable to receive 或者
     mount: RPC: Program not registered
     那么,启动portmap,并且重新启动nfs
     #service portmap start
     #service nfs restart
    3.被防火墙搞掉
     重新设置防火墙,包括iptables与TCP_Wrappers,因为激活了portmap,所以port 111必须提供出去.因此在iptables rules中,要增加:
     iptables -A INPUT -p TCP --dport 111 -j ACCEPT
     iptables -A INPUT -p UDP --dport 111 -j ACCEPT
     如果还不行,那就是TCP_Wrappers的问题,检查/etc/hosts.deny,如果有一行是:
      ALL: ALL: deny
     那就必须在/etc/hosts.allow中增加:
      portmap: ALL: allow
     如果我们的NFS针对内部网络开发,对于外部网络只对学术网络开发(140.0.0.0/8),可以:
      iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
     还可以使用TCP_Wrappers,在/etc/hosts.allow里面规定连上 NFS 主机的主机 IP 与名称,例如
     #vi /.etc/hosts.allow
     portmap: 192.168.0.0/255.255.255.0 :allow
     portmap: 140.113.23.23    :allow
     portmap: .sdu.edu.cn    :allow
     
    RPC Server的相关命令
     rpcinfo
     #rpcinfo -p hostname(orIP)
     
    要注意的问题:
     需要注意的是,由于 NFS 使用的这个 RPC 在 client 端连上主机时,那么你的主机想要关机,那可就会成为『不可能的任务』!我还不知道正确的原因是什么,但是,如果你的 Server 上面还有 Client 在联机,那么你要关机,可能得要等到数个钟头才能够正常的关机成功!嗄!真的假的!不相信吗?不然您自个儿试试看! ^_^!所以啰,建议您的 NFS Server 想要关机之前,能更先『关掉 portmap 与 nfs 』这两个东西!如果无法正确的将这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!
     
     在TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS时候报错为:
      portmap: server localhost not responding, timed out
     解决办法:
      mount -t nfs -o nolock node1:/public /public
     即增加-o nolock参数,原因:
     Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started (which again requires the portmapper to be installed etc.)

    Posted Sep 14 2006, 02:42 PM by wicky with no comments
    Filed under:
  • Disable Debug Popup Window

    Rename this registry key:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

     

    Posted Sep 12 2006, 02:38 PM by wicky with no comments
    Filed under:
  • Windows Vista RC1 and IIS 7.0 RC1 ...

    Windows Vista Release Candidate (RC) 1 is out the door with a fresh new build of IIS7. 

    This is new web site for IIS 7 : http://www.iis.net 

     

  • "The type 'foo' exists in both 'some dll' and 'another dll'" when publishing asp.net project

    Try these:

    1) Check "Use fixed naming and single page assemblies" on publish screen

    2) Modify web.config
    <configuration ...>
      <system.web>
       
    <compilation ... batch="false"/>
          ...

    Posted Sep 07 2006, 02:17 PM by wicky with no comments
    Filed under:
  • Ollydbg常用断点函数

     
     
    1、限制程序功能函数

    EnableMenuItem 允许、禁止或变灰指定的菜单条目
    EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)
     
    2、对话框函数

    CreateDialog 从资源模板建立一非模态对话窗
    CreateDialogParam 从资源模板建立一非模态对话窗
    CreateDialogIndirect 从内存模板建立一非模态对话窗
    CreateDialogIndirectParam 从内存模板建立一非模态对话窗

    DialogBox 从资源模板建立一模态对话窗
    DialogBoxParam 从资源模板建立一模态对话窗
    DialogBoxIndirect 从内存模板建立一模态对话窗
    DialogBoxIndirectParam 从内存模板建立一模态对话窗
    EndDialog 结束一模态对话窗

    MessageBox 显示一信息对话框
    MessageBoxEx 显示一信息对话框
    MessageBoxIndirect 显示一定制信息对话框

    GetDlgItemInt 得指定输入框整数值
    GetDlgItemText 得指定输入框输入字符串
    GetDlgItemTextA 得指定输入框输入字符串
    Hmemcpy 内存复制 (非应用程序直接调用)

    3、磁盘处理函数1273?GAMEHK所有--admin?11326 

    GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
    GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息
    GetDriveTypeA 判断一个磁盘驱动器的类型
    GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母
    GetFullPathNameA 获取指定文件的详细路径
    GetVolumeInformationA 获取与一个磁盘卷有关的信息  
    GetWindowsDirectoryA 获取Windows目录的完整路径名
    GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名

    4、文件处理函数 

    CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
    OpenFile 这个函数能执行大量不同的文件操作
    ReadFile 从文件中读出数据
    ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
    WriteFile 将数据写入一个文件 
    WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调
    SetFilePointer 在一个文件中设置当前的读写位置  
    SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾
    CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等
     
    _lcreat 创建一个文件
    _lopen 以二进制模式打开指定的文件
    _lread 将文件中的数据读入内存缓冲区
    _lwrite 将数据从内存缓冲区写入一个文件
    _llseek 设置文件中进行读写的当前位置
    _lclose 关闭指定的文件
    _hread 将文件中的数据读入内存缓冲区  
    _hwrite 将数据从内存缓冲区写入一个文件

    OpenFileMappingA 打开一个现成的文件映射对象
    CreateFileMappingA 创建一个新的文件映射对象
    MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间
    MapViewOfFileEx (内容同上)

    CreateDirectoryA 创建一个新目录
    CreateDirectoryExA 创建一个新目录
    RemoveDirectoryA 删除指定目录
    SetCurrentDirectoryA 设置当前目录

    MoveFileA 移动文件
    DeleteFileA 删除指定文件
    CopyFileA 复制文件
    CompareFileTime 对比两个文件的时间
    SetFileAttributesA 设置文件属性
    SetFileTime 设置文件的创建、访问及上次修改时间
    FindFirstFileA 根据文件名查找文件
    FindNextFileA 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
    FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
    SearchPathA 查找指定文件

    GetBinaryTypeA 判断文件是否可以执行
    GetFileAttributesA 判断指定文件的属性
    GetFileSize 判断文件长度
    GetFileTime 取得指定文件的时间信息
    GetFileType 在给出文件句柄的前提下,判断文件类型

    5、注册表处理函数

    RegOpenKeyA 打开一个现有的注册表项
    RegOpenKeyExA 打开一个现有的注册表项
    RegCreateKeyA 在指定的项下创建或打开一个项
    RegCreateKeyExA 在指定项下创建新项的更复杂的方式
    RegDeleteKeyA 删除现有项下方一个指定的子项
    RegDeleteValueA 删除指定项下方的一个值
    RegQueryValueA 获取一个项的设置值
    RegQueryValueExA 获取一个项的设置值
    RegSetValueA 设置指定项或子项的值
    RegSetValueExA 设置指定项的值
    RegCloseKey 关闭系统注册表中的一个项(或键)

    6、时间处理函数

    CompareFileTime 比较两文件时间
    GetFileTime 得文件建立,最后访问,修改时间
    GetLocalTime 得当前本地时间
    GetSystemTime 得当前系统时间 
    GetTickCount 得windows启动至现时毫秒 
    SetFileTime 设置文件时间
    SetLocalTime 设置本地时间
    SetSystemTime 设置系统时间

    7、进程函数

    CreateProcessA 创建一个新进程
    ExitProcess 以干净的方式关闭一个进程
    FindExecutableA 查找与一个指定文件关联在一起的程序的文件名
    FreeLibray 释放指定的动态链库
    GetCurrentProcess 获取当前进程的一个伪句柄
    GetCurrentProcessId 获取当前进程一个唯一的标识符
    GetCurrentThread 获取当前线程的一个伪句柄
    GetExitCodeProces 获取一个已结束进程的退出代码
    GetExitCodeThread 获取一个已结束线程的退出代码
    GetModuleHandleA 获取一个应用程序或动态链接库的模块句柄
    GetPriorityClassA 获取特定进程的优先级别

    LoadLibraryA 载入指定的动态链接库,并将它映射到当前进程使用的地址空间
    LoadLibraryExA 装载指定的动态链接库,并为当前进程把它映射到地址空间
    LoadModule 载入一个windows应用程序,并在指定的环境中运行

    TerminateProcess 结束一个进程

    -----------------------------------------------------------------------7433?GAMEHK所有--admin?19214 
    8、断点设置列表

    一般处理
    bpx hmemcpy
    bpx MessageBox
    bpx MessageBoxExA
    bpx MessageBeep
    bpx SendMessage

    bpx GetDlgItemText
    bpx GetDlgItemInt
    bpx GetWindowText
    bpx GetWindowWord
    bpx GetWindowInt
    bpx DialogBoxParamA
    bpx CreateWindow
    bpx CreateWindowEx
    bpx ShowWindow
    bpx UpdateWindow

    bmsg xxxx wm_move
    bmsg xxxx wm_gettext 
    bmsg xxxx wm_command 
    bmsg xxxx wm_activate

    时间相关

    bpint 21 if ah==2A (DOS)
    bpx GetLocalTime
    bpx GetFileTime
    bpx GetSystemtime

    CD-ROM 或 磁盘相关

    bpint 13 if ah==2 (DOS)
    bpint 13 if ah==3 (DOS)
    bpint 13 if ah==4 (DOS) 
    bpx GetFileAttributesA
    bpx GetFileSize
    bpx GetDriveType
    bpx GetLastError
    bpx ReadFile
    bpio -h (Your CD-ROM Port Address) R

    软件狗相关

    bpio -h 278 R
    bpio -h 378 R 

    键盘输入相关

    bpint 16 if ah==0 (DOS)
    bpint 21 if ah==0xA (DOS)

    文件访问相关

    bpint 21 if ah==3dh (DOS)
    bpint 31 if ah==3fh (DOS)
    bpint 21 if ah==3dh (DOS)
    bpx ReadFile
    bpx WriteFile
    bpx CreateFile
    bpx SetFilePointer
    bpx GetSystemDirectory 

    INI 初始化文件相关

    bpx GetPrivateProfileString
    bpx GetPrivateProfileInt
    bpx WritePrivateProfileString
    bpx WritePrivateProfileInt

    注册表相关

    bpx RegCreateKey
    bpx RegDeleteKey
    bpx RegQueryValue
    bpx RegCloseKey
    bpx RegOpenKey

    注册标志相关

    bpx cs:eip if EAX==0

    内存标准相关

    bpmb cs:eip rw if 0x30:0x45AA==0

    显示相关

    bpx 0x30:0x45AA do "d 0x30:0x44BB"
    bpx CS:0x66CC do "? EAX"

    PS:最近在学破解,什么脱壳加客修改信息的搞的头晕晕的...看来技术说起来容易做起来难啊~努力!
    这个就是在脱壳时比较经常用到的一个软件的常用函数.看的头晕...
     
  • ABCpdf.NET 的简易使用指南

    ABCpdf.NET 的简易使用指南

      简单介绍

       iTextSharp是一个很强大的动态创建pdf的工具, 可是缺少一个可以直接转换html到pdf的功能, 而这个功能用ABCpdf.NET轻而易举的实现, 特此向大家介绍一下ABCpdf的用法
       当然, iTextSharp是免费的, ABCpdf是需要付费的

      First, 我们要把ABCpdf这个dll加入到工程的引用

      Secod,  然后using其命名空间

      using WebSupergoo.ABCpdf5; //一般加入这个声明就够了,下面2个基本上很少有用
      using WebSupergoo.ABCpdf5.Objects;
      
    using WebSupergoo.ABCpdf5.Atoms; 

      安装和分发:

      ABCpdf的功能全部是2个DLL提供的

      ABCpdfCE5.DLL 核心引擎库
      ABCpdf.DLL dotNET接口库

      它的安装程序会自动的把ABCpdf.dll加入到GAC, 把ABCpdfCE5.dll复制到System32目录下

      对于我们开发来说,最简单的莫过于将这2个DLL都放置到BIN目录下即可

      开始使用: 

      Doc theDoc = new Doc();  //创建一个Doc对象

     

    XSettings.License = "change this text to your key"//分发正式程序的时候需要设置License

      如果是分发演示程序, 则可以设置为从PDFSettings这个程序里取得的试用授权码

        theDoc.SetInfo(0"License""cd9b5c07db69df2bf57c0a04d9bca58b10c44889c9fb197984e592f49addfce5ec5fe85d7b9205bc");

      字体和语言

      如果你要输出的是英文文档,一般直接用其内置的基本字体就可以了。

      基本字体包括:

      Times-Roman
      Times-Bold
      Times-Italic
      Times-BoldItalic
      Helvetica
      Helvetica-Bold
      Helvetica-Oblique
      Helvetica-BoldOblique
      Courier
      Courier-Bold
      Courier-Oblique
      Courier-BoldOblique
      Symbol
      ZapfDingbats

      pdf的中文字体有2种实现,一种是内嵌字体(Embed),就是把用到的汉字的字体部分保存到pdf,这样即使在没有安装那种字体的机器上也能看到正确的字体显示,优点是文档在不同机器上的效果都能保持一致, 且显示的效率也比较高, 缺点就是文档会变大一点, 嵌入字体的时候可以通过设置subset来确定是否嵌入整个字体还是只有用到的部分 

      int theFont = theDoc.EmbedFont("Verdana""Latin"falsetrue);
      theDoc.FontSize 
    = 12//设置默认字体大小

      这句表示嵌入一个Verdana的拉丁字体, false 代表水平显示, true 代表嵌入子集(这个我也没搞太明白)

      theFont是返回字体的Object ID,这个ID可以直接赋给theDoc.Font来设置其为默认字体

      另一种是引用字体(Refs), 这种方式因为是引用, 所以不会导致文档变大, 但是引用的方式必须要求观看文档的时候需要用较新版本的Acrobat (Reader), 并且必须安装有语言包才能正确显示文档

      theDoc.Font = theDoc.AddFont("隶书""ChineseS"); 

      加入引用隶书这个中文字体, ChineseS是代表简体中文, 还有: Latin, Unicode, Korean, Japanese, ChineseT可以选择

      字体的名字还可以用其英文(eg: LiSu)或文件名(eg: SIMLI.TTF)指示


      坐标系

      pdf的坐标系不同于Windows所用的左上为原点的坐标系, 它是采用左下为坐标原点的, 如果你实在不习惯使用这种坐标,你可以通过设置Doc的TopDown为true来改变原点的位置

      Doc.Rect属性可能是最重要的属性了, 如果要输出什么东西的话, 都是输出到Rect所指定的矩形范围内

      ABCpdf默认的文档大小为612x792 pixel,也就是8.5x11 inch, 默认DPI为72

      HTML / CSS 呈现

      ABCpdf完全支持HTML和CSS

      ABCpdf使用Internet Explorer的HTML引擎来解析和预处理要插入到pdf的HTML

      屏幕的解析度通常是96 dpi, 而pdf的dpi为72, 因此打印出来的文档会比屏幕上看到的要大

      你可以使用CSS中的page-break-before, page-break-after 和 page-break-inside来控制分页, 但是需要注意以下的代码: 

      <div style="page-break-before:always">&nbsp;</div> 

      ... 会分页 ...  

      <div style="page-break-before:always"></div>

      ... 则不会分页, 我估计是因为空对象被优化掉了

      下面的代码演示如何转换html到pdf 

      theDoc.Rect.Inset(2448);
      
    //Rect默认是文档整个页面大小, 这里的Inset表示将Rect左右留出24的空白,上下留出48的空白
      int theID = theDoc.AddImageUrl(edtURL.Text);
      
    while (true)
      
    {
        
    if (!theDoc.Chainable(theID))
          
    break;
        theDoc.Page 
    = theDoc.AddPage();
        theID 
    = theDoc.AddImageToChain(theID);
      }

      后面的这个循环很重要, 不然的话, 就只能把html输出到一页, 这一点不像iTextSharp是自动分页的

      把一个复杂内容输出为多页, 都要采用这种循环加入Chain的方式, 比如需要添加很长一段的html或text

      代码很简单, 无需多说, 需要注意的是HTML不管动态的还是静态的, 都应该没有问题, 但是如果是类似BBS之类基于Cookie的动态页面的话, 会取不到需要的页面的

      再补充一点, 因为ABCpdf.NET本身是具有缓存设计的, 其获得网页是通过IE来获取的, 因此转换动态HTML的时候, 有可能会遇到没有更新的问题, 具体的描述请参阅帮助, 我就不多费口舌了

      图像处理

      用ABCpdf展现图片有2种方式, 一种是直通模式, 直接把图片添加到Doc对象里, 比如使用 Doc.AddImageFile, Doc.AddImageData方法

      另一种是是非直接的方式, 在添加图像对象到文档之前, 先把数据画到图像对象里

      相比之下, 非直接的方式有以下优点

      因为每张图在转换为图像对象的时候就已经完全解码, 因此在这个时候就能够捕获到图像文件格式无效之类的错误, 虽然有问题的图像不是经常遇到, 但是如果你使用直通模式的话, 则很有可能导致pdf把有问题的图像文件包含进去, 从而导致pdf文档在浏览的时候报告错误

      当然使用直通模式不需要解压和压缩图像, 会比非直接模式执行速度要快

      Image对象一般使用Flate来压缩, 这种压缩方式与PNG图像的压缩方法一样, 这是一种无损的压缩方法, 这样可以保证图像的品质不会变差, 如果加入的图像是黑白的, ABCpdf会使用CCITT G4 fax压缩, 这种方法可以显著的减小图像的大小

      下面这段代码就是采用的非直接模式来添加一个图像到指定的位置

      XImage theImg = new XImage();
      theImg.SetFile(
    @"C:\Cover.jpg");
      theDoc.TopDown 
    = true;
      theDoc.Rect.Left 
    = 100;
      theDoc.Rect.Top 
    = 100;
      theDoc.Rect.Width 
    = theImg.Width;
      theDoc.Rect.Height 
    = theImg.Height;
      theDoc.Rect.Magnify(
    22);  //把图像放大2倍
      theDoc.AddImageObject(theImg, false);

      Grid & Rect 

      theDoc.Page = theDoc.AddPage(); //准备输出内容到新的一页
      theDoc.AddGrid(); //这个是让页面输出类似坐标纸样的表格, 可以帮助开发者更好地定位输出
      theDoc.Color.String = "0 255 0"//设置默认颜色为绿色
      theDoc.Width = 4// 这个是设置刷子的宽度为4
      theDoc.Rect.Position(100200); //指定左下角输出位置为100,200
      theDoc.Rect.Width = 400;
      theDoc.Rect.Height 
    = 500;
      theDoc.FrameRect(); 
    //画Rect的边框

      Header & Footer

      如果我们是用PDF作为报表输出的话, 当然需要在每一页上出现表头和页脚

      theDoc.Rect.String = "24 750 588 778";  //直接通过这种方式指定表头输出区域
      theDoc.HPos = 0.5//居中, 0代表居左, 1代表居右
      theDoc.VPos = 0.5//居中, 0代表靠上, 1代表靠下
      theDoc.Color.String = "0 0 255"//蓝色
      for (int i = 1; i <= theDoc.PageCount; i++)
      
    {
        theDoc.PageNumber 
    = i;
        theDoc.AddHtml(
    "this is <b><font pid=" + theFont.ToString() + ">header</font></b>");
        
    // ABCpdf支持html语法, 这里的font标签可以让你选择使用不同的字体输出
        theDoc.AddLine(24750588750); //画一条分隔线
      }

      画页脚和画页头是一样的, 主要就是位置和内容有不同

      theDoc.Rect.String = "24 12 588 40";
      theDoc.HPos 
    = 1.0//Right
      theDoc.VPos = 0.5//Middle
      theDoc.Color.String = "0 0 255";
      
    for (int i = 1; i <= theDoc.PageCount; i++
      
    {
        theDoc.PageNumber 
    = i;
        theDoc.AddHtml(
    "<u>this is footer</u> " + i.ToString() + " / " + theDoc.PageCount.ToString());
        theDoc.AddLine(
    244058840);
      }

      压缩pdf

      在输出完所要输出的内容后, 我们可以调用Flatten来对生成的文档压缩一下, 因为加入的对象是分布在不同的层上, 所以调用这个函数可以合并当前页上的所有层, 同时重新压缩层上的数据

      如果页面上的对象比较少的话, 压缩后是看不出有明显的效果, 但是如果页面上是有很复杂的表格之类的话, 压缩率甚至可以高达5倍以上

      需要注意的是, 压缩之后, 之前保存的Object ID会不再有效, 因为对象已经被重新生成, 所以压缩操作最好放到最后来做 

      for (int i = 1; i <= theDoc.PageCount; i++
      
    {
        theDoc.PageNumber 
    = i;
        theDoc.Flatten();
      }

      更高级的应用

      ABCpdf还支持用AddMovies在pdf中嵌入Flash(SWF), AVI, MPEG和WMV

      ABCpdf支持创建电子表单, 不过这已经超过我使用的目的了, 因为我要做的是用pdf输出报表

      此外, 我感到不方便的就是,似乎ABC.net没有去封装文档属性里面的东西, 比如title, subject, author, 而是直接提供的Doc.SetInfo来修改, 而这个方法用起来不是很方便, 因为你必须要先了解Adobe PDF Specification, 才能用正确, 这一点上远不如iTextSharp方便

      ok, 就这么多了,写这个东西已经花了我不少的时间了

Copyright SDT, 2006-2009. All rights reserved.