??xml version="1.0" encoding="utf-8" standalone="yes"?>久久777国产线看观看精品,最新久久免费视频,国内精品久久久久久久coent http://www.shnenglu.com/justin-shi/<font>&nbsp;</font> zh-cnWed, 07 May 2025 13:40:47 GMTWed, 07 May 2025 13:40:47 GMT60daemon q程Z么要fork两次http://www.shnenglu.com/justin-shi/archive/2014/10/10/208530.htmlq幽q幽Fri, 10 Oct 2014 06:15:00 GMThttp://www.shnenglu.com/justin-shi/archive/2014/10/10/208530.htmlhttp://www.shnenglu.com/justin-shi/comments/208530.htmlhttp://www.shnenglu.com/justin-shi/archive/2014/10/10/208530.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/208530.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/208530.html  daemonq程是后台守护进E,有时候也叫精灵进E?agent).linux 下server都是daemonq程。相信大部分开发h员都知道如何d一个daemonq程。但是另一斚wQ大部分Z知道Z么要q么做,不少人是从某个地方copy一个函敎ͼ拿来M。但是具体ؓ(f)什么这么实玎ͼ却不是很透彻?/span>
  见过一些面试官或被面试人。很多h解释daemonq程存在的理由是因ؓ(f)僉|q程。或者输入输出。其实和q些东西一毛钱关系都没有。daemon函数存在的原因是因ؓ(f)控制l端׃某些原因Q如断开l端链接Q会(x)发送一些信L(fng)原因。而接收进城处理这些信L(fng)省动作会(x)让进E退出。这些信号会(x)׃l端上敲一些特D按键而生?br style="word-wrap: break-word;" />

  贴一个daemon函数常见的实?
 1 int daemon(void)
 2 {
 3     pid_t pid = fork();
 4 
 5     if( pid != 0 ) exit(0);//parent
 6 
 7     //first children
 8     if(setsid() == -1)
 9     {
10        printf("setsid failed\n");
11        assert(0);
12        exit(-1);
13     }
14 
15     umask(0);
16 
17 
18     pid = fork();
19 
20     if( pid != 0) exit(0);
21   
22     //second children 
23     chdir ("/");
24 
25     for (int i = 0; i < 3; i++)
26     {
27         close (i);
28     }
29 
30 
31     int stdfd = open ("/dev/null", O_RDWR);
32     dup2(stdfd, STDOUT_FILENO);
33     dup2(stdfd, STDERR_FILENO);
34 
35     return 0;
36 }
37 

    1 、第一ơfork的作用是让shell 认ؓ(f)本条命o(h) 已经l止Q不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是q程l组?group leader). 此时父进E是q程l组ѝ?/div>
    
    2 、setsid() 是本函数最重要的一个调用。它完成?jin)daemon函数惌做的大部分事情。调用完整个函数。子q程是会(x)话组?sid==pid)Q也是进E组l长(pgid == pid)Qƈ且脱M(jin)原来控制l端。到?jin)这一步,基本上不控制终端如何怎么栗新的进E都不会(x)收到那些信号?/div>
    3  、经q前?个步骤,基本惌做的都做?jin)。第2ơfork不是必须的。也看到很多开源服务没有forkW二ơ。forkW二ơ主要目的是。防止进E再ơ打开一个控制终端。因为打开一个控制终端的前台条g是该q程必须是会(x)话组ѝ再fork一ơ,子进EID != sidQsid是进E父q程的sidQ。所以也无法打开新的控制l端?/div>
    daemon目的是防止l端产生的一些信可q程退出。上面函数ƈ没有直接调用signal函数d理它。而是间接通过fork和setsid函数使用更少代码优雅处理。而被有些以ؓ(f)是僵死进E的原因需要这样处理?/div>
    当然Q也有很多程序不是像上面函数那样d现。而是直接通过忽略信号方式处理。这样其实也不错Q因些信号很会(x)有用到的价倹{直接忽略基本上不存在误杀的情c(din)反正达到最l目的就可以。条条大路通罗马?/div>
   下面|列一下控制终端会(x)产生哪些信号。程序中只要处理好这些信P同样能达C面函数实现的目的?/div>
   //后台q程d/写入l端输入产生下面两个信号Q或者控制终端不存在情况d和写入会(x)产生
   signal(SIGTTOU, SIG_IGN);
   signal(SIGTTIN, SIG_IGN);
   //按CTRL-C ,CTRL-\ CTRL-Z?x)向前台q程l发送下面这些信?/div>
   signal(SIGINT,  SIG_IGN );
   signal(SIGQUIT, SIG_IGN );
   signal(SIGTSTP, SIG_IGN );
   
   //l端断开Q会(x)l会(x)话组长或孤儿q程l所有成员发送下面信?/div>
   signal(SIGHUP,  SIG_IGN );
   q有有些信号也可以由l端shell产生Q需要关?/div>
   signal(SIGCONT, SIG_IGN );
   signal(SIGSTOP, SIG_IGN );
  上面q些信号Q应该有些程序缺省处理(SIG_DFLQ本w动作就是忽略(SIG_IGNQ,不是退?gu)E。不q按照上面写也不?x)造成什么问题?/div>


q幽 2014-10-10 14:15 发表评论
]]>ActiveXlg与JavaScript交互http://www.shnenglu.com/justin-shi/archive/2010/10/09/129125.htmlq幽q幽Fri, 08 Oct 2010 19:21:00 GMThttp://www.shnenglu.com/justin-shi/archive/2010/10/09/129125.htmlhttp://www.shnenglu.com/justin-shi/comments/129125.htmlhttp://www.shnenglu.com/justin-shi/archive/2010/10/09/129125.html#Feedback2http://www.shnenglu.com/justin-shi/comments/commentRss/129125.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/129125.html阅读全文

q幽 2010-10-09 03:21 发表评论
]]>
单的C++委托 —?用模板类实现cL员函数的回调http://www.shnenglu.com/justin-shi/archive/2010/10/04/128551.htmlq幽q幽Mon, 04 Oct 2010 01:10:00 GMThttp://www.shnenglu.com/justin-shi/archive/2010/10/04/128551.htmlhttp://www.shnenglu.com/justin-shi/comments/128551.htmlhttp://www.shnenglu.com/justin-shi/archive/2010/10/04/128551.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/128551.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/128551.html  
转自 http://www.shnenglu.com/Zezese/archive/2010/07/25/121247.html?opt=admin

1 
  2 
  3 
  4 
  5 template <class R, class P1, class P2>
  6 class IDelegate
  7 {
  8 public:
  9     virtual R Invoke(P1, P2) = 0;
 10 };
 11 
 12 
 13 template <class T, class R, class P1, class P2>
 14 class CDelegate : public IDelegate<R, P1, P2>
 15 {
 16 protected:
 17 
 18     typedef R (T::*pfnHandle)(P1, P2);
 19 
 20     const pfnHandle m_pfn;
 21 
 22     T* const m_pThis;
 23 
 24 public:
 25 
 26     CDelegate(T* const pThis, const pfnHandle pfn)
 27         :m_pThis(pThis), m_pfn(pfn)
 28     {
 29         if (m_pThis == NULL || m_pfn == NULL)
 30         {
 31             throw;
 32         } 
 33     }
 34 
 35     virtual R Invoke(P1 p1, P2 p2)
 36     {
 37         return (m_pThis->*m_pfn)(p1, p2);
 38     }
 39 
 40 };
 41 
 42 class CDelegateSource
 43 {
 44 public:
 45     CDelegateSource()
 46         : m_lpCallBack(NULL)
 47     {
 48     }
 49 
 50     void SetCallBack(IDelegate<boolintint>* newVal) 
 51     { 
 52         m_lpCallBack = newVal; 
 53     }
 54 
 55     void DoSomething()
 56     {
 57         for (int i = 0; i < 10; i++)
 58         {   
 59             if (m_lpCallBack != NULL)
 60             {
 61                 m_lpCallBack->Invoke(i, i * i);
 62             }
 63         }
 64     }
 65 
 66 private:
 67 
 68     IDelegate<boolintint>* m_lpCallBack;
 69 
 70 };
 71 
 72 class CDelegateTester
 73 {
 74 private:
 75 
 76     bool OnCallBack(int nParam1, int nParam2)
 77     {
 78         printf("OnCallBack -> nParam1:%d, nParam2:%d\r\n", nParam1, nParam2);
 79 
 80         return true;
 81     }
 82 
 83     CDelegate<CDelegateTester, boolintint> m_OnCallBack;
 84 
 85 public:
 86 
 87     CDelegateTester()
 88         : m_OnCallBack(this, OnCallBack)
 89     {
 90     }
 91 
 92     void Execute()
 93     {
 94         CDelegateSource src;
 95         src.SetCallBack(&m_OnCallBack);
 96         src.DoSomething();
 97     }
 98 };
 99 
100 void main()
101 {
102     CDelegateTester Tester;
103     Tester.Execute();
104 
105     getchar();
106 }
107 


q幽 2010-10-04 09:10 发表评论
]]>h图标~存http://www.shnenglu.com/justin-shi/archive/2010/09/12/126432.htmlq幽q幽Sat, 11 Sep 2010 17:19:00 GMThttp://www.shnenglu.com/justin-shi/archive/2010/09/12/126432.htmlhttp://www.shnenglu.com/justin-shi/comments/126432.htmlhttp://www.shnenglu.com/justin-shi/archive/2010/09/12/126432.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/126432.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/126432.html1SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST+SHCNF_FLUSH, 00);


q幽 2010-09-12 01:19 发表评论
]]>技术备忘录http://www.shnenglu.com/justin-shi/archive/2009/12/18/103441.htmlq幽q幽Fri, 18 Dec 2009 01:20:00 GMThttp://www.shnenglu.com/justin-shi/archive/2009/12/18/103441.htmlhttp://www.shnenglu.com/justin-shi/comments/103441.htmlhttp://www.shnenglu.com/justin-shi/archive/2009/12/18/103441.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/103441.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/103441.html转一些从shell32.dll导出的函?br>
外壳对话?br>
外壳对话框的U密

常见的Windows的通用对话框被装在Comdlg32.dllQ这l我们的~程提供?jin)很大的便利。但它还不够完整Q我们在pȝ里经常能看到大量的可重复使用的对话框,但在Windows的文档里你却找不到它们的调用Ҏ(gu)。而如果我们自己去做这L(fng)界面是非常费时费力的而且也是没有必要的,因ؓ(f)q些对话框实际上很容易得到。这里我要介l一些已l众所周知或不知的对话框,它们可以应用在我们的E序中ɽE序昑־非常友好和专业?br>
览文g夹对话框



?.23

大多数DelphiE序员都知道如何使用VCL的TOpenDialog控g来让用户览要打开的文件。然而有时你可能只想让用户选择文g夹而不是特定的文gQwindows已经提供?jin)一个这L(fng)对话框如?.23所C。我们可以通过公开的函数SHBrowseForFolder来调?(q个函数定义在ShlObj单元)Q函数定义如下:(x)

function SHBrowseForFolder(var BrowseInfo: TBrowseInfo): PItemIDList; stdcall;

q个函数只有一个参敎ͼ但这个参数是一个比较复杂的记录cd

    TBrowseInfo = packed record

      hwndOwner: HWND;

      pidlRoot: PItemIDList;

      pszDisplayName: PChar;

      lpszTitle: PChar;

      ulFlags: UINT;

      lpfn: TFNBFFCallBack;

      lParam: LPARAM;

      iImage: Integer;

    end;


hwndOwner数据成员包含对话框的父窗体的H口句柄Q可以把它设?。PIdlRoot数据成员指向一个PIDL的指针对应于对话框初始化时的根目录。指定了(jin)PIdlRoot后,只有根目录?qing)它的子目录会(x)出现在对话框中。可以设定它为nilQ这时缺省的根目录是桌面QpszDisplayName 数据成员指向一个缓冲区可以用来储存被用户选中的文件名Q缓冲区的大至ؓ(f)MAX_PATH q个常数那么大,否则遇到特别长的文g名会(x)溢出。lpszTitle 数据对象指向一个以nulll尾的字W串Q字W串作ؓ(f)对话框的标题来显C。注意标题不要太长,否则昄时会(x)被截断。ulFlags 标志数据对象用来限制在对话框中显C的文g夹类型。可以设定它?或下列值的l合Q?br>
    //在对话框中会(x)包含一个状态区Q回调函数可以通过向对话框发送消息来讑֮状?br>
BIF_STATUSTEXT

    //只允?dng)R择标准文gpȝQ若选了(jin)非标准的文g夹如打印机,认按钮?x)变?br>
    BIF_RETURNONLYFSDIRS   = $0001;

    //不选择|络文g?br>
    BIF_DONTGOBELOWDOMAIN  = $0002;

    // l状态条留出I白

    BIF_STATUSTEXT         = $0004;

    // 只选择文gpȝ的上U目?br>
    BIF_RETURNFSANCESTORS  = $0008;

    //只选择计算?br>
    BIF_BROWSEFORCOMPUTER  = $1000;

    //只选择打印?br>
    BIF_BROWSEFORPRINTER   = $2000;

    //包括文g也可以?br>
    BIF_BROWSEINCLUDEFILES = $4000;


注意Q如果你惛_话框昄lpszTitle里的用户定制的状态条信息Q必d?BIF_STATUSTEXT标识。Lpfn数据对象是一个回调函数类型的指针Q函数类型如下:(x)

    TFNBFFCallBack = function(DialogHandle: HWND;

      MessageID: UINT; PIDL: PItemIDList; Data: LPARAM):Integer; stdcall;


q是一个回调函敎ͼ可以用来在同用户交互时控制和更新对话框的昄。如果你不想控制对话框,可以把它设成nilQlParam 数据对象允许你在回调函数中以参数l(f)pfn形式q回一个指针(通常我们用它来返回对象)(j)Q当然也可以把它设成?。IImage数据成员不需要设|,因ؓ(f)它是用来接收pȝ中同文g夹相关的图标列表索引的,我们q里讑֮??br>
SHBrowseForFolder函数q回一个唯一的指向被选择的文件夹的PIDL。如果文件夹是一个传l的文g对象的话Q可以用函数SHGetPathFromIDList把PIDL转换为真实的目录。同Ӟ作ؓ(f)调用者,必须负责释放被返回的item identifier listQ用IMalloc COM 接口来释放?br>
注意Q不要用FreeMem或其他方法来释放 PIDL Q这是因为外壳的内存理是独立的Q只能用IMalloc来释放?br>
现在我们已经可以昄对话框了(jin)Q那让我们更深入一步看看如何能够控制对用户动作的反应,q就要用C(jin)回调函数 TFNBFFCallBack?注意回调函数的意思就是,你只是实C(jin)它,pȝq道什么时候去调用它,好比一个守株待兔的例子?br>
DialogHandle参数代表对话框窗口句柄。通常可以用这个句柄给对话框发消息QMessageID 参数q不是一个TMessage l构的记录,它是对话框通过回调函数发给用户消息的,它可以是下面两个|(x)

    BFFM_INITIALIZED = 1;   // 对话框将要显C?br>
    BFFM_SELCHANGED  = 2; // 用户选中?jin)某?


PIDL参数包含其他的额外信息。如果MessageID ?BFFM_INITIALIZEDQPIDL等于nil。如果MessageID是BFFM_SELCHANGEDQPIDL的值将是一个PIDL 对应于用户选择的文件夹。Data 参数包含用户付给TbrowseInfo记录中的Lparam数据成员的|通常可以传递一个对象指针。下面是一个简单的回调函数的例子:(x)

    function BrowseForFolderCallback(DialogHandle: HWND;

      MessageID: UINT; PIDL: PItemIDList; Data: LPARAM):

      Integer;

    begin

      //响应对话框的通知消息

      case (MessageID) of

        BFFM_INITIALIZED:

          DialogInitialized(DialogHandle, Data);

        BFFM_SELCHANGED:

          HandleNewSelection(DialogHandle, PIDL, Data);

      end;

      Result := 0; // 总返?.

    end;


在回调函数里Q可以根据用L(fng)输入发送三个用L(fng)消息l对话框Q下面是消息ID:

    // 改变对话框的状态信?br>
    BFFM_SETSTATUSTEXT = WM_USER + 100;

    //控制定按钮失效与否

    BFFM_ENABLEOK      = WM_USER + 101;

    //改变选择的文件夹

    BFFM_SETSELECTION  = WM_USER + 102;


通常Q这些消息发送给对话框之根据用L(fng)选择更新昄Q当然你也可以发送其他的消息l对话框Q比如可以发送WM_SETTEXT消息来改变对话框的标题?br>
下面是一个发送消息的例子Q见?.11Q:(x)

PostMessage(DialogHandle, BFFM_SETSELECTION, True, LPARAM(PChar (NewPath)));

?.11

Message ID WParam LParam
BFFM_SETSTATUSTEXT 没有使用 一个指向新的状态信息的Pchar
BFFM_ENABLEOK 没有使用 True使得认按钮有效QFalse无效
BFFM_SETSELECTION 如果Lparam是\径则为TrueQ若Lparam是PIDL则ؓ(f)False 指向被选择的文件\径或PIDL的Pchar



另外要提到的是,Delphi也提供了(jin)对这个函数的装Q那是SelectDirectory函数?br>
关于对话?/strong>

通常我们都要在自qE序里加上一个关于对话框来显CZ些版本信息等{,W(xu)indows为我们提供了(jin)一个标准的对话框如?.24所C,可以在一定范围内对它定制Q不q它只适合昄单的标识和文本(我觉得用处极)(j)。我们可以通过函数ShellAbout来调用它Q声明在ShellAPI单元里)(j)Q函数定义如?

    function ShellAbout(Owner: HWND; ApplicationName: PChar;

      OtherText: PChar; IconHandle: HICON): Integer; stdcall;


Owner参数标识?jin)拥有对话框的父H体句柄Q通常设ؓ(f)0Q表明没有父H体。ApplicationName 参数包含对话框的标题Q字W串中可以包?#8220;#”字符Q它能v到分割符的作用。这U情况下Q函C(x)把分割符前的字符串作为标题栏Q分割符后的部分作ؓ(f) "Microsoft"字符串后的第一行。OtherText参数包含?jin)打显C在Microsoft 版本和版权信息后的字W串。IconHandle 参数标识?jin)打显C在对话框上的图标标识,如果设ؓ(f)0Q函C(x)昄Windows~省的图标?br>


?.24




?.25

格式化对话框

SHFormatDrive函数?x)显CZ个格式化对话框,如图2.25所C,它是一个半公开的函数。但现在它不在微软的SDK里。然而微软承认它的存在ƈ把它从Shell32.dll里用名字公开声明QDelphi中的函数定义如下Q?br>
    function SHFormatDrive(Owner: HWND; Drive: UINT;

      FormatID: UINT; OptionFlags: UINT): DWORD; stdcall;


Owner参数标识拥有对话框的H体句柄Q文档中推荐不要设ؓ(f)0Q但实际上好像没什么媄(jing)响。Drive参数是用来标识打格式化的驱动器的数|它是?为底的,从A开?A:=0,B:=1依此cL。FormatID 参数允许我们指定一个格式化的模板,通常情况下,只要赋gؓ(f)SHFMT_ID_DEFAULT可以了(jin)。OptionFlags 参数是一个选项掩码Q来定格式化的选项。当前有两个选项Q?br>
    SHFMT_OPT_FULL    = $0001; // 快速格式化

    SHFMT_OPT_SYSONLY = $0002; // 复制pȝ文g


如果函数调用p|Q会(x)q回下列错误中的一U来表明错误原因Q错误常数如下:(x)

    SHFMT_NOFORMAT = $FFFFFFFD;   // 驱动器无法格式化

    SHFMT_CANCEL   = $FFFFFFFE;   //格式化被取消?br>
    SHFMT_ERROR    = $FFFFFFFF; //其他错误


Windows NT ?WideChar

在进一步研I未公开的函数前, 我们必须清楚一点,对于未公开的函数来说以nulll尾的字W串cd参数大多数被声明为类型指针而不是PChar。这有点像陷阱,但必L认这是事实。在Win 9X上所有的字符串类型参数声明ؓ(f)PAnsiCharQ而在Windows NT上被声明为PWideChar。如果你想你的应用程序适应所有^収ͼ你必考虑两种情况Q在q行时要判断q_cdQ这是很讨厌的,但这也是使用未公开的API的代仗?br>
选择图标对话?/strong>



?.26

我们要讨论的W一个完全未公开的函数是PickIconDlg。如?.26所C个函C(x)昄一个对话框Q用户可以用来从文g中选择一个图标资源。它通常是用文gcd~辑器来兌图标和某一文gcd的,也会(x)在快h式对话框中被调用来修改快h式的图标。这个函CShell32.dll 用?2来公开出来Q函数定义如下:(x)

    function PickIconDlg(Owner: HWND; FileName: Pointer;

      MaxFileNameChars: DWORD; var IconIndex: DWORD):LongBool; stdcall;


Owner参数和上面的意义cM。FileName 参数指向一个缓冲区Q包含了(jin)被浏览图标的文g名,~冲不小于MAX_PATHQ?。MaxFileNameChars 指定字符数量大小。IconIndex 常数是以0为底的图标烦(ch)引,当对话框打开时会(x)把焦点定在IconIndex对应的图标上Q函数返回后QIconIndex指向最后被选的图标索引。如果用L(fng)?jin)取消按钮,函数q回False?br>
q行E序对话?/strong>




?.27

RunFileDlg函数是相当灵zȝQ如?.27所C就是调用开始菜单的q行子菜单后?x)显C的对话框,我们通过?1把它从Shell32.dll暴露出来。下面是函数声明Q?br>
    procedure RunFileDlg(Owner: HWND; IconHandle: HICON;

      WorkPath: Pointer; Caption: Pointer; Description: Pointer; Flags: UINT); stdcall;


Owner参数׃用再说了(jin)。IconHandle参数是显C在对话框上的图标句柄,如果为nilQ缺省的icon会(x)使用。WorkPath 参数指向一个字W串来指定应用程序运行的工作路径?Title 参数指向作ؓ(f)对话框标题的字符Ԍ如果为nilQ就使用~省的标题。Description 参数指向一个描q字W串Q主要是告诉用户如何dQ可以设为nilQ这时用缺省的描述?Flags参数用一l位掩码来设定对话框的属性。下面是定义Q?br>
    RFF_NOBROWSE      = $01;   // Ud览按钮

    RFF_NODEFAULT     = $02;   // 无缺省的选项

    RFF_CALCDIRECTORY = $04;   // 由文件名定工作路径

    RFF_NOLABEL       = $08;   // L~辑框标{?br>
    RFF_NOSEPARATEMEM = $20; // L在单独的内存I间q行的复选框 (只对NT有效)


q个对话框一个很好的Ҏ(gu)是允许你控制用户可以运行的应用E序。当用户选择?jin)确认按钮,对话框的父窗体?x)发送一个通知消息来传递将要运行的E序信息。通知消息是一?WM_NOTIFY消息Q它的通知代码讑֮为RFN_VALIDATE (-510)Q然后lParam指向一?TNM_RunFileDlg记录。定义如下:(x)

    TNM_RunFileDlg = packed record

      hdr: TNMHdr;

      lpFile: Pointer;

      lpDirectory: Pointer;

      nShow: LongBool;

    end;


hdr数据对象是TNMHdrcdQ它是一U标准的Windows数据cdQ每个WM_NOTIFY消息的lParam参数都会(x)指向q个数据成分。同时根据不同的消息cdQ可能一些额外的数据跟在记录后面Q标准的TNMHdr记录定义如下Q?br>
    TNMHdr = packed record

      hwndFrom: HWND;

      idFrom: UINT;

      code: UINT;

    end;


记录中的hwndFrom包含发送消息的H口句柄QidFrom则包含发送消息的控g标示W,code 中包含标识被发送的消息的通知代码?br>
在TNMHdr记录后被打包的额外数据包含三个数据成分:(x)LpFile指向一个包含将要运行的文g的\径字W串QLpDirectory指向正在q行E序的工作目录字W串Q最后,nShow 用来指定要q行的应用程序是否可见?br>
对于本文中特定的消息Q只对TNMHdr记录中的Code感兴,通过(g)验Code可以保我们收到一个运行文件校验消息,同时使我们可以存取额外的TNM_RunFileDlg数据成员。当TNMHdr记录中的code{于RFN_VALIDATE(-510)Ӟ可以获得一个TNM_RunFileDlg记录。下面是校验消息的代码:(x)

    var

      FileToRun: String;

      ...

      if TheMessage.Msg = WM_NOTIFY then

        if PNMHdr(TheMessage.LParam).code = RFN_VALIDATE then

          WideCharToStrVar(PNM_RUNFILEDLG(

          TheMessage.LParam).lpFile, FileToRun);

    ...


注意只有当我们已l检验TNMHdr的Code为RFN_VALIDATE后,才映LParam 参数为PNM_RunFileDlgcd?br>
通知消息的返回值决定了(jin)应用E序是否能够q行Q下面是可能的|(x)

    RF_OK     = $00; //允许E序q行

    RF_CANCEL = $01;   //取消操作Q关闭对话框

    RF_RETRY  = $02; //取消操作Q对话框仍然打开


查找文g对话?/strong>




?.28

调用查找文g对话框的函数是SHFindFilesQ对话框如图2.28所C。它是从Shell32.dll按烦(ch)引?0公开出来?

    function SHFindFiles(SearchRoot: PItemIDList;

      SavedSearchFile: PItemIDList): LongBool; stdcall;


SearchRoot 参数允许从一个特定的文g夹开始查找,同在资源理器中在文件夹上用右键点击查找菜单的效果是一L(fng)。如果设为nilQ那么查找是从桌面开始的?SavedSearchFile 参数让你指定一个以前查询保存的查找{略文gQ?.fnd文gQ,Ҏ(gu)以前的设定来查找Q若不需要的话可以设定ؓ(f)nil。如果你指定?jin)一个非I值的SearchRoot PIDLQ那么在调用完SHFindFiles后必负责释放掉。但是有点奇怪的是,如果你指定了(jin)一个非I的SavedSearchFile PIDL参数Q函数成功调用的话,你不能去释放q个 PIDLQ否则会(x)出错Q但如果调用p|?jin)的话,你必释攑֮?br>
同大多数对话框函C一Pq个函数是非模态的Q也是pȝ在另外一个独立的U程中启动对话框Q然后立卌回,对话框会(x)在你的程序结束后自动关闭。也是说你没有M直接的方法来告诉用户如何使用查找到的l果Q所以要想知道用h到的文g的话Q最好是让你的程序支持文件拖放,以便让用h扑ֈ的文件拖攄你?br>
查找?sh)脑对话?/strong>

同SHFindFiles比较接近的一个函数是SHFindComputerQ这个函数调用的l果同开始菜单上查找?sh)脑菜单调用的结果是一L(fng)。它的参数同SHFindFiles完全一P不同之处在于它完全忽略传递给它的参数Q很昄是保留v来ؓ(f)?jin)将来扩展的需要。这里我们只要把参数都设成nil可以了(jin)Q另外注意这个对话框也是非模态的?SHFindComputer 是从Shell32.dll 以烦(ch)引号91公开出来的:(x)

    function SHFindComputer(Reserved1: PItemIDList;

      Reserved2: PItemIDList): LongBool; stdcall;



查找文g对话?/strong>

通过调用GetFileNameFromBrowse函数可以调出q个对话框,不过说实在的Q它实际上只是GetOpenFileName 函数的简单封装。而我们常用的TOpenDialog控g也是对GetOpenFileName 函数装Q这个函数我们很会(x)ȝ接用它。不q还是写出来吧,它是从Shell32.dll里按索引?3公开出来的:(x)

    function GetFileNameFromBrowse(Owner: HWND;

      FileName: Pointer; MaxFileNameChars: DWORD;

      InitialDirectory: Pointer; DefaultExtension: Pointer;

      Filter: Pointer; Caption: Pointer): LongBool; stdcall;




?.29

大多数参数对应于OPENFILENAME l构的成员。Owner参数我想׃用再重复?jin)?FileName 参数指向一个初始化对话框编辑控制文件名的缓冲区Q函数返回后FileName包含被选择的文件\径,它的大小一般设成MAX_PATHQ?那么大。MaxFileNameChars 参数用来指定FileName~冲区的大小?InitialDirectory参数指向对话框初始化的目录名Q但如果FileName参数被指定了(jin)QInitialDirectory׃(x)被忽略而用FileName参数中的路径。DefaultExtension参数指向一个包含要搜烦(ch)的缺省扩展名的字W串。Filter参数指向一个以nulll尾的可以用来在下拉列表中限定文件类型的qo(h)字符丌ӀCaption参数指向对话框标题字W串?br>
如果用户选择?jin)一个要打开的文Ӟ函数q回TrueQ当有错误发生,用户选择取消按钮或关闭对话框的话?x)返回False?br>
外壳对象属性对话框

另一个未公开的对话框函数是SHObjectPropertiesQ它可以用来昄外壳对象的属性,比如驱动器、文件夹或文件等Q运行效果如?.29所C。函数可以从Shell32.dll中按索引?78公开出来Q定义如下:(x)

    function SHObjectProperties(Owner: HWND; Flags: UINT;

      ObjectName: Pointer; InitialTabName: Pointer):LongBool; stdcall;


Flags参数用来指定ObjectName参数对应对象的类型,它可以是下列标识Q?br>
    //打印?br>
    OPF_PRINTERNAME = $01;

    //路径

    OPF_PATHNAME    = $02;


ObjectName参数指向一个包含\径名的字W串或是要显C属性的打印机名。如果打印机是本地的Q可以用实际的打印机名Q如果是|络打印机,需要用完整的UNC样式名称Q比如\\COMPUTERNAME\PRINTERNAME。InitialTabName参数指向一个属性对话框中页面名U字W串Q用来指定要昄的缺省页面。如果InitialTabName参数为nilQ或不匹配Q何页面的名称Q第一个属性页面将?x)被昄?br>
如果函数调用成功?x)返回TrueQ如果失败会(x)q回False。要惌得扩展的错误信息Q可以调用API函数GetLastError。要注意的是q个对话框是非模态的Q类g查找文g对话框,所以函C被调用,p定会(x)昄一个对话框Q同时我们没有办法知道用户什么时候关闭了(jin)对话框?br>
映射|络驱动对话?/strong>





?.30

?.30昄?jin)映网l驱动器的对话框Q我们通过SHNetConnectionDialog函数调用它(win 9x和W(xu)in NT上都支持Q,它可以按索引?60从Shell32.dll暴露出来Q函数定义如下:(x)

    function SHNetConnectionDialog(Owner: HWND;

      ResourceName: Pointer; ResourceType: DWORD): DWORD; stdcall;


SHStartNetConnectionDialog函数也会(x)昄同样的对话框Q但它显C的对话框是非模态的Q同时只在NT上才支持。它可以按烦(ch)引?15从Shell32.dll中公开出来Q函数定义如下:(x)

    function SHStartNetConnectionDialog(Owner: HWND;

      ResourceName: PWideChar; ResourceType: DWORD):DWORD; stdcall;


上面两个函数的参数完全相同。其中ResourceName参数指向一个要q接的网l资源UNC路径名。指定了(jin)q个参数的话Q显C的对话框中被预讄q接资源׃可改变了(jin)。如果这个参Cؓ(f)nilQ则在对话框中用户可以指定要q接的资源。ResourceType参数可以是下面的g一QRESOURCETYPE_DISK或RESOURCETYPE_PRINT。它的不同将?x)生成不同的对话框。参Cؓ(f)RESOURCETYPE_DISK允许我们为网l驱动资源指定一个盘W,另一个参数允许我们映一个ƈ行口名比如LPT2Z个网l打印机。然而,不知道ؓ(f)什么RESOURCETYPE_PRINT参数在NT上无效?br>



?.31

如果函数调用成功的话Q返回值是NO_ERRORQ如果用户取消的对话框,则返?-1($FFFFFFFF)Q如果调用失败则q回其他的错误代码,具体错误信息可以用GetLastError API调用获得?br>
关闭pȝ对话?/strong>

ExitWindowsDialog和RestartDialog函数可以用来昄关闭和重启系l对话框Q如?.31Q,它们同公开的ExitWindowsEx API函数没有什么太大的不同Q但在其q程中都?x)生一个对话框。ExitWindowsDialog函数可以按烦(ch)引?0从Shell32.dll中公开出来QRestartDialog函数的在Shell32.dll中的索引值则?9Q两个函数的定义如下Q?br>
    procedure ExitWindowsDialog(Owner: HWND); stdcall;

    function RestartDialog(Owner: HWND; Reason: Pointer; ExitType: UINT): DWORD; stdcall;


对ExitWindowsDialog函数来说Q对话框好像q不使用Owner参数作ؓ(f)父窗口,在Windows 95上,当操作成功的话ownerH口?x)收C个WM_QUIT消息。在Windows NT上,owner H口Ҏ(gu)不被使用。同时这个函数没有返回|所以没有办法知道用户选择?jin)什么操作以?qing)操作是否被取消了(jin)?br>
RestartDialog函数更有用一些,当我们修改了(jin)pȝ的设|,q希望重新启动系l修改生效的时候可以用这个函数。Reason参数指向一个要昄在对话框中的字符Ԍ用来解释关闭pȝ的原因。ExitType参数指定关闭cdQ可以用ExitWindowsEX函数使用值的一个子集及(qing)额外的几个新|下面是它们的完全列表Q?br>
    EWX_LOGOFF        = $00;

    EWX_SHUTDOWN      = $01;

    EWX_REBOOT        = $02;

    EW_RESTARTWINDOWS = $42;

    EW_REBOOTSYSTEM   = $43;

    EW_EXITANDEXECAPP = $44;


如果用户选择执行关闭操作Q函数返回IDYESQ否则返回IDNO?br>
要注意的是显C在对话框中的原因字W串后M(x)跟着一个系l缺省提供的字符串用来显C确认信息,所以应该在我们的Reason字符串后附上I格或回车换行字W。另外返回g能用于确定操作的成功性,它只表明用户的选择Q如果重启操作由于某些原因失败了(jin)Q返回g然是IDYES。同时要注意的是要想调用成功Q用戯必须有SE_SHUTDOWN_NAME权限Q在NT上)(j)?br>
~少内存对话?/strong>

SHOutOfMemoryMessageBox是一个未公开的函敎ͼ当系l内存不x可以用来昄标准的外壳信息对话框Q它在Shell32.dll中的索引值是126Q函数定义如下:(x)

    function SHOutOfMemoryMessageBox(Owner: HWND;

      Caption: Pointer; Style: UINT): Integer; stdcall;


它会(x)调用MessageBox APIQ同时传?个标准的参数和ERROR_OUTOFMEMORY错误消息。Caption参数指向对话框标题字W串。如果Caption为nilQ父H口的标题就?x)被使用。Style参数可以被设|ؓ(f)LMessageBox函数使用的MB_XXX常数的组合,通常讄它ؓ(f)MB_OK或MB_ICONHAND。函数调用返回值参见SDK中MessageBox函数说明?br>
当MessageBox函数被调用时QMB_SETFOREGROUND标识?x)被d到Style参数中,但如果第一ơ调用失败了(jin)的话QMessageBox函数?x)被再次调用Q这ơMB_SYSTEMMODAL 标识?x)被d到Style参数中。MB_SYSTEMMODAL同MB_ICONHAND标识l合后会(x)忽略内存状况来显C消息对话框。当内存实不Ӟ函数不会(x)昄M东西Q然而它仍然?x)返回MessageBox函数调用l果。所以我们可以根据返回值判断函数是否调用成功了(jin)?br>
I间不对话?/strong>




?.32

另一个资源相关的函数是SHHandleDiskFullQ它?x)显C磁盘不的信息对话框(如图2.32Q。我们可以在׃没有_盘I间时导致程序无法运行的条g下调用这个函敎ͼ调用后,如果回收站中有什么东西没有删除的话,对话框允许用hI回收站来释攄盘空间。它在Shell32.dll中的索引gؓ(f)185Q函数的定义如下Q?br>
    procedure SHHandleDiskFull(Owner: HWND; Drive: UINT); stdcall;


Drive参数用于指定?为底的驱动器盘符?代表A:\Q?代表B:\Q依此类推。这个函数的应用比较困难Q因为当回收站中没有M东西时对话框不会(x)昄Q同时也没有Mq回DC对话框是否昄Q还无法知道用户的操作,比如它是否真的清IZ(jin)。看h比较可行的应用只能是E序自行监视盘剩余I间Q只是用这个对话框作ؓ(f)一个快速修复的工具?br>
一般外x息对话框

ShellMessageBox函数仅仅是一个对MessageBox函数的简单封装函敎ͼ它允怋用字W串资源标识W或标准的以nulll尾的字W串Q同时还允许加入支持格式化ForamtMessage函数的控制符。ShellMessageBox函数在Shell32.dll中的索引gؓ(f)183Q?br>
    function ShellMessageBoxA(Module: THandle; Owner: HWND;

      Text: PChar; Caption: PChar; Style: UINT;

      Parameters: array of Pointer): Integer; cdecl;


更确切地说这个函数应该叫ShellMessageBoxA因ؓ(f)它只支持ANSI字符Ԍq有一个UNICODE的版本的函数ShellMessageBoxWQ它的烦(ch)引gؓ(f)182Q但它只在Windows NT上才有,函数定义如下Q?br>
    function ShellMessageBoxW(Module: THandle; Owner: HWND;

      Text: PWideChar; Caption: PWideChar; Style: UINT;

      Parameters: array of Pointer): Integer; cdecl;


Module参数是提供字W串资源的模块句柄,句柄可以用GetModuleHandle函数获得。顾名思义Text 参数指向一个要昄在对话框中的文本Q它也可以是资源字符串IDQ文本中可以包括格式控制序列Q它?yu)?x)被在Parameters中提供的额外字符串替代。控制符格式?#8220;%#”Q其?#8220;#”是额外字W串在参C的位|,比如“%1”被W一个Parameters数组中的字符串元素替代,“%3”会(x)被第三个元素替代Q依此类推。Caption参数指向对话框标题文本,同样它也可以是资源IDQ如果参Cؓ(f)nilQOwner指定的窗口标题将被用于对话框标题。Style参数是由位掩码标识组成的Q可以设|成MessageBox函数支持的MB_XXX常数的组合。返回值同MessageBox完全一栗?br>
对于q个函数很重要的一Ҏ(gu)微Y公司使用cdecl来输?gu)个函数而不是通常?stdcall。此外,Parameters参数使用?jin)C语言中的可变参数列表Q这意味着q个函数不是语言无关的,q得调用v来非帔R?ch),因?f)Delphiq不直接支持cdecl和可变参数列表。ؓ(f)?jin)解册个问题,Parameters参数被映ؓ(f)一个动态指针列表。同时我们还需要用嵌入式汇编来徏立cdecl样式的堆栈。由于动态指针列表的性质Q我们必至指定一个指针倹{如果不x定要替代的字W串Q简单设|ؓ(f)nil可以了(jin)?/font>

q幽 2009-12-18 09:20 发表评论
]]>
C#实现MD5加密http://www.shnenglu.com/justin-shi/archive/2009/12/07/102687.htmlq幽q幽Mon, 07 Dec 2009 00:29:00 GMThttp://www.shnenglu.com/justin-shi/archive/2009/12/07/102687.htmlhttp://www.shnenglu.com/justin-shi/comments/102687.htmlhttp://www.shnenglu.com/justin-shi/archive/2009/12/07/102687.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/102687.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/102687.html首先,先简单介l一下MD5

MD5的全U是message-digest algorithm 5(信息-摘要法Q在90q代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来, lmd2、md3和md4发展而来?/p>

MD5h很好的安全?因ؓ(f)它具有不可逆的特征,加过密的密文l过解密后和加密前的东东相同的可能性极?

引用
using System.Security.Cryptography;
using System.Text;

具体代码如下(写在按钮的Click事g?:
byte[] result = Encoding.Default.GetBytes(this.tbPass.Text.Trim());    //tbPass入密码的文本?br>MD5 md5 = new MD5CryptoServiceProvider();
byte[] output = md5.ComputeHash(result);
this.tbMd5pass.Text = BitConverter.ToString(output).Replace("-","");  //tbMd5pass出加密文本的文本?br>

本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/lykycs/archive/2006/06/16/802873.aspx




q幽 2009-12-07 08:29 发表评论
]]>
再谈异常――谈C++与Object Pascal中的构造函C异常 http://www.shnenglu.com/justin-shi/archive/2009/05/20/83429.htmlq幽q幽Tue, 19 May 2009 16:42:00 GMThttp://www.shnenglu.com/justin-shi/archive/2009/05/20/83429.htmlhttp://www.shnenglu.com/justin-shi/comments/83429.htmlhttp://www.shnenglu.com/justin-shi/archive/2009/05/20/83429.html#Feedback1http://www.shnenglu.com/justin-shi/comments/commentRss/83429.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/83429.html再谈异常――谈C++与Object Pascal中的构造函C异常

作者:(x)Nicrosoft(nicrosoft@sunistudio.com) 2001.9.15
个h主页Qhttp://www.sunistudio.com/nicrosoft/
东日文档Qhttp://www.sunistudio.com/asp/sunidoc.asp

  我们知道Q类的构造函数是没有q回值的Q如果构造函数构造对象失败,不可能依靠返回错误代码。那么,在程序中如何标识构造函数的p|呢?最“标准”的方法就是:(x)抛出一个异常?/p>

  构造函数失败,意味着对象的构造失败,那么抛出异常之后Q这?#8220;半死不活”的对象会(x)被如何处理呢Q这是本文的主题?/p>

在C++中,构造函数抛出异常后Q析构函C?x)被调用。这是合理的Q因为此时对象ƈ没有被完整构造。也是_(d)如果构造函数已l做?jin)一些诸如分配内存? 打开文g{操作的话,那么c需要有自己的成员来C做过哪些动作。在C++中,l典的解x案是使用STL的标准类auto_ptrQ这在每一本经? C++著作中都有介l,我在q里׃多说?jin)。在q里Q我惛_介绍一U?#8220;非常?#8221;的方式,其思想是避免在构造函C抛出异常。我们可以在cM增加一? Init(); 以及(qing) UnInit();成员函数用于q行Ҏ(gu)产生错误的资源分配工作,而真正的构造函C先将所有成员置为NULLQ然后调? Init(); q判断其q回|或者捕?Init()抛出的异常)(j)Q如果Init();p|?jin),则在构造函C调用 UnInit(); q设|一个标志位表明构造失败。UnInit()中按照成员是否ؓ(f)NULLq行资源的释攑ַ作。示例代码如下:(x)
class A
{
private:
 char* str;
 int failed;

public:
 A();
 ~A();
 int Init();
 int UnInit();
 int Failed();
};

A::A()
{
 str = NULL;
 try
 {
  Init();
  failed = 0;
 }
 catch(...)
 {
  failed = 1;
  UnInit();
 }
}

A::~A()
{
 UnInit();
}

int A::Init()
{
 str = new char[10];
 strcpy(str, "ABCDEFGHI");
 throw 10;

 return 1;
}

int A::UnInit()
{
 if (!str)
 {
  delete []str;
  str = NULL;
 }

 printf("Free Resource

");
 return 1;
}

int A::Failed()
{
 return failed;
}

int main(int argc, char* argv[])
{
 A* a = new A;
 if ( a->Failed() )
  printf("failed

");
 else
  printf("succeeded

");

 delete a;

 getchar();
 return 0;
}

  你会(x)发现Q在int A::Init()中包含了(jin)throw 10;的代码(产生一个异常,模拟错误的发生)(j)Q执行结果是Q?br>  Free Resource
  failed
  Free Resource
  虽然 UnInit();被调用了(jin)两次Q但是由于UnInit();中做?jin)判断(if (!str)Q,因此不会(x)发生错误。而如果没有发生异常(L int A::Init()中的throw 10;代码Q,执行l果是:(x)
  Succeeded
  Free Resource
  和正常的程没有M区别?/p>

在Object PascalQDelphi/VCLQ中Q这个问题就变得非常的简单了(jin)Q因?OP Ҏ(gu)造函数的异常的处理与C++不同Q在Create时抛出异常后Q编译器?x)自动调用析构函数DestroyQƈ且会(x)判断哪些资源被分配了(jin)Q实行自动回 收。因此,其代码也变得非常z,如下Q?br>type
  A = class
  private
  str : PChar;
  public
  constructor Create();
  destructor Destroy(); override;
  end;

constructor A.Create();
begin
  str := StrAlloc(10);
  StrCopy(str, 'ABCDEFGHI');
  raise Exception.Create('error');
end;

destructor A.Destroy();
begin
  StrDispose(str);
  WriteLn('Free Resource');
end;

var oa : A;
  i : integer;
begin
  try
      oa := A.Create();
      WriteLn('Succeeded');
      oa.Free();
  except
      oa := nil;
      WriteLn('Failed');
  end;

  Read(i);
end.

  在这D代码中Q如果构造函数抛出异常(即Create中含有raise Exception.Create('error');Q,执行的结果是Q?br>  Free Resource
  Failed
  此时?#8220;Free Resource”输出是由~译器自动调用析构函数所产生的。而如果构造函数正常返回(即不抛出异常Q,则执行结果是Q?br>  Succeeded
  Free Resource
  此时?#8220;Free Resource”输出是由 oa.Free()的调用生的?/p>

lgQC++与Object Pascal对于构造函数抛出异常后的不同处理方式,其实正是两种语言的设计思想的体现。C++U承C的风|注重效率Q一切交l程序员来掌握,~译器不 作多余动作。Object Pascall承Pascal的风|注重E序的美学意义(不可否认QPascal代码是全世界最优美的代码)(j)Q编译器帮助E序员完成复杂的工作。两U语 a都有存在的理由,都有存在的必要!而掌握它们之间的差别Q能让你更好地控制它们,辑ֈ自由的理想王国?/p>




q幽 2009-05-20 00:42 发表评论
]]>
struct DCBhttp://www.shnenglu.com/justin-shi/archive/2009/05/05/81909.htmlq幽q幽Mon, 04 May 2009 18:35:00 GMThttp://www.shnenglu.com/justin-shi/archive/2009/05/05/81909.htmlhttp://www.shnenglu.com/justin-shi/comments/81909.htmlhttp://www.shnenglu.com/justin-shi/archive/2009/05/05/81909.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/81909.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/81909.html

串口通讯中的DCBl构

typedef struct _DCB {// dcb

DWORD DCBlength; // sizeof(DCB)

DORD BaudRate; // current baud rate 指定当前的L特率

DWORD fBinary: 1; // binary mode, no EOF check 指定是否允许二进制模式WIN95中须为TRUE
       

DWORD fParity: 1; // enable parity checking 指定奇偶校验是否允许

DWORD fOutxCtsFlow:1; // CTS output flow control 指定CTS是否用于(g)发送控制。当为TRUE是CTS为OFFQ发送将被挂赗?/font>


DWORD fOutxDsrFlow:1; // DSR output flow control   指定CTS是否用于(g)发送控制。当为TRUE是CTS为OFFQ发送将被挂赗?/font>


DWORD fDtrControl:2; // DTR flow control type

DTR_CONTROL_DISABLE 值将DTR|ؓ(f)OFF,DTR_CONTROL_ENABLE值将DTR|ؓ(f)ON, 

DTR_CONTROL_HANDSHAKE 允许DTR"握手",

 

DWORD fDsrSensitivity:1;// DSR sensitivity 当该gؓ(f)TRUE时DSR为OFF时接收的字节被忽?/font>

 

DWORD fTXContinueOnXoff:1; // XOFF continues Tx
    指定当接收缓冲区已满,q且驱动E序已经发送出XoffChar字符时发送是否停止?/font>

    TRUEӞ在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已l发送出XoffChar?nbsp;     W中止接收字节之后,发送l进行?br>    FALSEӞ在接收缓冲区接收C表缓冲区已空的字节XonChar且驱动程序已l发送出恢复发送的XonChar之后Q发送l进行?/font>


DWORD fOutX: 1; // XON/XOFF out flow control    TRUEӞ接收到XoffChar之后便停止发送接收到XonChar之后重新开?/font>

 

DWORD fInX: 1; // XON/XOFF in flow control
             TRUEӞ接收~冲区接收到代表~冲区满的XoffLim之后QXoffChar发送出L收缓冲区接收C表缓冲区I的XonLim之后QXonChar发送出?/font>


DWORD fErrorChar: 1; // enable error replacement
         该gؓ(f)TRUE且fParity为TRUEӞ用ErrorChar 成员指定的字W代替奇偶校验错误的接收字符


DWORD fNull: 1; // enable null stripping  TRUEӞ接收时去掉空Q?|(j)字节

 

DWORD fRtsControl:2; // RTS flow control


DWORD fAbortOnError:1; // abort reads/writes on error  TRUE?有错误发生时中止d写操作RTS_CONTROL_DISABLE?RTS|ؓ(f)OFFRTS_CONTROL_ENABLE? RTS|ؓ(f)ON

 

RTS_CONTROL_HANDSHAKE?当接收缓冲区于半满时RTS为ON当接收缓冲区过四分之三满时RTS为OFF


RTS_CONTROL_TOGGLE?当接收缓冲区仍有剩余字节时RTS为ON ,否则~省为OFF


DWORD fDummy2:17; // reserved  未?/font>

 

WORD wReserved; // not currently used  未?必须?

 

WORD XonLim; // transmit XON threshold   指定在XON字符发送这前接收缓冲区中可允许的最字节数


WORD XoffLim; // transmit XOFF threshold  指定在XOFF字符发送这前接收缓冲区中可允许的最字节数


BYTE ByteSize; // number of bits/byte, 4-8  指定端口当前使用的数据位

 

BYTE Parity; // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方?可能?
                            EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY BYTE

 

StopBits;      0,1,2 = 1, 1.5, 2   指定端口当前使用的停止位?可能?
                          ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS


char XonChar; // Tx and Rx XON character  指定用于发送和接收字符XON的?/font>

 

char XoffChar; // Tx and Rx XOFF character  指定用于发送和接收字符XOFF?/font>

 

char ErrorChar; // error replacement character本字W用来代替接收到的奇偶校验发生错误时的?/font>

 

char EofChar; // end of input character 当没有用二q制模式?本字W可用来指示数据的结?/font>

 

char EvtChar; // received event character 当接收到此字W时,?x)生一个事?/font>

 

WORD wReserved1; // reserved; do not use 未?/font>

} DCB;



q幽 2009-05-05 02:35 发表评论
]]>CSS切换皮肤切换代码http://www.shnenglu.com/justin-shi/archive/2009/04/20/80498.htmlq幽q幽Sun, 19 Apr 2009 19:22:00 GMThttp://www.shnenglu.com/justin-shi/archive/2009/04/20/80498.htmlhttp://www.shnenglu.com/justin-shi/comments/80498.htmlhttp://www.shnenglu.com/justin-shi/archive/2009/04/20/80498.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/80498.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/80498.htmlCSS切换皮肤切换代码Q?br>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "<html xmlns="      <head>
       
  <meta http-equiv="content-type" content="text/html;charset=gb2312" />
  <meta name="generator" content="" />
  <meta name="author" content="" />
        <meta name="keywords" content="" />
        <meta name="robots" content="index, follow" />
        <meta name="googlebot" content="index, follow" />
  <title>     </title>
  <link rel="stylesheet" type="text/css" href="code/changestyle/styles1.css" title="styles1"  media="screen" />
 <link rel="alternate stylesheet" type="text/css" href="code/changestyle/styles2.css" title="styles2" media="screen" />
 <link rel="alternate stylesheet" type="text/css" href="code/changestyle/styles3.css" title="styles3" media="screen" />
  <script type="text/javascript">
window.onload=function(){ var c = readCookie('style');
 if (c) switchStylestyle(c);
};
function switchStylestyle(styleName)
{  aa=document.styleSheets;
for(i=0;i<aa.length;i++)
 {
  aa[i].disabled = true;
  if (aa[i].title== styleName){aa[i].disabled = false;}
 };
 createCookie('style', styleName, 365);
}
function createCookie(name,value,days)
{
 if (days)
 {
  var date = new Date();
  date.setTime(date.getTime()+(days*24*60*60*1000));
  var expires = "; expires="+date.toGMTString();
 }
 else var expires = "";
 document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name)
{
 var nameEQ = name + "=";
 var ca = document.cookie.split(';');
 for(var i=0;i < ca.length;i++)
 {
  var c = ca[i];
  while (c.charAt(0)==' ') c = c.substring(1,c.length);
  if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
 }
 return null;
}
function eraseCookie(name)
{
 createCookie(name,"",-1);
}
// /cookie functions
  </script>
 </head>
 <body id="">
  <div id="wrapper">
   <ul>
  <li><a href="javascript:void(0);" onclick="switchStylestyle('styles1')">styles1</a></li>
  <li><a href="javascript:void(0);" onclick="switchStylestyle('styles2')">styles2</a></li>
  <li><a href="javascript:void(0);" onclick="switchStylestyle('styles3')">styles3</a></li>
 </ul
  </div>
 </body>
</html>




q幽 2009-04-20 03:22 发表评论
]]>
技术备?/title><link>http://www.shnenglu.com/justin-shi/archive/2009/03/13/76505.html</link><dc:creator>q幽</dc:creator><author>q幽</author><pubDate>Fri, 13 Mar 2009 11:56:00 GMT</pubDate><guid>http://www.shnenglu.com/justin-shi/archive/2009/03/13/76505.html</guid><wfw:comment>http://www.shnenglu.com/justin-shi/comments/76505.html</wfw:comment><comments>http://www.shnenglu.com/justin-shi/archive/2009/03/13/76505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/justin-shi/comments/commentRss/76505.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/justin-shi/services/trackbacks/76505.html</trackback:ping><description><![CDATA[DLL注入E序的一般步骤:(x)<br><br>Q?Q取得宿主进E(卌注入木马的进E)(j)的进EID dwRemoteProcessIdQ?br><br>Q?Q取得DLL的完全\径,q将其{换ؓ(f)宽字W模式pszLibFileNameQ?br><br>Q?Q利用Windows API OpenProcess打开宿主q程Q应该开启下列选项Q?br><br><span>a.PROCESS_CREATE_THREADQ允许在宿主q程中创建线E;</span><br><br>b.PROCESS_VM_OPERATIONQ允许对宿主q程中进行VM操作Q?br><br>c.PROCESS_VM_WRITEQ允许对宿主q程q行VM写?br><br><span>Q?Q利用Windows API VirtualAllocEx函数在远E线E的VM中分配DLL完整路径宽字W所需的存储空_(d)q利用Windows API WriteProcessMemory函数完整\径写入该存储I间Q?/span><br><br>Q?Q利用Windows API GetProcAddress取得Kernel32模块中LoadLibraryW函数的地址Q这个函数将作ؓ(f)随后启动的q程U程的入口函敎ͼ<br><br><span>Q?Q利用Windows API CreateRemoteThread启动q程U程Q将LoadLibraryW的地址作ؓ(f)q程U程的入口函数地址Q将宿主q程里被分配I间中存储的完整DLL路径作ؓ(f)U程入口函数的参C另其启动指定的DLLQ?/span><br><br><span>Q?Q清理现场?/span> <img src ="http://www.shnenglu.com/justin-shi/aggbug/76505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/justin-shi/" target="_blank">q幽</a> 2009-03-13 19:56 <a href="http://www.shnenglu.com/justin-shi/archive/2009/03/13/76505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.yayalove.cn" target="_blank">Ļ˾Ʒþò</a>| <a href="http://www.xfshebao.cn" target="_blank">þó˹Ʒ</a>| <a href="http://www.dszixun.cn" target="_blank">þƵ1</a>| <a href="http://www.glhu.cn" target="_blank">޹ƷþSM</a>| <a href="http://www.shellbitumen.com.cn" target="_blank">97þùۺϾƷŮ </a>| <a href="http://www.vedz.cn" target="_blank">ҹƷþ</a>| <a href="http://www.qhcl233.cn" target="_blank">þøһëƬ</a>| <a href="http://www.babaishu.cn" target="_blank">Ļձ޾þþ</a>| <a href="http://www.jzqyc.com.cn" target="_blank">޾ƷþþþĻ69 </a>| <a href="http://www.vkqn.cn" target="_blank">þþƷݲݲ</a>| <a href="http://www.5icsw.cn" target="_blank">ഺþ</a>| <a href="http://www.bestfanyi.cn" target="_blank">žžƷ99þþ㽶</a>| <a href="http://www.cczone.cn" target="_blank">Ʒ׾þAAAƬ69</a>| <a href="http://www.kunzuo.cn" target="_blank">˾þۺij</a>| <a href="http://www.shuo123.cn" target="_blank">þþþŮAAƬ</a>| <a href="http://www.hellorolex.cn" target="_blank">ƷþþþþþҹƬ</a>| <a href="http://www.kongqueyuhn.cn" target="_blank">һŮȫƾþƬ</a>| <a href="http://www.carnegietech.com.cn" target="_blank">þþƷþ˼˼</a>| <a href="http://www.xinhaitugong.cn" target="_blank">99þþþ</a>| <a href="http://www.cn1s.cn" target="_blank">þþþþþž99Ʒ</a>| <a href="http://www.ncysjz.cn" target="_blank">þݺҹҹ2020츾</a>| <a href="http://www.ailazi.com.cn" target="_blank">޹ŷۺ997þ</a>| <a href="http://www.anfuwang.cn" target="_blank">ҹþþþƷӰԺ</a>| <a href="http://www.mdz8.cn" target="_blank">þþƷѹۿ</a>| <a href="http://www.yhic.net.cn" target="_blank">AëƬþþƷ</a>| <a href="http://www.uztw.cn" target="_blank">þĻ</a>| <a href="http://www.jumeiba.cn" target="_blank">AëƬþþþƷëƬ</a>| <a href="http://www.jrtz112.cn" target="_blank">97þþþ</a>| <a href="http://www.scqpw.cn" target="_blank">99þþƷһëƬ </a>| <a href="http://www.sowudi.com.cn" target="_blank">ŷ޳ҹƷþ</a>| <a href="http://www.sxweishang.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.gdhaojulai.cn" target="_blank">ղƷþþһ</a>| <a href="http://www.tianlaiedu.cn" target="_blank">þҹɫ˾Ʒ</a>| <a href="http://www.smegdmm.cn" target="_blank">þۺϾþۺϾþ</a>| <a href="http://www.2rwx2.cn" target="_blank">޾Ʒtvþþþþþþ</a>| <a href="http://www.pass3d.cn" target="_blank">һһþaþþƷۺ</a>| <a href="http://www.1118.org.cn" target="_blank">þúݺɫۺ</a>| <a href="http://www.fttyz.com.cn" target="_blank">þùۺϾƷ</a>| <a href="http://www.dgz123.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.jrbjh.cn" target="_blank">þþûƬ</a>| <a href="http://www.818jk.cn" target="_blank">þþþӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>