??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV日韩精品久久久久,国产精品日韩深夜福利久久,欧美日韩精品久久久久http://www.shnenglu.com/epubcn/zh-cnWed, 07 May 2025 16:11:55 GMTWed, 07 May 2025 16:11:55 GMT60【原创】Windows下编?openh264 记http://www.shnenglu.com/epubcn/archive/2017/03/09/214740.htmlp色系l?/dc:creator>p色系l?/author>Thu, 09 Mar 2017 03:51:00 GMThttp://www.shnenglu.com/epubcn/archive/2017/03/09/214740.htmlhttp://www.shnenglu.com/epubcn/comments/214740.htmlhttp://www.shnenglu.com/epubcn/archive/2017/03/09/214740.html#Feedback0http://www.shnenglu.com/epubcn/comments/commentRss/214740.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/214740.html1. 安装git工具(如GitHub for Windows)Qclone源码Qhttps://github.com/cisco/openh264.git
2. 安装MinGWQ添? %YOUR MINGW INSTALL DIR%\bin\  到系l环境变? Path  中,手动修改\bin\mingw32-make.exe为make.exeQ不改也行,以后执行hȝ点)
3. q行Visual Studio Command Prompt( ?VS2013 x86 Native Tools Command PromptQ?/span>
4. 在命令行H口中,执行%YOUR MINGW INSTALL DIR%\msys\1.0\msys.batQ把MSYS命o行窗口弄出来
5. MSYS中执行一下pwd看一下当前\径,把openh264代码拯到当前\径下某个文g夹,新徏一个也?/span>
6. q入openh264目录Q执? make OS=msvc  Q注意大写Q,好了?/span>

]]>
【原创】模拟点击Outlook命o栏中的某个按?/title><link>http://www.shnenglu.com/epubcn/archive/2013/03/18/198556.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Mon, 18 Mar 2013 10:06:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2013/03/18/198556.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/198556.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2013/03/18/198556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/198556.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/198556.html</trackback:ping><description><![CDATA[几乎2q没来这blog了,ƣ慰的是居然原来的数据还在。。。?br />正好今天帮同事解决了一个有意思的问题,随手写一blogQ记录这个事情?br /><br />背景是这LQ?br />需要通过一个和Outlook没有关系的单独exeQ来执行Outlook中的某个命o按钮Q而不是靠手动点击L行。有q个需求的原因是,他希望在用户按下按钮后,起一个线E去工作Q但不能block住OutlookD用户不能正常操作。当U程l束后,再自动触发Outlook Addin中的某个按钮命o做剩余的事情。给Office写过Addin的都知道Q从后台U程中访问Outlook对象模型是不被支持的Q参见:http://msdn.microsoft.com/en-us/library/office/dd278301(v=office.12).aspxQ,所以,q就l实现需求带来了困难。那么如何实现呢Q?br /><br />隄Q?br />Office界面上的按钮不是一个普通的H口Q无法拿到句柄去发送WM_COMMAND消息Q这q模拟执行某个按钮命o带来了困难?br /><br />分析Q?br />用Spy++看了Outlook 2003/2007/2010的界面(其中2003/2007相同Q?010的Ribbon则又是另外一U情况)Q可以看刎ͼ?003/2007中,工具栏的父窗口类名叫“MsoCommandBar”Q?010则相对复杂,只能看到“NetUIHWND”q一层?br />因ؓ我们无法直接通过H口拿到按钮Q所以只能另外想办法——看到NetUIHWNDQ马上联惛_DirectUIQ而就非常感谢微Y提供了IAccessibleq个方便的东ѝ可能有qIAccessible使用l验的朋友看到这里,马上p然开朗,没错。后面写的都是用q个东东来完成的?br /><br />解决思\Q?br />先通过FindWindow一层层扑ֈ你能讉K到的“最?#8221;一个窗口。对于Outlook 2003/2007来说Q\径应该是q样的:<br /><br />rctrl_renwnd32 -> MsoCommandBarDock(H口名MsoDockTop) -> MsoCommandBar(H口名是你的插g工具栏名Uͼ<br /><br />而对于Outlook 2010来说则相对多一些:<br /><br />rctrl_renwnd32 -> MsoCommandBarDock(H口名MsoDockTop) -> MsoCommandBarQ窗口名Ribbon) -> MsoWorkPane(H口名Ribbon) -> NUIPane -> NetUIHWND<br /><br />好了Q这一层窗口句柄拿CQ接下来先获取这一层窗口的IAccessible接口Q示例代码:<br /><br /><div>IAccessible* accTop = NULL;</div><div>HRESULT hr = AccessibleObjectFromWindow(hwndTOP, NULL, IID_IAccessible, (LPVOID*)&accTop);<br /><br />拿到其IAccessible后,q需要l遍历其所有子元素Q?003/2007再访问两层就能拿到具体的一个按钮的IAccessible接口Q?010则要讉K臛_6层?br /><br />往下讲没什么可说的了。我贴几个关键的函数吧,误行徏一个Win32q行试?br /><br /><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1038.800048828125px; word-break: break-all; "><span style="color: #008080; "> 1</span> BOOL FindAccessible(IAccessible* accParent, IAccessible** accToFind, LPCTSTR lpctFindName)<br /><span style="color: #008080; "> 2</span> {<br /><span style="color: #008080; "> 3</span>     VARIANT* vt_output = NULL;<br /><span style="color: #008080; "> 4</span>     BOOL bRet = FALSE;<br /><span style="color: #008080; "> 5</span>     <span style="color: #0000ff; ">if</span>(accParent == NULL)<br /><span style="color: #008080; "> 6</span>         <span style="color: #0000ff; ">return</span> FALSE;<br /><span style="color: #008080; "> 7</span> <br /><span style="color: #008080; "> 8</span>     <span style="color: #0000ff; ">long</span> lChildCount = 0;<br /><span style="color: #008080; "> 9</span>     HRESULT hr = accParent->get_accChildCount(&lChildCount);<br /><span style="color: #008080; ">10</span>     <span style="color: #0000ff; ">if</span>(FAILED(hr) || (lChildCount == 0))<br /><span style="color: #008080; ">11</span>         <span style="color: #0000ff; ">return</span> FALSE;<br /><span style="color: #008080; ">12</span> <br /><span style="color: #008080; ">13</span>     vt_output = <span style="color: #0000ff; ">new</span> VARIANT[lChildCount];<br /><span style="color: #008080; ">14</span>     <span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span> i=0; i<lChildCount; i++)<br /><span style="color: #008080; ">15</span>         VariantInit(&vt_output[i]);<br /><span style="color: #008080; ">16</span> <br /><span style="color: #008080; ">17</span>     <span style="color: #0000ff; ">long</span> lNewChildCount = 0;<br /><span style="color: #008080; ">18</span>     hr = AccessibleChildren(accParent, 0, lChildCount, vt_output, &lNewChildCount);<br /><span style="color: #008080; ">19</span>     <span style="color: #0000ff; ">if</span>(FAILED(hr))<br /><span style="color: #008080; ">20</span>         <span style="color: #0000ff; ">goto</span> exit;<br /><span style="color: #008080; ">21</span> <br /><span style="color: #008080; ">22</span>     <span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span> j=0; j<lNewChildCount; j++)<br /><span style="color: #008080; ">23</span>     {<br /><span style="color: #008080; ">24</span>         <span style="color: #0000ff; ">if</span>(vt_output[j].vt == VT_DISPATCH)<br /><span style="color: #008080; ">25</span>         {<br /><span style="color: #008080; ">26</span>             IDispatch* disp = vt_output[j].pdispVal;<br /><span style="color: #008080; ">27</span>             hr = disp->QueryInterface(IID_IAccessible, (<span style="color: #0000ff; ">void</span>**)accToFind);<br /><span style="color: #008080; ">28</span>             <span style="color: #0000ff; ">if</span>(FAILED(hr))<br /><span style="color: #008080; ">29</span>                 <span style="color: #0000ff; ">continue</span>;<br /><span style="color: #008080; ">30</span> <br /><span style="color: #008080; ">31</span>             VARIANT vChildID;<br /><span style="color: #008080; ">32</span>             VariantInit(&vChildID);<br /><span style="color: #008080; ">33</span>             vChildID.vt = VT_I4;<br /><span style="color: #008080; ">34</span>             vChildID.lVal = CHILDID_SELF;<br /><span style="color: #008080; ">35</span> <br /><span style="color: #008080; ">36</span>             BSTR name;<br /><span style="color: #008080; ">37</span>             hr = (*accToFind)->get_accName(vChildID, &name);<br /><span style="color: #008080; ">38</span>             <span style="color: #0000ff; ">if</span>(FAILED(hr))<br /><span style="color: #008080; ">39</span>             {<br /><span style="color: #008080; ">40</span>                 SysFreeString(name);<br /><span style="color: #008080; ">41</span>                 <span style="color: #0000ff; ">continue</span>;<br /><span style="color: #008080; ">42</span>             }<br /><span style="color: #008080; ">43</span> <br /><span style="color: #008080; ">44</span>             <span style="color: #0000ff; ">if</span>(name == NULL)<br /><span style="color: #008080; ">45</span>                 <span style="color: #0000ff; ">continue</span>;<br /><span style="color: #008080; ">46</span> <br /><span style="color: #008080; ">47</span>             ODF(_T("get_accName=%s\n"), name);<br /><span style="color: #008080; ">48</span>             <span style="color: #0000ff; ">if</span>((lpctFindName != NULL) && _tcsicmp(name, lpctFindName) == 0)<br /><span style="color: #008080; ">49</span>             {<br /><span style="color: #008080; ">50</span>                 <span style="color: #008000; ">//</span><span style="color: #008000; ">yes, we found!<br /></span><span style="color: #008080; ">51</span> <span style="color: #008000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; ">accToFind now hold the IAccessible pointer we need</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">52</span>                 bRet = TRUE;<br /><span style="color: #008080; ">53</span>                 SysFreeString(name);<br /><span style="color: #008080; ">54</span>                 <span style="color: #0000ff; ">break</span>;<br /><span style="color: #008080; ">55</span>             }<br /><span style="color: #008080; ">56</span>             <span style="color: #0000ff; ">else</span><br /><span style="color: #008080; ">57</span>             {<br /><span style="color: #008080; ">58</span>                 <span style="color: #0000ff; ">if</span>( (lpctFindName == NULL)<br /><span style="color: #008080; ">59</span>                     && (_tcslen(name) == 0) )<br /><span style="color: #008080; ">60</span>                 {<br /><span style="color: #008080; ">61</span>                     <span style="color: #008000; ">//</span><span style="color: #008000; ">ok, may be find a NAMELESS object</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">62</span>                     bRet = TRUE;<br /><span style="color: #008080; ">63</span>                     SysFreeString(name);<br /><span style="color: #008080; ">64</span>                     <span style="color: #0000ff; ">break</span>;<br /><span style="color: #008080; ">65</span>                 }<br /><span style="color: #008080; ">66</span>             }<br /><span style="color: #008080; ">67</span>             SysFreeString(name);<br /><span style="color: #008080; ">68</span>         }<br /><span style="color: #008080; ">69</span>     }<br /><span style="color: #008080; ">70</span> exit:<br /><span style="color: #008080; ">71</span>     <span style="color: #0000ff; ">if</span>(vt_output)<br /><span style="color: #008080; ">72</span>     {<br /><span style="color: #008080; ">73</span>         <span style="color: #0000ff; ">for</span>(<span style="color: #0000ff; ">int</span> k=0; k < lChildCount; k++)<br /><span style="color: #008080; ">74</span>             VariantClear(&vt_output[k]);<br /><span style="color: #008080; ">75</span>         delete vt_output;<br /><span style="color: #008080; ">76</span>     }<br /><span style="color: #008080; ">77</span>     <span style="color: #0000ff; ">return</span> bRet;<br /><span style="color: #008080; ">78</span> }</div></div><br />上面函数Q给Z个父节点的IAccessible和要匚w的子节点名称Q来获取子节点的IAccessible接口?br /><br />下面贴一个调用代码(for 2003/2007Q:<br /><br /><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1038.800048828125px; word-break: break-all; "><span style="color: #008080; "> 1</span>     HWND hwndOutlookWnd = FindWindow(_T("rctrl_renwnd32"), NULL);<br /><span style="color: #008080; "> 2</span>     HWND hwndTopBarDock = FindChildWnd(hwndOutlookWnd, _T("MsoCommandBarDock"), _T("MsoDockTop"));<br /><span style="color: #008080; "> 3</span>     HWND hwndOneClickBar = FindChildWnd(hwndTopBarDock, _T("MsoCommandBar"), _T("你的工具栏名U?));<br /><span style="color: #008080; "> 4</span> <br /><span style="color: #008080; "> 5</span>     IAccessible* accTop = NULL;<br /><span style="color: #008080; "> 6</span>     HRESULT hr = AccessibleObjectFromWindow(hwndOneClickBar, NULL, IID_IAccessible, (LPVOID*)&accTop);<br /><span style="color: #008080; "> 7</span>     <span style="color: #0000ff; ">if</span>(FAILED(hr))<br /><span style="color: #008080; "> 8</span>         <span style="color: #0000ff; ">return</span> FALSE;<br /><span style="color: #008080; "> 9</span> <br /><span style="color: #008080; ">10</span>     IAccessible* accToFind = NULL;<br /><span style="color: #008080; ">11</span>     <span style="color: #0000ff; ">if</span>( FindAccessible(accTop, &accToFind, _T("工具栏名U?)) )<br /><span style="color: #008080; ">12</span>     {<br /><span style="color: #008080; ">13</span>         <span style="color: #008000; ">//</span><span style="color: #008000; ">we found the OneClick toolbar IAccessbile pointer<br /></span><span style="color: #008080; ">14</span> <span style="color: #008000; ">        </span><span style="color: #008000; ">//</span><span style="color: #008000; ">now we need to find 'PUSH BUTTON' IAccessible pointer</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>         IAccessible* accBtn = NULL;<br /><span style="color: #008080; ">16</span>         <span style="color: #0000ff; ">if</span>( FindAccessible(accToFind, &accBtn, _T("PUSH BUTTON")) && (accBtn != NULL) )<br /><span style="color: #008080; ">17</span>         {<br /><span style="color: #008080; ">18</span>             <span style="color: #008000; ">//</span><span style="color: #008000; ">oh yes, we found the button<br /></span><span style="color: #008080; ">19</span> <span style="color: #008000; ">            </span><span style="color: #008000; ">//</span><span style="color: #008000; ">now do its default action (push down)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>             VARIANT varID;<br /><span style="color: #008080; ">21</span>             VariantInit(&varID);<br /><span style="color: #008080; ">22</span>             varID.vt = VT_I4;<br /><span style="color: #008080; ">23</span>             varID.lVal = CHILDID_SELF;<br /><span style="color: #008080; ">24</span>             accBtn->accDoDefaultAction(varID);<br /><span style="color: #008080; ">25</span>             VariantClear(&varID);<br /><span style="color: #008080; ">26</span> <br /><span style="color: #008080; ">27</span>             bRet = TRUE;<br /><span style="color: #008080; ">28</span>         }<br /><span style="color: #008080; ">29</span>         SAFE_RELEASE_COM_POINTER(accBtn);<br /><span style="color: #008080; ">30</span>     }<br /><span style="color: #008080; ">31</span>     <br /><span style="color: #008080; ">32</span>     SAFE_RELEASE_COM_POINTER(accTop);<br /><span style="color: #008080; ">33</span>     SAFE_RELEASE_COM_POINTER(accToFind);</div><br />里面用到的几个辅助方法:<br /><br /><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1038.800048828125px; word-break: break-all; "><span style="color: #008080; "> 1</span> HWND FindChildWnd(HWND hParent, LPCTSTR lpctClassName, LPCTSTR lpctWndName = NULL)<br /><span style="color: #008080; "> 2</span> {<br /><span style="color: #008080; "> 3</span>     HWND hChild = NULL;<br /><span style="color: #008080; "> 4</span>     <span style="color: #0000ff; ">int</span> nCount = 0;<br /><span style="color: #008080; "> 5</span>     <span style="color: #0000ff; ">while</span>(nCount < 30)<br /><span style="color: #008080; "> 6</span>     {<br /><span style="color: #008080; "> 7</span>         <span style="color: #0000ff; ">if</span>( NULL != (hChild = ::FindWindowEx(hParent, NULL, lpctClassName, lpctWndName)) )<br /><span style="color: #008080; "> 8</span>         {<br /><span style="color: #008080; "> 9</span>             <span style="color: #0000ff; ">break</span>;<br /><span style="color: #008080; ">10</span>         }<br /><span style="color: #008080; ">11</span>         nCount++;<br /><span style="color: #008080; ">12</span>     }<br /><span style="color: #008080; ">13</span>     <span style="color: #0000ff; ">return</span> hChild;<br /><span style="color: #008080; ">14</span> }</div><br /><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1038.800048828125px; word-break: break-all; "><span style="color: #008080; ">1</span> <span style="color: #0000ff; ">#define</span> SAFE_RELEASE_COM_POINTER(ptr) \<br /><span style="color: #008080; ">2</span>     { \<br /><span style="color: #008080; ">3</span>         <span style="color: #0000ff; ">if</span>( (ptr) != NULL ) \<br /><span style="color: #008080; ">4</span>         { \<br /><span style="color: #008080; ">5</span>             ptr->Release(); \<br /><span style="color: #008080; ">6</span>             (ptr) = NULL; \<br /><span style="color: #008080; ">7</span>         } \<br /><span style="color: #008080; ">8</span>     }</div><br /><br />最后要说的是,谢谢你, IAccessible 君。^_^<img src ="http://www.shnenglu.com/epubcn/aggbug/198556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2013-03-18 18:06 <a href="http://www.shnenglu.com/epubcn/archive/2013/03/18/198556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]VS2008工程转成VS2005工程的方?/title><link>http://www.shnenglu.com/epubcn/archive/2011/05/30/147678.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Mon, 30 May 2011 03:11:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2011/05/30/147678.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/147678.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2011/05/30/147678.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/147678.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/147678.html</trackback:ping><description><![CDATA[<ol><li>用文本编辑器打开.sln文gQ将<br /><font size="+0">Microsoft Visual Studio Solution File, Format Version 10.00<br /># Visual Studio 2008<br />修改?br />Microsoft Visual Studio Solution File, Format Version 9.00<br /># Visual Studio 2005</font></li><li>对于C++工程Q用文本~辑器打开<font size="+0">.vcproj文gQ?/font>?br />Version="9.00"<br />修改?br />Version="8.00"<br />然后再删?br /><font size="+0">TargetFrameworkVersion="196613"</font></li><li>对于C#工程Q用文本~辑器打开<font size="+0">.csproj文gQ删除文件开头的内容Q?br /><?xml version="1.0" encoding="utf-8"?><br />然后扑ֈ以下XML文g节点<br /><Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="<a ><font color="#103901">http://schemas.microsoft.com/developer/msbuild/2003</font></a>"><br />删除属?ToolsVersion="3.5"<br />扑ֈ以下XML文g节点<br /><Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" /><br />其修改?br /><Import Project="$(MSBuildBinPath)Microsoft.CSharp.targets" /></font></li><li><font size="+0">注意Q对于VS2008有而VS2005无的cd命名I间Q在VS2005下没法用。在W一ơ运行的时候,要删除系l默认添加的新版的命名空间和cR?/font></li></ol><img src ="http://www.shnenglu.com/epubcn/aggbug/147678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2011-05-30 11:11 <a href="http://www.shnenglu.com/epubcn/archive/2011/05/30/147678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]mstsc VS vnc : q程桌面最快的原因在于RDP协议http://www.shnenglu.com/epubcn/archive/2011/05/29/147650.htmlp色系l?/dc:creator>p色系l?/author>Sun, 29 May 2011 14:51:00 GMThttp://www.shnenglu.com/epubcn/archive/2011/05/29/147650.htmlhttp://www.shnenglu.com/epubcn/comments/147650.htmlhttp://www.shnenglu.com/epubcn/archive/2011/05/29/147650.html#Feedback1http://www.shnenglu.com/epubcn/comments/commentRss/147650.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/147650.html
[转自]http://kongjian.baidu.com/newsys007/blog/item/a2673a8649164a3b67096ed2.html

一番讨论,才明白ؓ什么windows自带的远E桌面mstsc比Ultr***NC要快?/div>
协议Q还是协议。从控制命o上入手,传送GDI命o参数Q而不是屏q的数倹{绘N由Client端实时完成。Server几乎是idle的,仅传送命令参数?/div>
Microsoft的远E桌面协?Remote Desktop ProtocolQ简URDP)
它仅传输服务器所昄的对象的属性变化的控制|实现快速远E控Ӟ相对于其它采用抓屏图片压~的q程控制软gQ如PCAnyWhere{而言Q速度更快Q控制更准确?/div>
1) winxp 使用自带的mstsc,占用资源,节约CPU?/div>
看mov实不卡?旉上看不出来。但是用souceinsight,wordq些可能是不行。一直在交互。毕竟有严迟。感觉上不爽?/div>
2) VNCpd?/div>
Ultr***NC,从驱动程序入手,自带Video Mirror DriverQ速度极大提升。比起其他抓屏幕的垃圄法YӞ改善很多? 
hq是太卡?屏幕没有像mstsc自适用?/div>
3) Dameware
Dameware一直以来以速度?支持客户端免安装(实际上是q程自动安装)而在q程控制软g领域深受q大理员喜?
支持Microsoft RDP协议, 用这个远E控制winxp和win2003Q效果和微Y的远E桌面工具一样快?/div>
4) 提高l端服务q发q接? ThinSoft.WinConnect.Server.XP
windows xp的rdp?个ƈ发数的连接限制?/div>
而WinConnect.Server.XP可以H破q个限制Q最大可以拥?1个ƈ发连接数?/div>
官方|站Q?/div>
http://www.thinsoftinc.com/products_winconserver_info.html
针对xp/2k3 sp1?/div>
5)其他的,抓屏q的垃圾设计软gQ?/div>
Radmin不比VNC快。gq比较严重。有攑֍片的感觉。切换窗口时。没什么强的。不如VNC?/div>
PCAnywhere 块头太大了,垃圾一个,性能太差。以前win98q代q有竞争力。现在不实用?/div>
写这些Y件的猪头们,“只顾埋头拉RQ不会抬头看?#8221;?/div>
一点也没有理解控制报文和数据报文的区别Q设计上是垃圾Q算法再好,也是没有效率的?/div>
设计是Y件的核心。核心是烂的Q什么也别说了。再改进也没什么意义?/div>
其他讨论Q?/div>
6)
与朋友的讨论Q搜C帖子:
Ask Slashdot: Which VNC Software is Best?
http://ask.slashdot.org/article.pl?sid=04/10/20/0132236&tid=185&tid=201&tid=4
q个帖子里面Q每个h使用的感觉都不同("YMMV--Your mileage may vary" 真是很好用的一句话)Q?/div>
有h说这个好Q有那个好,每个人的l验/感觉都不同。下面是其中的一ȝQ?/div>
RealVNC: the original.
TightVNC: optimized for low-bandwidth
Ultra: tons of extras - file transfer, chat, video driver, NT/AD security
Tridia: get around firewalls, more management features
其他相关的东西:
1. VNC Loop
http://en.wikipedia.org/wiki/VNC_Loop
2. RealVNC Password Decrypter
http://jonas.pie.la/page/code.html#vncdec
3. FreeNX (据说速度?VNC 快很多,L可以辑ֈ接近本地的速度)
http://freenx.berlios.de/download.php
7)
http://topic.csdn.net/t/20040612/20/3086704.html
q程传输屏幕行ؓ的方?(讨论)
HunterForPig (留着口水的猪)     2004-06-12 20:50:24 ?VC/MFC / |络~程 提问
实现方式Q? 
在网l上传输q一屏幕行ؓ  
每秒钟截?2ơ!压羃成jpeg,  
所以每截一?传输囑փ数据一? 
   
发现服务器端cpu使用率ؓ100%,  
晕了,不知q有何其它方法记录下屏幕行ؓ,  
或者降低cpu使用?  
   
Video   Mirror   Driver  
如果惌决CPU占用率的问题Q最Ҏ的解x案是从驱动程序入手,Windows   2000以上已经支持Mirror   DriverQ?/div>
q且已经有一些远E监控的产品使用了此技术。如果搂ȝ悉驱动编E,或许可以研究研究此种Ҏ? 
怽讨论很热烈,那我也来凑凑热闹?     
shootingstarsQ你的知识面看来比较q,在这个问题上考虑C驱动E序。事实上Q运用过滤驱动截图是最好的解决ҎQ主要包括以下两个技术点Q? 
   
1   W一屏传输。第一屏的速度是衡量屏q传输效率的重要参数Q一般来_用过滤驱动完成截图,q直接压~到Socket的缓冲区Q能够获取最快的速度Q?/div>
       压羃法中Intel   MPEG4是一个很好的选择?/div>
   
2   局部截屏传输。屏qƈ不是一个整体,而是大量象素l合成的Q我们只需要以一定的速率(率)来截取变化的像素Qƈ发送到目标机器Q就可以获得极高的传输速率?    
当然Q如何对屏幕q行局部截取,以及如何判断变化的像素,都是很大的难题,需要用qo驱动来解冟뀂事实上Q国内外的一些Y件已l实Cq一功能Q比如WinXP和Lanstar?/div>


]]>[转]TightVNC 1.3.x src的基本结构及一些概?/title><link>http://www.shnenglu.com/epubcn/archive/2011/05/27/147380.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Fri, 27 May 2011 09:14:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2011/05/27/147380.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/147380.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2011/05/27/147380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/147380.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/147380.html</trackback:ping><description><![CDATA[<div><span style="font-family: verdana, sans-serif; ">    TightVNC(Tight Virtual Network Computing)是一个远E桌面控制的开源Y?详情请参?a style="text-decoration: none; color: #006bad; ">http://www.tightvnc.com</a>.下蝲了TightVNC的代码,分析了一下其Server部分的代码, WinVNC下的文g很多Q但我们按照它们各自的功能做一下划?其结构如下:<br /><table bgcolor="#99cc33" border="0"><tbody><tr bgcolor="#eeeeee"><td>Kernel</td><td>vncBuffer.cpp vncClient.cpp vncDesktop.cpp vncServer.cpp WinVNC.cpp</td></tr><tr bgcolor="#eeeeee"><td bgcolor="#eeeeee">GUI</td><td>vncAbout.cpp vncAcceptDialog.cpp vncAdvancedProperties.cpp vncConnDialog.cpp vncMenu.cpp vncProperties.cpp vncTimedMsgBox.cpp</td></tr><tr bgcolor="#eeeeee"><td bgcolor="#eeeeee">Misc</td><td>d3des.c Log.cpp MinMax.cpp RectList.cpp stdhdrs.cpp tableinitcmtemplate.cpp tableinittctemplate.cpp tabletranstemplate.cpp translate.cpp vncauth.c vncInstHandler.cpp vncKeymap.cpp vncRegion.cpp< vncService.cpp</td></tr><tr bgcolor="#eeeeee"><td bgcolor="#eeeeee">Network</td><td>VSocket.cpp vncSockConnect.cpp vncHTTPConnect.cpp rfbproto.h</td></tr><tr bgcolor="#eeeeee"><td bgcolor="#eeeeee">Encoding</td><td>vncEncodeCoRRE.cpp vncEncodeHexT.cpp vncEncoder.cpp vncEncodeRRE.cpp vncEncodeTight.cpp vncEncodeZlib.cpp vncEncodeZlibHex.cpp</td></tr></tbody></table><br /><br /><br /><br />其服务端的主要功能模块结构如下:<br />其核心框架就是四个类vncClientQvncServerQvncDesktop和vncBuffer.下面我就q四个类之间的联pd用途来作一下简单的分析Q?br />vncServerQ?br />    vncServer 主要是做如下的一些工作:容许vncClient动态的d和删除;本地vncDesktop对象内部状态的M改变"传播"到各个客LQ传播客L的鼠标和键盘事g到本地的vncDesktop对象。同Ӟ其还创徏了vncSockConnectQvncCORBAConnect?vncHTTPConnect来接受Socket,Corba和HTTP的连接?vncServer为每个连接上来的客户端分配了一个ClientIDQ其实就是内部客户对象数l的IndexQ,q且提供了对客户端管理的众多函数Q?pre>virtual void DisableClients(BOOL state); virtual void KillClient(vncClientId client); virtual void KillAuthClients(); virtual void KillUnauthClients(); virtual vncClient* GetClient(vncClientId clientid); vncClientId AddClient(VSocket *socket, BOOL auth, BOOL shared); virtual void RemoveClient(vncClientId client); </pre>同时QvncServerq提供了对客户TeleportQCapabilityQKeyboardEnabledQPointerEnabledQNameQAuthenticated属性的get/setҎ?br />下面我们来看一下vncServer对客Lq接上来和客L认证成功q两个事件的处理程Q?br />vncServer::AddClientQ?br />     首先vncServer在其内部的vncClient *m_clientmap[MAX_CLIENTS]数组中ؓ新连接上的客L分配一个空闲的slotQƈ其作ؓ此客L clientID. 然后Qؓ此连接分配一个vncClient对象Q根据传递过来的参数Q设|vncClient对象的相兛_性,然后调用vncClient::InitҎvncServer的实例指针和 clientID传给vncClient实例。接着Qm_clientmap[clientid] = clientq将此用户加入vncServer的未认证用户链表?br />vncServer::Authenticated(vncClientId clientid)Q?br />     首先从未认证用户列表中根据clientid获取vncClient对象Qƈ其从unauth list 中删除。如果是vncServer的第一个用P创徏vncDesktop对象Qƈ调用m_desktop->Init(this)来初始化?vncDesktop对象。接下来Qؓq个用户分配一个vncBuffer *buffer = new vncBuffer(m_desktop);q过调用vncClient::SetBuffer为vncClient讄q个BufferQ最后将此用h加到auth list中?br />    vncServer提供了一个用户列表的操作接口Q这些接口通过vncServer的方法调用映到对auth list中各个客L同样的方法的函数调用Q这些方法有Q?pre>virtual void TriggerUpdate(); virtual void UpdateRect(RECT &rect); virtual void UpdateRegion(vncRegion ®ion); virtual void CopyRect(RECT &dest, POINT &source); virtual void UpdateMouse(); virtual void UpdateClipText(LPSTR text); virtual void UpdatePalette(); </pre>vncDesktop:<br />    vncDesktop是一个全局唯一的对象,Ҏ注释QvncDesktop主要是处理从display buffer中获取数据;同时Q它q利用RFBLib DLL为vncServer提供诸如鼠标Ud和屏q更新等信息。上面提刎ͼvncServer在第一个用戯接上来时发现其m_desktop为空时就创徏一个vncDesktip对象Qƈ调用 vncDesktop::Init(this)对其初始?在vcnDesktop::Init的实C我们发现其创Z一?vncDesktopThreadQvncDesktop的方法调用大部分都在q个vncDesktopThread里完成的.下面我们来分析一下这个线E都做了些什?<br />vncDesktopThread::run_undetached(void *arg)Q?br />     首先调用vncDesktop::Startup初始化,vncDesktop对象Q见vncDesktop::StartupQ,然后是处理桌面消息Q调?m_server->UpdateMouse()和m_server->UpdateRegion(rgncache) Q接下来调用vncServer::TriggerUpdate来发送屏q更新到每个vncClient.然后是处理RFB_SCREEN_UPDATE和RFB_MOUSE_UPDATEq两个注册消息?nbsp;<br /><br />vncClient:<br />    vncClient做了数据发送的工作Q在vncClient::SendUpdate函数的实CQ我们可以看到vncClient调用SendRFBMsg首先发?number rectangles="" of=""></number> ,然后SendCursorShapeUpdate发送鼠标Ş状更斎ͼSendCursorPosUpdate发送鼠标Pos更新Q发送SendCopyRectQ最后调用SendRectangles发送需要更新的矩Ş的相x据。其实每个客LvncClient在调用vncClient::Init初始化的时候都开了一个线E,客户端的行ؓ基本上都是在vncClientThread::run里完成的。该U程在跟客户端交互完成了认证QPixel格式QEncoding法{信息的协商后,p入一个loop循环开始接受和处理q程客户端发q来的rfbSetPixelFormatQrfbSetEncodingsQ?rfbFramebufferUpdateRequestQrfbKeyEventQrfbPointerEventQrfbClientCutText 消息?nbsp;<br /><br />vncBuffer:<br />    vncBuffer主要处理发送数据的Encoding工作Q其提供了远E客L本地视图Q其主要是利用内部的vncDesktop指针来获取相关的数据?nbsp;</span></div><img src ="http://www.shnenglu.com/epubcn/aggbug/147380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2011-05-27 17:14 <a href="http://www.shnenglu.com/epubcn/archive/2011/05/27/147380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]RFB与RDP的区?/title><link>http://www.shnenglu.com/epubcn/archive/2011/05/26/147174.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Thu, 26 May 2011 03:34:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2011/05/26/147174.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/147174.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2011/05/26/147174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/147174.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/147174.html</trackback:ping><description><![CDATA[<div><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 22px; color: #424242; "><span style="line-height: 22px; color: #008000; "><span style="line-height: 22px; ">转自Q?div style="display: inline-block; "><div><a ><span>http://blog.163.com/vinstars@126/blog/static/16362819120104610273654/</span></a></div></div><br /><br /><strong>RFB (<a style="color: #555555; line-height: 22px; text-decoration: none; "></a></strong><strong style="line-height: 22px; color: black; background-color: #ffff66; font-weight: bold; ">remote</strong><strong> framebufer)和RDPQ?/strong><strong style="line-height: 22px; color: black; background-color: #ffff66; font-weight: bold; ">Remote</strong><strong> Desktop Protocol)</strong></span></span><br style="line-height: 22px; " /><br style="line-height: 22px; " />RFB的典型应用有VNCQHP的RGS也是cM的设计,另外一些远E控制Y件也可以归ؓRFB RDP的典型应用有Windows的远E桌面,同时Linux, FreeBSD, Solaris ,Mac OS X以及PalmOS都有对RDP的支持?br style="line-height: 22px; " /><br style="line-height: 22px; " /><span style="line-height: 22px; color: #ff4500; ">二者具体的区别比较可以参?/span>: <a target="_blank" style="color: #555555; line-height: 22px; text-decoration: none; ">http://www.gnome.org/~markmc/<strong style="line-height: 22px; color: black; background-color: #ffff66; ">remote</strong>-desktop.html</a> <br style="line-height: 22px; " /><br style="line-height: 22px; " />两种设计在声音以及协同操作方面上有不同,但对两种设计在窗口显CZq行比较Q更能说明它们的本质区别。下面D两个具体的例子:<br style="line-height: 22px; " /><br style="line-height: 22px; " />1、在一台装有高端显卡的囑Ş工作站上q行一个用了高版本OpenGL的实时交互窗口程序,如果采用RFBQ那么即使本地客L配置较低Q用的是较低端的昑֍Q只要网l通畅׃般能跑得很顺畅,但如果用的是RDPQ即使网l再好,q个E序也永q跑不v来?br style="line-height: 22px; " /><br style="line-height: 22px; " />2、还是用昑֍配置较低的客hd到远端服务器Q由于登录后的系l配|要求的屏幕分L率较高,客户Z可能使用q个分L率进行显C,Zl箋q行Q用RFB的应用显CZq个桌面Q这时你会发现它只显CZ桌面的一部分Q或者将整个桌面按比例羃后昄出来Q而用RDP的应用就很麻烦了Q客L通知服务器目前的状态,希望服务器改变当前配|以适应客户端能接受的分辨率?a style="color: #555555; line-height: 22px; text-decoration: none; "></a><br style="line-height: 22px; " /><br style="line-height: 22px; " />׃上的例子可以看出Q?strong style="line-height: 22px; ">RFB是在服务器端窗口在昑֭中画好之后将囑փ传给客户端,客户端只充当一个图像解码显C的角色Q?RDP则将d的工作交l了客户端,服务器需要了解客L昄能力的具体情况,以便作出相应调整?/strong><br style="line-height: 22px; " /><br style="line-height: 22px; " />ȝh可以认ؓQ?strong style="line-height: 22px; ">RFB主要传图像,RDP主要传指?/strong>。就一般应用而言QRFB数据量太大,RDP对客L要求较高Q因此RFB适用于瘦客户端,RDP适用于低速网l?br style="line-height: 22px; " /><br style="line-height: 22px; " /><strong style="line-height: 22px; ">What's RDP?</strong><br style="line-height: 22px; " /><strong style="line-height: 22px; color: black; background-color: #ffff66; ">Remote</strong> Desktop Protocol (RDP) is a multi-channel protocol that allows a user to connect to a computer running Microsoft Terminal Services. Clients exist for most versions of Windows (including handheld versions), and other operating systems such as Linux, FreeBSD, Solaris and Mac OS X, as well as PalmOS has a client. The server listens by default on <strong style="line-height: 22px; ">TCP port 3389</strong>.Microsoft refers to the official RDP client software as either <strong style="line-height: 22px; color: black; background-color: #ffff66; ">Remote</strong> Desktop Connection (RDC) or Terminal Services Client (TSC).<br style="line-height: 22px; " /><br style="line-height: 22px; " /><strong style="line-height: 22px; ">What's RFB?</strong><br style="line-height: 22px; " />RFB (“<strong style="line-height: 22px; color: black; background-color: #ffff66; ">remote</strong> <a style="color: #555555; line-height: 22px; text-decoration: none; "></a><strong style="line-height: 22px; color: black; background-color: #a0ffff; ">framebuffer</strong>”) is a simple protocol for <strong style="line-height: 22px; color: black; background-color: #ffff66; ">remote</strong> access to graphical user interfaces. Because it works at the <strong style="line-height: 22px; color: black; background-color: #a0ffff; ">framebuffer</strong> level it is applicable to all windowing systems and applications, including X11, Windows and Macintosh. RFB is the protocol used in Virtual Network Computing (VNC) and its derivatives.<br style="line-height: 22px; " />Although RFB started as a relatively simple protocol it has been enhanced with additional features (such as file transfers) and more sophisticated compression and security techniques as it has developed. To maintain seamless cross-compatibility between the many different VNC client and server implementations, the clients and servers negotiate a connection using the best RFB version, and the most appropriate compression and security options, that they can both support.<br style="line-height: 22px; " />VNC by default uses <strong style="line-height: 22px; ">TCP ports 5900 through 5906,</strong> each port corresponding to a separate screen (:0 to :6).<br style="line-height: 22px; " /><br style="line-height: 22px; " /><strong style="line-height: 22px; ">What's VNC?</strong><br style="line-height: 22px; " />VNCQVirtual Network ComputingQ虚拟网l计)最早是一套由英国剑桥大学AT&T实验室在2002q开发的轻量型的q程控制计算YӞ光用了 GPL 授权条款QQ何h都可免费取得该Y件。VNC软g主要׃个部分组成:VNC server及VNC viewer。用户需先将VNC server安装在被控端的计机上后Q才能在L端执?VNC viewer 控制被控端?nbsp;<br style="line-height: 22px; " />VNC server ?VNC viewer 支持多种操作pȝQ如 windowsQLinuxQMacOS ?Unix pdQUnixQSolaris{)Q因此可?VNC server ?VNC viewer 分别安装在不同的操作pȝ中进行控制。RealVNC 的优性还在于如果操作pȝ的主控端计算机没有安?VNC viewerQ也可以通过一般的|络览器(?IE {)来控制被控端Q需?Java 虚拟机的支持Q?br style="line-height: 22px; " /><br style="line-height: 22px; " />整个 VNC 一般运行的工作程如下Q?nbsp;<br style="line-height: 22px; " />Q?Q?VNC 客户端通过览器或 VNC Viewer q接?VNC Server?nbsp;<br style="line-height: 22px; " />Q?Q?VNC Server 传送一对话H口臛_LQ要求输入连接密码(可能为空Q,以及存取?VNC Server 昄装置?nbsp;<br style="line-height: 22px; " />Q?Q?在客L输入q接密码后,VNC Server 验证客户端是否具有存取权限?nbsp;<br style="line-height: 22px; " />Q?Q?若是客户端通过 VNC Server 的验证,客户端即要求 VNC Server 昄桌面环境?nbsp;<br style="line-height: 22px; " />Q?Q?被控端将画面昄控制权交?VNC Server 负责?nbsp;<br style="line-height: 22px; " />Q?Q?VNC Server 把被控端的桌面环境利用 VNC 通信协议送至客户端,q且允许客户端控?VNC Server 的桌面环境及输入装置?br style="line-height: 22px; " /><br style="line-height: 22px; " /><span style="line-height: 22px; color: #ff4500; ">RFB协议 </span>: <a target="_blank" style="color: #555555; line-height: 22px; text-decoration: none; ">http://en.wikipedia.org/wiki/RFB</a><br style="line-height: 22px; " /><br style="line-height: 22px; " /><span style="line-height: 22px; color: #ff4500; ">RDP协议</span> : <a target="_blank" style="color: #555555; line-height: 22px; text-decoration: none; ">http://en.wikipedia.org/wiki/<strong style="line-height: 22px; color: black; background-color: #ffff66; ">Remote</strong>_Desktop_Protocol</a><br style="line-height: 22px; " /><br style="line-height: 22px; " /><span style="line-height: 22px; color: #ff4500; ">常见q程桌面软gҎ</span> : <a target="_blank" style="color: #555555; line-height: 22px; text-decoration: none; ">http://en.wikipedia.org/wiki/Comparison_of_<strong style="line-height: 22px; color: black; background-color: #ffff66; ">remote</strong>_desktop_software</a></span></div><img src ="http://www.shnenglu.com/epubcn/aggbug/147174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2011-05-26 11:34 <a href="http://www.shnenglu.com/epubcn/archive/2011/05/26/147174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>首页怎么乱成q个样子Q?/title><link>http://www.shnenglu.com/epubcn/archive/2011/02/15/140088.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Tue, 15 Feb 2011 07:17:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2011/02/15/140088.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/140088.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2011/02/15/140088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/140088.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/140088.html</trackback:ping><description><![CDATA[真的是好久好久、好久好久没写这个blog了。首|么乱成q个样子了? <br><br>刚才在blog选项中鼓捣了好久Q终于发现这个style不ؕ了,先用q个吧? <img src ="http://www.shnenglu.com/epubcn/aggbug/140088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2011-02-15 15:17 <a href="http://www.shnenglu.com/epubcn/archive/2011/02/15/140088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l于在我的HP 6515B 上激zMWINDOWS 7 RTM U?/title><link>http://www.shnenglu.com/epubcn/archive/2009/08/29/94765.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Sat, 29 Aug 2009 07:39:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2009/08/29/94765.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/94765.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2009/08/29/94765.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/94765.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/94765.html</trackback:ping><description><![CDATA[ vista用了有一D|间了Q最q看同事装了个WIN 7Q挺新鲜Q决定也装一个?br>昨天晚上从远景下载了一个cn_windows_7_ultimate_x86_dvd_x15-65907.isoQ刻盘,安装Q然后开始艰苦的Ȁzd试?br>折腾到凌?点,几乎所有的Ȁz补丁、工具都试过了,是不成功,有些x弃了?br><br>今天早上h又上|搜索了一下HP 6515B相关的帖子,H然发现有h成功ȀzMQ最早的帖子是这:<br><a >http://benyouhui.it168.com/thread-985830-3-1.html</a><br><br>然后按照帖子里面的说明,下蝲安装?span style="font-family: Helvetica; border-collapse: collapse; font-size: 14px; line-height: 22px; ">grub4dosQ然后把slic.bin、grldr以及menu.lst复制到C盘下?br></span><span style="font-family: Helvetica; border-collapse: collapse; font-size: 14px; line-height: 22px; ">用SLIC_Dump_TooKit查看BIOS的SLIC版本Q原来是昄ErrorQ装了grub4dos以后Q显C?.1了?br>最后用q景论坛上一哥们儿提供的oemȀzd兯行激z,重启以后q是昄没激z,郁闷。然后又执行了一遍这个激zdL卸蝲Q但是好像显CZ么错误,不管他,重启机器?br>不甘心那Q运行SLIC_Dump_TookitQ又昄Error了,再试一遍:安装grub4dosQ这下SLIC又显C?.1了。再重启机器……<br><br>q入WIN 7Q按WIN+PauseQ我靠!竟然昄Windows已激zMQ!哈哈?#8230;…gɼ差地让我给弄好了?br>亢奋?#8230;…<br><br>后来又在|上发现另外一帖子,也是用差不多的方式激zMQ不q他是导入证书ƈ用keyȀzȝQ?a >http://benyouhui.it168.com/thread-988200-1-1.html</a><br>以后有机会可以试试这U方法?br><br>接下来开始装各种各样的Y件咯……</span><img src ="http://www.shnenglu.com/epubcn/aggbug/94765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2009-08-29 15:39 <a href="http://www.shnenglu.com/epubcn/archive/2009/08/29/94765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】搜狐白C会阛_牧场外挂 UI源代?/title><link>http://www.shnenglu.com/epubcn/archive/2009/08/11/92913.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Tue, 11 Aug 2009 08:14:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2009/08/11/92913.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/92913.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2009/08/11/92913.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/92913.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/92913.html</trackback:ping><description><![CDATA[好多朋友需要我写的阛_牧场外挂的界面代码,今天抽空打了个包Q提供给各位下蝲?br><br>一些说明:<br><br>1、界面主要是ZXT的早期版本(大概??q前的版本)中rip出来的代码,做了一些修攏V代码中q有不少问题Q我没有M正。因为我工作中写界面是不用MFC的,q次是ؓ了写q个外挂才把以前的老界面coded来?br><br>2、源代码解压后,有个XTUILib目录Q里面就是rip出来的全部XT的代码。把q个目录搞到你的工程中去以后Q还有很多其他事情要做:<br>Q?Qresource.h中所有以XT或XTP开头的资源IDQ要搞到你的工程去;<br>Q?Qrc文g中所有以XT或XTP开头的资源Q主要是一些图标、对话框、bitmap之类的)也要搞到你的工程里去Q资源文件在res目录下你可以扑ֈ?br><br>3、XT的用,误行到官网或国内其他编E站Ҏ一下,q里׃赘述了?br><br><a target="_blank">点击q里下蝲</a>Q?52KBQ?img src ="http://www.shnenglu.com/epubcn/aggbug/92913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2009-08-11 16:14 <a href="http://www.shnenglu.com/epubcn/archive/2009/08/11/92913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】TinyJSON使用介绍http://www.shnenglu.com/epubcn/archive/2009/08/05/92267.htmlp色系l?/dc:creator>p色系l?/author>Wed, 05 Aug 2009 03:56:00 GMThttp://www.shnenglu.com/epubcn/archive/2009/08/05/92267.htmlhttp://www.shnenglu.com/epubcn/comments/92267.htmlhttp://www.shnenglu.com/epubcn/archive/2009/08/05/92267.html#Feedback6http://www.shnenglu.com/epubcn/comments/commentRss/92267.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/92267.html阅读全文

]]>
【原创】阳光牧场外挂的主要~写思\介绍http://www.shnenglu.com/epubcn/archive/2009/07/27/91315.htmlp色系l?/dc:creator>p色系l?/author>Mon, 27 Jul 2009 04:38:00 GMThttp://www.shnenglu.com/epubcn/archive/2009/07/27/91315.htmlhttp://www.shnenglu.com/epubcn/comments/91315.htmlhttp://www.shnenglu.com/epubcn/archive/2009/07/27/91315.html#Feedback23http://www.shnenglu.com/epubcn/comments/commentRss/91315.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/91315.html其实q样的一个外挂没有什么高q技术,只需要?个辅助工具和1门你熟悉的编E语aOK了?br>
废话不多_我就开门见q接介l了?br>
你需要准?个工PHttpWatchQ或HttpAnalyzerQ,以及JSONViewer(http://www.codeplex.com/JsonViewer)
HttpWatchQ或HttpAnalyzerQ是收费软gQJSONViewer是free的。另外你也可以安装Firefox的JSONView插gQ也可以不用JSONViewer?br>
~写M一个WEB应用外挂Q第一步肯定都是登录。只有正登录了Q才能l后面的操作?br>
我们先拿HttpWatch来分析一下搜狐白C会的登录过E?br>
W一部分Q登?/span>
1、打开http://bai.sohu.comQ如果你以前已经d了,先退出来到要求你输入email和密码的面
2、按下HttpWatch的Record按钮Q然后在面上输入Email和密码,点登录。然后你会进入白C会首页。这个时候看一下HttpWatch记录的轨q,如下Q?br>
上面的图中我d了filterQ把囄什么的qo掉了?br>3、通过上面HttpWatch记录的轨q,我们很容易看刎ͼd的真实URL是:
http://passport.sohu.com/sso/login.jsp?userid=你的E-MAIL账号&password=密码?amp;appid=1062&persistentcookie=1&s=1248665199215&b=2&w=1440&pwdtype=1
上面地址中,userid是你d时输入的email地址Qpassword是经qmd5加密的字W串Qs是时_1970-1-1到现在的U数Q应该是q个账号注册的时间。在C语言中可以用time()函数来生)Qw应该是计机屏幕X方向的分辨率Qpersistentcookie表示保存cookieQb和pwdtype是一个常量,不知道具体含义(我们也不需要关心)?br>
OKQ通过上面我们看到的URLQ就可以完成账号d了?br>
W二部分Q进入阳光牧?/span>
1、打开HttpWatch的RecordQ点击首左侧的“阛_牧场”QHttpWatch会将每个面动作都记录下来。我们可以看刎ͼ阛_牧场的真实地址是http://bai.sohu.com/app/farm/。在HttpWatch中选中http://bai.sohu.com/app/farm/q条记录Q在下方的Content늭中,可以看到q个面的source codeQ?br>
2、你可以把这个页面的source code复制出来Q到dreamweaver或其他编辑器中查看,你会发现Q这个网其实包含了几个iframe。其中有一个iframeQ才是真正的、中间那个阳光牧场的大flash的地址Q?span style="font-weight: bold;"><iframe src="http://sh_farm.rekoo.com/embed_swf/?so_sig_uid=6位数?amp;so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1" frameborder="0" width="796" height="590" scrolling="no"></iframe>

在上面的地址中,so_sig_uid是你在搜狐白社会网站的用户IDQ这个ID对一般用h说没什么用Q是每个用户在数据库中的标识。但是对我们~写外挂来说Q就很有用了Q所以在q个地方Q你需要将q个ID保存下来Q以后要用到?br>
3、在览器中输入http://sh_farm.rekoo.com/embed_swf /?so_sig_uid=6位数?amp;so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1Q你会发现浏览器中只留下刚才我们看到的中间的那个大flash了,其他的通通都没有了。事实证明我们找到的q个iframe是正的。(注:执行此步骤时Q别忘了打开HttpWatch的RecordQ?br>
4、在HttpWatch中选中上面的地址Q观察一下返回的ContentQ?br>

5、在上面我选中的高亮部分中Q你能看到session_name、session_value、uid{一些信息。其中对我们非常重要的一个值就是session_value。有qweb开发经验的朋友都知道,d后,在站点中是有一个session在client端维护着用户的一些信息,q且q个session是每ơ登录都会生的随机字符Ԍq且有一定的有效期(q理权配置Q。所以,我们要模拟web的动作,需要拿到正的session字符Ԍ也就是上面我们看到的那个session_value?br>
其实到目前ؓ止,我们的分析工作已l进行了一大半了。简单ȝ一下:
我们上面做了那么多事情,最重要辑ֈ两个目的Q?br>Q?Q如何模拟用L?br>Q?Q获得正的UID和sessionid

另外Q关于sessionid的获取还有其他方法,例如Q如果你使用的是JavaQ可以从cookie中读取到sessionid?br>
W三部分、分析阳光牧场各U操?/span>
有了上面的基Q下面的分析直是易如反掌了?br>1、打开HttpWatch的RecordQ将上面的http://sh_farm.rekoo.com/embed_swf /?so_sig_uid=6位数?amp;so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1 重新h一下?br>2、在HttpWatch中,你会看到很多q样的地址Qhttp://sh_farm.rekoo.com/get_api/Q这个地址那可是相当的重要啊,几乎所有的命oh都是往q个地方发?br>3、选中http://sh_farm.rekoo.com/get_api/ Q在下面的POST Data中可以看刎ͼ

原来q是一个标准的http posthQ完整的URL是Q?span style="font-weight: bold;">http://sh_farm.rekoo.com/get_api/?method=user.get_friends&rekoo_killer=你的6位UID&sessionid=刚才我们从页面上获取到的session_value
然后我们点击旁边的Content늭Q看到服务器q回的内容如下:


上面是典型的JSON数据Q接下来怎么做不用我说了吧。你可以把上面的内容复制到JSONViewer中,它提供了树Şl构供你方便的展开每个节点Q以分析父子关系、每个节点的cd{信?

4、上面我们看到的是获取好友列表的hQ其他的诸如获取商店信息、杀虫浇水、播U、收?#8230;…h地址都是http://sh_farm.rekoo.com/get_api/Q只不过post的参C同而已。将正确的参数postl服务器Q服务器׃q回相应操作的JSON数据l你Q有了这些数据,你就可以q行后期的分析处理了?br>
OKQ通过上面文字的介l,怿各位已经明白了,q样的一个外挂是怎么工作的了?span style="font-weight: bold;">




]]>
【原创?搜狐白社会阳光牧场外挂(暂时不能工作聊~~%>_<%Q?/title><link>http://www.shnenglu.com/epubcn/archive/2009/07/19/90564.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Sun, 19 Jul 2009 15:51:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2009/07/19/90564.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/90564.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2009/07/19/90564.html#Feedback</comments><slash:comments>454</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/90564.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/90564.html</trackback:ping><description><![CDATA[<span style="COLOR: #999999">2个月前受搜狐的一个同学推荐,加入了搜狐白C会q个SNS。感觉搜狐干什么都比别人慢一步,SNS都烂大街了,它才搞一个出来?br>里面也有一个种菜的lgQ叫阛_牧场。开始以为是搜狐自己开发的Q因为外观和开心网不太一P感觉没有走寻常\。觉得挺新鲜Q就开始玩儿了。大概玩儿了1个月Q觉得每天上来收剌Ӏ杀虫、浇水太ȝ了,所以萌发了写一?#8216;收割?#8217;的想法。不q以前没写过cM东西。刚开始还觉得挺新鲜的Q等q个‘收割?#8217;写的差不多了Q剩下的是工作量了。因为每天要工作Q回家还要跟儿子玩儿Q每天都是挤半小时一时写一点,l于搞了一个差不多能用的beta版了。觉得这个东东对别h可能有用Q所以发上来。其实还有一些想法没有开发,但ؓ了赶在今天(今天是我儿子?个月Q发布一个版Q就先把x放一放,待以后慢慢添加吧?br><br>q个外挂是用MFC写的QMFC写界面还是比较快Q比WTL快一点,虽然体积大。网l部分也是用的MFC的封装类。比较麻烦的是JSON数据的解析,因ؓJSONq种数据格式在其他语aQ如JAVA、C#Q都有非常成熟的操作cdQ比如C#有Newtonsoft.JsonQ,C++解析h比较ȝQ在JSON|站上提供的几个C++版本Q试用了一下,觉得TinyJSON体积较小Q用v来还方便,最后就选了它?br><br>OKQ不多说了,q是W一个beta。如果可能,我会不定期更斎ͼd一些新的内容的?br>如果有用q的朋友发现了什么错误,记得告诉我。毕竟这个东东没有经q严格的试Q很多容错处理我都没有做。慢慢完善吧?br><br></span>======================================<br><span style="COLOR: #999999">点击q里下蝲Qv1.0 b0719Q(301KBQ?br>点击q里下蝲Qv1.0 b0722Q(536KBQ?br>点击q里下蝲Qv1.0 b0723Q(535KBQ?br>点击q里下蝲Qv1.0 b0730Q(542KBQ?br>点击q里下蝲Qv1.0 b0807Q(545KBQ?br>点击q里下蝲Qv1.0 b0904Q(676KBQ?br>点击q里下蝲v1.0 b0904 PatchQ?60KBQ?br>点击q里下蝲</font>Qv1.0 b0909Q(676KBQ?br>点击q里下蝲Qv1.0 b0925Q(679KBQ?br>点击q里下蝲Qv1.0 b0930Q(730KBQ?br>点击q里下蝲Qv1.0 b1110Q(730KBQ?/span><br>==========以上版本不再提供下蝲==========<br><br><span style="BACKGROUND-COLOR: #ffff00">2009q?2?3?br>郁闷啊郁P昨天早上刚修改了E序Q下午阳光牧场又改了。不知道是不是故意行为?br>刚才重新分析了一下,发现大问题:发送的hq去Q服务器不返回数据。看来搜狐真的是在防备外挂咯。。?br>q个问题比较ȝQ目前我q不知道怎么修改Q所以新版本什么时候能发布Q我也说不好了。。?br><br>2009q?2?5?br>真是怸单行Q昨天公司竟然把白社会给了Q不能访问了Q可能游戏太多了。本来想试一些新的方法再试试Q这下歇菜了Q只能回家弄了,哎没有办法利用白天的旉了,郁闷。郁闗?br><br>另外有个朋友l我留言Q说有个外挂q能用,要不大家先用q个吧:<a >http://code.google.com/p/sunfarm/downloads/list</a><br>用java写的Q好像没有界面,需要安装JDKQ自己配|̎L信息?br><br>啥时候能写出来新的,我也说不好了Q实在抱歉?br></span><br><a ><u><span style="FONT-SIZE: 18pt">点击q里下蝲</span></u></a><span style="FONT-SIZE: 14pt">Qv1.0 b1222Q(731KBQ?span style="COLOR: red">Q?lt;-q个现在不能用了哦,别下载了。)</span><br></span><br><span style="COLOR: #ff0000">【更新历双Ӏ?br><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>2009.12.22<br></strong> 1、modifiedQ添加了几种新商品的数据Q需要酷币购乎ͼQ圣诞树、松树、大白菜Q麋ѝ火鸡?br> 2、modifiedQ针对白C会阛_牧场代码修改DE序不能执行偷取操作的问题修正?br></span></span></span></span><strong><br>2009.11.10<br></strong> 1、modifiedQ根据近期商店数据更斎ͼ对商店明l表、工作数据做Z相应的更?br> 2、modifiedQ针?009-11-09白社会阳光牧场升U导致程序不工作的问题做了一些修?br> 3、modifiedQ更改工作周期范_调整?5分钟~120分钟Q不合法的范围将被强制恢复至默认?0分钟<br></span><br></span><strong>2009.11.04 商店数据更新<br></strong>d了新作物数据Q樱桃、橘子、桂圆、红?br>更新了所有作物的最新数据,请在E序中主菜单‘工具’中选择‘查看商店明细’命o查看?br></span></span></span><br><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>2009.9.30<br></strong>1、addedQ添加几U需要酷币购买的商品数据Q中国心、蘑菇、红辣椒、喜鹊、绿孔雀Q?br>2、addedQ添加施肥功能(仅普通化肥)<br>3、bugfixQ修复了收获Z^动物最后一ơ农产品后,不能立即清理q放L动物的问?br>4、improvedQ一些界面修?br></span><br><strong>2009.9.25</strong><br>1、addedQ添加商店新数据Q包括几U新作物和新动物。ƈ且修改了其他旧商品的数据?br>2、improvedQ添加偷取、收L果判断的机制Qƈ在失败时输出错误原因?br>3、bugfixQ修复了不能收获和偷取畜牧场Z^动物的农产品问题?br>4、improvedQ修改了输出日志中的一些措辞?br></span><br><span style="COLOR: #000000"><strong>2009.9.19 商店数据更新</strong><br>更新了新作物数据Q木菠萝、柿子、捕蚊草、水蜜桃、香?br>更新了新动物数据Qľ、山、半l毛、普通奶?br><br><strong>2009.9.15 商店数据更新<br></strong>更新了新作物数据Q柠檬、荔枝、墨西哥仙h?br>更新了新动物数据Q广西小麻鸭、莆田黑?/span><br><br><strong><span style="FONT-WEIGHT: normal"><strong>v1.0 b0909<br></strong>1、修复了0904 Patch中多账号在获取花园地址时发生的问题?br>2、bugfixQE视周期时长设|在某种情况下不准确的问题?br></span><br>v1.0 b0904 Patch<br></strong>修复了因9?日白C会修改了阳光牧场的|页代码Q导?904版无法正常工作的问题?br><br><strong>v1.0 b0904<br></strong>1、addQ按成熟/下蛋旉偷取好友花园和畜牧场产品Q按时收莯家花园和畜牧Z品?br> <div style="PADDING-LEFT: 10px"> <div style="PADDING-BOTTOM: 10px; BACKGROUND-COLOR: rgb(241,241,241); PADDING-LEFT: 10px; WIDTH: 97%; PADDING-RIGHT: 10px; BORDER-LEFT-COLOR: rgb(227,227,227); PADDING-TOP: 10px"><strong>关于按时偷取的说?/strong><br>(1) 因多斚w因素影响Q本E序不能保证100%偷取率。其中花园的偷取率要略高于畜牧场?br>(2) 偷取p|Ӟ可能发生的原因主要有以下几种Q这里做一些说明:<br><strong>【所剩无几了Q不能再偷了】或【没有蛋可以偗?/strong><br>可能׃E序判断增量存在偏差,也有可能有其他好友(或外挂程序)在同时偷取,D被瞬间偷光。因同一时刻多方偷取Q是否成功存在一定的偶然性,故出现这L提示Q属于正常现象。(偷取p|多数情况都是q样的原因。)<br><strong>【还没有成熟Q等成熟了再来吧?/strong><br>E序计算的作物成熟时间存在较大偏差,虽经q多ơ重试偷取操作,但有可能q会发生此类问题。这U情况需要l测试和逐步改善?/div> </div> 2、modifiedQE视工作周期默认值改?0分钟Q自定义讄允许范围改ؓ30~720分钟?br>3、addQ添加给好友花园放虫功能Q以及惊吓好友的动物的功能。默认不选择Q可在每个̎号中单独讑֮?br>4、add : d启动画面Q以提升用户体验Q在账号数据量较大时Q由于程序初始化加蝲旉q长Q程序会‘停滞’一定时_<br><br><span style="COLOR: red"><font color=#000000><strong>v1.0 b0807<br></strong>1、addQ添加优先播U包裹中的作物种子和动物宝宝的功能,默认不生效,可在每个账号讄面单独讑֮?br>2、addQ添加检查程序新版本的功能(主菜?#8220;帮助”->“查更?#8221;命oQ?br>3、addQ添加ؓ好友的畜牧场的水槽添水的功能Q默认不生效Q可在每个̎可|页面单独设定?br></font></span><br><strong>v1.0 b0730</strong><br>1、addQ添加统计信息功能(可统计本ơ程序运行后发生的偷取次数、杀虫浇水、治病次数统计)<br>2、addQ从旧版本程序恢复̎号和E序配置信息的功能(主菜?#8220;讄”下)<br>3、addQ当向服务器发送数据请求失败时Q重试的ơ数和间隔时间设定(“选项”对话框中Q?br>4、addQ每ơE视前是否先更新好友列表变为可选项Q在每个账号面中单独设定)<br>5、improvedQ修ҎU作物以及放d物组合框在选取改变后的处理方式Q避免选择后因鼠标滚轮D误操作?br>6、improvedQ作物种子列表中Q去除了不可购买的商品。作物种cL加了蒲公英?br><br><strong>v1.0 b0723</strong><br>1、bugfixQ服务器q回数据错误Ӟ会引L序抛出异常?br>2、bugfixQ日志中昄偷取到果实(或农产品Q,但实际上未偷取成功?br>3、addQ自动出?span style="COLOR: red"></span>包裹中的果实和农产品Q默认不出售Q可在每个̎号页面中讑֮?br>4、addQ自动领取每日登录奖励包<br>5、addQؓ畜牧场水槽添水的功能Q默认不LQ可在每个̎号页面中讑֮?br>6、improvedQ减每个操作间隔,提高d执行速度?br>7、improvedQ当服务器返回错误内Ҏq回I数据时Q添加重试机Ӟ5U重试一ơ,共重?ơ)。添加重试机制后Q会改善在好友数q多Ӟ׃服务器返回错误信息而导致进入好友牧场失败的情况。但仍不能避免在重试多次后,服务器仍然返回错误信息的情况发生。如发生q样的情况,h动偷取?br><br><strong>v1.0 b0722</strong><br>1、bugfixQ鼠标点选̎号列表会D账号不工?br>2、addQ增加E视Q务日志的保存功能Q可以在{选项}中进行设|,默认不保存日?br>3、addQ̎号列表添加上UR下UL钮,以帮助用h变̎L巡视序<br>4、addQ添加了E序异常日志输出Q如在执行E视Q务时Q发生了错误Q程序会当时的情况输出到程序运行目录下的trace.txt<br>5、addQ主菜单d?#8220;工具”-“查看商店明细”命oQ执行后会打开一个excel文gQ里面包含花园和畜牧场各U作物(动物Q的h、生长时间以及收益比?br>6、improvedQ程序改?#8220;在静态库中?MFC”~译Q去除对MFC 8的几个DLL的依赖,但程序体U增长了500多KB?br><br><strong>v1.0 b0719</strong><br>W一个版本。实C以下基本功能Q?br>1、多账号l护<br>2、当前̎L好友信息、花园牧Z息手动读?br>3、多账号定时巡视Qƈ按照讑֮对花园执行:杀虫浇水、收莗铲除、播U,对畜牧场执行Q治病、收获农产品、清理动物、放d?br>4、可按照讑֮对全部好友或某些好友执行h实、偷农品、帮助杀虫浇水、帮助治疗动?br><br><span style="COLOR: red">【程序目录结构及版本升Ҏ?br></span>E序目录l构如下Q?br>DataQ数据目录)<br>  |--StoreQ商店数据)<br>      |--Animals.iniQ畜牧场动物U类信息配置文gQ?br>      |--Seeds.iniQ花园作物种cM息配|文Ӟ<br>      |--StoreInfo.xlsQ商店所有商品的明细Q包括收益比Q?br>  |--AccountQ添加̎号后自动生成Q?br>  |--Config.iniQ修改程序配|后自动生成Q?br>HelpQ欢q页Q?br>SohuSunFarmHelper.exeQ主E序Q?br><br><strong style="COLOR: #0000ff">从v1.0 b0730版本开始,每次升Q请使用主菜?#8220;讄”-“恢复账号及配|?#8221;命oQ来恢复您的账号和程序配|信息?br>从v1.0 b0807版本开始,您可以用主菜单“帮助”-“查更?#8221;命o来检查是否有新版本发布?/strong><br><br><span style="COLOR: red">【已知问题?/span><br>1、当金币不Ӟ昄购买、播U成功,事实上不成功。(因此L保自q腰包有够的money<img border=0 align=absMiddle src="http://www.shnenglu.com/CuteSoft_Client/CuteEditor/images/emsmilep.gif">Q?br>2、放虫、惊吓达到每日上限后的处理逻辑需要完?br><br><br><img border=0 align=absMiddle src="http://www.shnenglu.com/images/cppblog_com/epubcn/snap.png"> <img src ="http://www.shnenglu.com/epubcn/aggbug/90564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2009-07-19 23:51 <a href="http://www.shnenglu.com/epubcn/archive/2009/07/19/90564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]Vista下服务与桌面互交http://www.shnenglu.com/epubcn/archive/2009/01/06/71356.htmlp色系l?/dc:creator>p色系l?/author>Tue, 06 Jan 2009 08:59:00 GMThttp://www.shnenglu.com/epubcn/archive/2009/01/06/71356.htmlhttp://www.shnenglu.com/epubcn/comments/71356.htmlhttp://www.shnenglu.com/epubcn/archive/2009/01/06/71356.html#Feedback0http://www.shnenglu.com/epubcn/comments/commentRss/71356.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/71356.html

     本来在Vista之前服务与桌面互交是一件很Ҏ的事?自从Vista把服务都挪到Session 0 中运行去而且不可以跨Session之后,问题复杂了许多,有时候我在惌些问题是否真的不得不解决而且g对于安全q未带来多大提升的更ҎL让h 头疼,Google了一些文?抄袭了不代码我是如下实现的

 q个函数抄自winehq|站,Z不得不说一下winehq的代码是很值得参考的

 1 BOOL WINAPI EnablePrivilege(LPSTR lpPrivilegeName, BOOL bEnable)
 2 {
 3     TOKEN_PRIVILEGES Privileges;
 4     HANDLE hToken;
 5     BOOL bResult;
 6     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
 7      return FALSE;
 8 
 9     Privileges.PrivilegeCount = 1;
10     Privileges.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
11 
12     if (!LookupPrivilegeValue(NULL, lpPrivilegeName,
13                             &Privileges.Privileges[0].Luid))
14     {
15      CloseHandle(hToken);
16      return FALSE;
17     }
18 
19     bResult = AdjustTokenPrivileges(hToken, FALSE, &Privileges, 0, NULL, NULL);
20 
21     CloseHandle(hToken);
22 
23     return bResult;
24 }

 

EnablePrivilege用来提升本进E权?因ؓ我们的核心思\是用CreateProcessAsUser创徏q程到需要互交的Session,

 

    //保证拥有权限
EnablePrivilege(SE_TCB_NAME, TRUE); 
    EnablePrivilege(SE_CHANGE_NOTIFY_NAME, TRUE);
    EnablePrivilege(SE_INCREASE_QUOTA_NAME, TRUE);
    EnablePrivilege(SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);

//获取当前q程的灵?/span>
        HANDLE hTokenThis = NULL;
        HANDLE hTokenDup 
= NULL;
        HANDLE hThisProcess 
= GetCurrentProcess();
        OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, 
&hTokenThis);
//复制令牌
        DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
//枚D所有Session,本来q有一个WTSGetActiveConsoleSessionId,不过q个函数在win2000下只有Server版本安装WTS才可?/span>
        PWTS_SESSION_INFO pSInfo;
        DWORD pCInfo 
= 0;
        WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,
0,1,&pSInfo,&pCInfo);
        DWORD dwSessionId 
= 0;
        
for (int i=0;i<pCInfo;i++)
        {
            
if (pSInfo[i].State == WTSActive)
            {
                dwSessionId 
= pSInfo[i].SessionId;
                
break;
            }
        }
        
//DWORD dwSessionId = WTSGetActiveConsoleSessionId();
//替换令牌,关键地方,我们q不需要以Session用户创徏q程,只需要替换o牌就可以?/span>
        SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));

        STARTUPINFO si 
= {0};
        PROCESS_INFORMATION pi 
= {0};
        si.cb 
= sizeof(si);
        si.lpDesktop 
= "WinSta0\\Default";
        DWORD dwCreationFlag 
= NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
        
char    pPath[MAX_PATH*2];
        GetModuleFileName(NULL,pPath,
sizeof(pPath));
        strcat(pPath,
" -work");
        LPVOID pEnv;
        CreateEnvironmentBlock(
&pEnv,hTokenDup,FALSE);
        
if (!CreateProcessAsUser(hTokenDup,NULL,pPath,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))
        {
// 
//             int p = GetLastError();
//             p = 0;
        }
        WaitForSingleObject(pi.hProcess,INFINITE);
        CloseHandle(hTokenDup);
        CloseHandle(hTokenThis);

q样我们的程序就可以和桌面互交了,q只是核?其余牉|多用户切换这些还需要另外考虑



]]>
【原创】我的Firefox插g开发之旅(8Q?amp;mdash;&mdash;插g的安装与更新http://www.shnenglu.com/epubcn/archive/2008/11/14/66912.htmlp色系l?/dc:creator>p色系l?/author>Fri, 14 Nov 2008 05:57:00 GMThttp://www.shnenglu.com/epubcn/archive/2008/11/14/66912.htmlhttp://www.shnenglu.com/epubcn/comments/66912.htmlhttp://www.shnenglu.com/epubcn/archive/2008/11/14/66912.html#Feedback4http://www.shnenglu.com/epubcn/comments/commentRss/66912.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/66912.htmlQ原创作品,转蝲h明出处。)

插g写好了,下面p做一个安装包了。最好再提供更新功能Q以便在插g有更新的时候,及时通知用户q行插g更新?/p>

我们开发的时候,直接生成的dll丢到Firefox安装目录下的plugins目录可以工作了Q但是你如何说服让用h手动完成qg事情Q估计很难。因此,提供一个安装包Q可能是最好的选择。用户只需要点几下鼠标可以完成插件的安装了?/p>

不过到写q篇文章的时候,我还不清楚怎么让安装包l过Mozilla的验证,因ؓ没有l过验证的插Ӟ在安装的时候会出现“仅安装信M者的附加lg”提示对话框,提示用户仅安装受信Q作者的插g。如果有人知道怎么Lq个警告对话框,q望不吝赐教?/p>

最最单的插g安装包在q篇文章中开头处写的很清楚了Q?a title="https://developer.mozilla.org/en/Shipping_a_plugin_as_an_extension" >https://developer.mozilla.org/en/Shipping_a_plugin_as_an_extension

安装包的目录l构Q?/p>

install.rdf
plugins/
    pluginlib.dll
    plugintypes.xpt

其中xpt文g可选。install.rdf的内容ؓQ?

<RDF xmlns=" xmlns:em=">
  <Description about="urn:mozilla:install-manifest">
    <em:id>mypluginid@myplugin.com</em:id>
    <em:name>My Plugin</em:name>
    <em:version>1.0</em:version>
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>1.5</em:minVersion>
        <em:maxVersion>3.0.*</em:maxVersion>
      </Description>
    </em:targetApplication>
  </Description>
</RDF>

上面内容安装目录结构用zip格式压羃Q将后缀名改为xpiOK了?/p>

但是我们要做得事情远不止q些Q?/p>

  • 如何提供插g的更新自动通知Q?
  • 如何扩展和插g捆绑在一赯用户安装Q(因ؓ可能你不仅仅要安装插Ӟq希望在用户的FF工具栏或菜单上添加一些扩展功能)
  • 如何Ҏ件进行签名?
  • 如何发布你的插g和扩展,以便让更多h知晓Q?/li>

要做的事情还很多。那么我们就一个个来研I吧?/p>

一、如何提供插件的更新自动通知Q?/strong>

关于Install manifestQ即install.rdfQ文件内容,Mozilla有篇很详l的文章Q?a title="https://developer.mozilla.org/en/Install.rdf" >https://developer.mozilla.org/en/Install.rdfQ可以进行参考?/p>

其中有个节点名称是:updateURL。用q个标签包含一个可查询更新信息的URLq接Q今后当FF在查询插件是否有更新Ӟ会到你指定的q个URL上去查询?/p>

q个URL可以是一个cgiE序、servlet、asp(x)Q也可以是一个固定的rdf文g链接。另外文章中也提C另外一U办法:如果你没有提供updateURLQFF的附加组件管理器会向addons.mozilla.org发送请求,当你上传了一个新版本的插件或者通过作者接口(author interfaceQ更改了兼容性参敎ͼ一个更新的manifest文g会被自动生。另外,MozillaupdateURL使用https而非httpQ否则你应该提供updateKeyQ可以用McCoy生成Q?/p>

那么Q负责更新的rdf怎么~写呢?你可以参考这文章:https://developer.mozilla.org/en/Extension_Versioning%2c_Update_and_Compatibility#Update_RDF_Format。由于文章中写的很清晎ͼq且提供了详l的例子代码Q这里我׃废话了?/p>

二、如何将扩展和插件捆l在一赯用户安装Q?/strong>

q个很简单。之前的章节我们已经做过一个简单的Extension安装包,如果想附加一个插件的话,只需要和chrome的同U目录下新徏一个plugins目录Q然后将dll及相x件放在里面,最后一h包即可?/p>

当在FF中安装此xpiӞFF会将Extension和Plugin解压到FF的Profiles目录下。插件和扩展卛_生效?/p>

注意q里与我们之前将插gdll攑֜FF安装目录下的plugins目录下有些不同(臛_位置不同Q,FF同样能够正确地识别我们的插g。另外Mozilla也推荐做成安装包Q这P在用户卸载组件的时候,可以同时Extension和Plugin都卸载掉?/p>

三、如何对插gq行{֐Q?/strong> 

很抱歉,q没扑ֈ{案……

四?如何发布你的插g和扩展,以便让更多h知晓Q?/strong>

首先需要在Mozilla|站上注册一个̎P需要提供合法E-mailQ因Ȁz)?/p>

d后,在Mozilla 附加lg首页上你会看C?#8220;开发者工?#8221;的链接。进入后Q会有明昄D链接Q如“提交附加lg”。通过q个面Q按照向|你就可以你的插件发布出来了。剩下的事,是宣传咯,呵呵?/p>

OKQ《我的Firefox插g开发之旅》系列文章就先到q里。将来我也许q会写一些关于编写FF的Extension和Plugin斚w的技术细节文章。看心情吧,呵呵?/p>

]]>
【原创】我的Firefox插g开发之旅(7Q?amp;mdash;&mdash;为插件添加和脚本交互的能?/title><link>http://www.shnenglu.com/epubcn/archive/2008/11/14/66888.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Fri, 14 Nov 2008 02:56:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2008/11/14/66888.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/66888.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2008/11/14/66888.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/66888.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/66888.html</trackback:ping><description><![CDATA[ <p>先说一句题外话Q上一节一开始我提到了由?rcD我自己写的插件不能被FF识别的问题,今天l于扑ֈ{案了。在q篇文章中:<a title="https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Development_Overview" >https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Development_Overview</a>Q有q么一D话QIn your development environment, make sure your language is set to "US English" and the character set to "Windows Multilingual." The resource code for this language and character set combination is 040904E4. 看来qFFq只能用英文?/p> <p>OKQ步入正题。这一节我来单说一下如何ؓ插gd和脚本语aQ如JavascriptQ交互的能力。我会ؓ插gd几个函数Q供Javascript调用?/p> <p>前面我们提到q浏览器调用插g的方法的序Q基本上为:NP_GetEntryPoints、NP_Initialize、NPP_New、NPP_SetWindow、NPP_GetValue。在NPP_New中,我们需要创建插件对象的实例QNPP_SetWindow中,览器会传入插gH口的信息,最后一个NPP_GetValueQ是览器来获取一些插件信息的。NPP_GetValue函数的结构是q样的:</p> <p><strong>NPError  NPP_GetValue(NPP instance, NPPVariable variable, void *value);</strong></p> <ul> <li>instance包含着插g对象实例Q?/li> <li>variable表示览器要获取的信息的cd;</li> <li>value表示q回l浏览器的?/li> </ul> <p><strong>览器会传入NPPVpluginScriptableNPObjectQ作为variable参数Q来查询插g是否支持Scriptable功能Q即和脚本语a交互的功能)Q在q里Q我们可以利用NPN_CreateObjectҎ来创Z个NPObject对象Qƈ且作为valueq回l浏览器。这P览器就通过q个NPObject对象和我们的插g建立了连接。当面上Javascript调用了我们插件对象的某个ҎӞ览器会调用该NPObject对象的HasMethodҎ来查询是否支持这个方法,如果支持Q则会调用NPObject对象的InvokeҎQ传入方法名、参数等信息。这P我们可以让|页上的脚本语言来执行我们编写的函数了。在Windows上,我们~写的函数就如同~写普通的应用E序一P可以使用很多Windows API来完成许多复杂的工作?/strong></p> <p>上面有个问题Q如何创建我们自qNPObject对象QNPN_CreateObjectҎ如何使用Q好在Mozillal我们提供了npruntimeq个例子E序Q可以让我们得以参考?/p> <p>先来看看NPN_CreateObjectҎ的定义:</p> <p>NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);</p> <p>关键在第二个参数上,我们需要提供一个NPClass指针。npruntime例子E序中是q么做的Q?/p> <p>定义了一个宏DECLARE_NPOBJECT_CLASS_WITH_BASEQ其作用是定义了一个静态的NPClass对象Qƈ且NPClass要求的所有基ҎQ都׃个ScriptablePluginObjectBasecL提供。我们根据需要,来创Z同的l承于ScriptablePluginObjectBase的类Q比如支持方法的cd支持属性的c)Q传lDECLARE_NPOBJECT_CLASS_WITH_BASE宏,q样Q当览器管我们“?#8221;的时候,我们可以按照它的需?#8220;l?#8221;它对应的对象?/p> <p>npruntime例子中,ScriptablePluginObject是用来处理方法的Q而ConstructablePluginObject是用来处理属性的?/p> <p> </p> <p><strong>如何定义一个方法(或属性)Q?/strong></p> <p>1、添加一个方法(或属性)很简单,先定义一个静态NPIdentifiercd的变量,例如Q?/p> <p>static NPIdentifier s_idSetArgs;</p> <p>2、在插g对象构造函CQ用NPN_GetStringIdentifierҎ来设|该Ҏ的名Uͼ例如Q?/p> <p>s_idSetArgs = NPN_GetStringIdentifier("SetArgs");</p> <p>其中QSetArgs是我们提供l脚本语a调用的方法名U?/p> <p>3、在ScriptablePluginObject的HasMethodҎ中,判断传入的方法名Q?/p> <p>bool ScriptablePluginObject::HasMethod(NPIdentifier name)<br>{<br>    if(name == s_idSetArgs)<br>    {<br>        printf("method name = SetArgs\n");<br>        return true;<br>    } </p> <p>    return false;<br>} </p> <p>4、在ScriptablePluginObject的InvokeҎ中,判断如果传入的方法名U等于我们定义的Ҏ名,则做你想要做得事情: </p> <p>//////////////////////////////////////////////////////////////////////////<br>///<br>/// @brief    如果某个Ҏ支持Q用HasMethod)Q当面上Javascript代码调用该方法时Q会执行本函?br>///<br>/// @param [in] name    Ҏ?br>/// @param [in] args    参数|数组Q?br>/// @param [in] argCount    参数个数<br>/// @param [in] result    执行后返回给调用者的l果<br>///<br>/// @return PR_TRUE表示执行成功QPR_FALSE表示p|<br>///<br>////////////////////////////////////////////////////////////////////////// </p> <p>bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) </p> <p>{<br>    if(name == s_idSetArgs)</p> <p>    {</p> <p>        q里做你惌做得事情</p> <p>        return PR_TRUE;</p> <p>    }</p> <p>    return PR_FALSE;</p> <p>}</p> <p>关于Ҏ参数的接Ӟq里举个例子。比如网上q么调用Q?/p> <p>embedobj.SetArgs("name", "value");</p> <p>在我们的Ҏ中,可以这么接Ӟ</p> <p>if(args != NULL && argCount >= 2)<br>{<br>    NPVariant npvName = args[0]; //W一个参?br>    NPVariant npvValue = args[1]; //W二个参?br>    if(NPVARIANT_IS_STRING(npvName) && NPVARIANT_IS_STRING(npvValue))  //如果两者都是字W串cdQ当然你q可以判断是否是其他cdQ?br>    {<br>        NPString npsName = NPVARIANT_TO_STRING(npvName); //转成NPString<br>        NPString npsValue = NPVARIANT_TO_STRING(npvValue); </p> <p>        if(npsName.utf8characters && strlen(npsName.utf8characters) > 0) //限定条gQ可以根据需要进行修攏V这里限定第一个参数内容不能ؓI?br>        {<br>            int nLenName = strlen(npsName.utf8characters) + 1;<br>            int nLenValue = strlen(npsValue.utf8characters) + 1; </p> <p>            PARAMPAIR paramPair;<br>            paramPair.pName = new char[nLenName];<br>            memset(paramPair.pName, 0, nLenName);<br>            paramPair.pValue = new char[nLenValue];<br>            memset(paramPair.pValue, 0, nLenValue); </p> <p>            strcpy(paramPair.pName, npsName.utf8characters); //参数内存存储到我们熟悉的C<br>            strcpy(paramPair.pValue, npsValue.utf8characters); </p> <p>            m_vecParamPair.push_back(paramPair);<br>        }<br>    }<br>} </p> <p>上面的代码中QPARAMPAIR是一个简单的l构体: </p> <p>typedef struct tagPARAMPAIR<br>{<br>    LPTSTR pName;<br>    LPTSTR pValue;<br>}PARAMPAIR, *PPARAMPAIR; </p> <p>m_vecParamPair是一个vectorQvector<PARAMPAIR> m_vecParamPair;</p> <p>Z说一句,上面只是代码片段Q关于内存释放、vector清空{操作,׃不是q里要说的关键部分,所以没有列出?/p> <p>OKQ现在我们的插g已经可以利和网进行交互工作了?/p><img src ="http://www.shnenglu.com/epubcn/aggbug/66888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2008-11-14 10:56 <a href="http://www.shnenglu.com/epubcn/archive/2008/11/14/66888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】我的Firefox插g开发之旅(6Q?amp;mdash;&mdash;FF插g的一些基知识http://www.shnenglu.com/epubcn/archive/2008/11/12/66719.htmlp色系l?/dc:creator>p色系l?/author>Wed, 12 Nov 2008 06:40:00 GMThttp://www.shnenglu.com/epubcn/archive/2008/11/12/66719.htmlhttp://www.shnenglu.com/epubcn/comments/66719.htmlhttp://www.shnenglu.com/epubcn/archive/2008/11/12/66719.html#Feedback13http://www.shnenglu.com/epubcn/comments/commentRss/66719.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/66719.html上篇文章学习了npruntime的例子程序,接下来迫不及待地惛_现自q一个插件了。我军_使用VS 2005来做?/p>

新徏了一个名为npgnet的工E,按照npruntime例子Q新Znp_entry.cpp、npn_gate.cpp、npp_gate.cpp、npgnet.def四个文gQ然后新Z一个类CGnetFFPluginQƈ且把例子中的关键代码d了进来(我删除了一些cplugincM的函数实体代码,因ؓ我实现的功能和例子中的无养I。编译后Q将生成的npgnet.dll攑ֈFF的plugins目录下,然后在地址栏键入about:pluginsQ我靠,竟然没有我的插gQ怎么回事Q三个导出函数我都按照标准写了啊Q比较了一下文Ӟ我的工程没有d.rc和resource.hQ可能是q个原因?/p>

回到VS 2005Q在资源面板d了一个VERSION资源,修改ProductName{资源项以后Q和npruntime例子比较了一下,q差MIMEType。这个东东很重要Q这个给我的感觉是FF插g的n份证QFF是靠这个东东来匚w和识别你的插件的。但是我不知道VS 2005中怎么d一个VERSION的键|所以我只好用EditPlus打开npgnet.rcQ手动添加了MIMETypeQapplication/mozilla-npgnet-scriptable-plugin。OKQ现?rc和resource.h都欧了,再编译,生成的npgnet.dll攑ֈFF的plugins目录下,然后在地址栏键入about:pluginsQ我靠,竟然q是没有我的插gQ真费解啊!

头大……接下来我q行了一pd的代码比较和试Q失败了N多次Q这里就省略不说了。最后发现原因原来在q个.rc上面。我的这?rc是在VS 2005中用菜单命令添加的Q默认语a是简体中文,而npruntime例子是英文,用文件比较工h较了一下,codepage和部分代码的位置都不太一栗其实只要把npruntime的这?rc文g替换我的q个Q然后编译输出的dllQFF可以识别了Q究竟是什么原因呢Q是我的.rc~少了些什么东西?q是FF只能识别英文?rcQ先不打研I么多了,臛_我的插g的关键点不在q个上面Q后面我q有很多事情需要去做。只要能让FF认出来,那就好?/p>

既然军_要写插gQ就要先理解插g的概念,在这个页面上有很详细的介l:https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics

下面的文字是我的一些阅ȝ记和体会Q?/p>

一、插件的加蝲q程

当一个页面打开Ӟ如果该页面上有嵌入一个插Ӟ览器将会做以下事情Q?/p>

  • 通过MIMEType查是否有匚w插g
  • 加蝲插g代码到内?/li>
  • 初始化插?/li>
  • 创徏一个新的插件实?/li>

插g可以在一个页面上被实例多个对象,也可以在同一时刻在不同的H口中被实例化。当面被关闭时Q插件的实例׃被销毁。当最后一个实例被删除后,插g代码׃从内存中被卸载掉?/p>

下面是插件内的函数调用过E:

  • 如果插g是首ơ被载入内存Q浏览器会调用插件的NP_InitializeҎ。ؓ了方便v见,所有的插g定义函数?#8220;NPP”开_所有的览器定义函C“NPN”开头?/li>
  • 当浏览器创徏插g实例Ӟ会调?strong>NPP_NewҎ?/li>
  • 当插件实例被删除Ӟ如关闭页面、关闭窗口)Q会调用NPP_DestroyҎ?/li>
  • 当最后一个实例被删除Q插件从内存中卸载时Q会调用NP_ShutdownҎ?/li>

二、插件检?/strong>

可以使用Javascript来检一个插件是不是已经安装了,下面是测试代码:
function DetectFFPlugin()
{
    var mimetype = navigator.mimeTypes["application/mozilla-npgnet-scriptable-plugin"];
    if(mimetype)
    {
        var plugin = mimetype.enabledPlugin;
        if(plugin)
        {
            document.writeln("Plugin had been installed and be enabled.");
        }
    }
    else
    {
        document.writeln("Sorry, Plugin has NOT been installed.");
    }
}

嗯,看到q里Q觉得这个检很有用。当用户尚未安装时Q可以指导用户到哪哪哪去下蝲安装Q{向一个漂亮点儿的面Q,当检已l安装了Q就动态加载插件代码。不错。:Q?/p>

三、插件结构概q?/strong>

一个插件中的方法分为插件方法(Plug-in MethodsQ和览器方法(Browser MethodsQ。插件方法是你在插g中自己去执行的那些方法,以NPP为前~命名。浏览器Ҏ是被Gecko所执行的那些方法,以NPN为前~命名。数据结构(Data StructuresQ以NP开头?/p> 插g可分为有H口和无H口两种Q不q文章中使用有窗口的Q说q样会更E_和易于控制。另外文中提C可以插件作为页面的一部分Qƈ且可以用HTML代码来控制插件的昄与否?br>
有两U方式可以一个插件不可见Q?br>
1、如果你使用embed标签Q可以用其hidden属性,例如Q?lt;embed src="audiplay.aiff" type="audio/x-aiff" hidden="true">
2、如果你是用object标签Q由于它没有hidden属性,你可以用CSS来完成隐藏:

object
{
    visibility: visible;
}
object.hiddenObject
{
    visibility: hidden !important;
    width: 0px  !important;
    height: 0px  !important;
    margin: 0px  !important;
    padding: 0px  !important;
    border-style: none  !important;
    border-width: 0px  !important;
    max-width: 0px  !important;
    max-height: 0px  !important;
}

<object data="audiplay.aiff" type="audio/x-aiff" class="hiddenObject"></object>

接下来文中介l了objectq个标签的用。ƈ且给了一个例子来说明ActiveX和插件如何融Z体来使用?/p>

最后面的部分是对object和embed两种标签的各U属性的说明和D例?/p>

值得一提的是,对于object和embed两种标签都可以在面上嵌入一个插件。如何取舍呢Q文章中有这么一D话Q?/p>

Though the object element is the preferred way to invoke plug-ins, the embed element can be used for backward compatibility with Netscape 4.x browsers, and in cases where you specifically want to prompt the user to install a plug-in, because the default plug-in is only automatically invoked when you use the embed element.

意思是_管object是推荐用的调用插g的方式,embed也可嵌入插gQNetscape 4.x以上的浏览器Q,但如果你惛_用户没有安装插gӞ提示他进行安装,那么应该选择用embedQ因为FF的默认插件系l仅仅在你用embed标签的时候,才会自动帮助你完成这U提C用户安装的效果?/p>

我看q以后的感觉是,object使用hg比embed要复杂,L针对FFq个览器是q样Q虽然他是HTML W3C的标准。多数情况下使用embed可以了Q何늎在谁q在用Netscape 4.x以下版本的浏览器啊,您说是不是?Q)

OKQ通过q几天的学习Q终于对FF的插件编写有了一个初步的感性认识。到目前Z一切还比较利?/p>

]]>【原创】我的Firefox插g开发之旅(5Q?amp;mdash;&mdash;~译和测试第一个Plugin例子Qnpruntimehttp://www.shnenglu.com/epubcn/archive/2008/11/11/66612.htmlp色系l?/dc:creator>p色系l?/author>Tue, 11 Nov 2008 07:47:00 GMThttp://www.shnenglu.com/epubcn/archive/2008/11/11/66612.htmlhttp://www.shnenglu.com/epubcn/comments/66612.htmlhttp://www.shnenglu.com/epubcn/archive/2008/11/11/66612.html#Feedback17http://www.shnenglu.com/epubcn/comments/commentRss/66612.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/66612.html前几天一直在忙乎着研究和阅读XUL和FF的Extension相关资料Q今天突然发玎ͼ我要做得事情g不是用Extension来实现的。因为原来的应用是一个ActiveXQ网会一些参数通过ActiveX控g传递进来,而ActiveX接到q些参数以后Q会和服务器q行一些数据交互,最后调h地的执行E序。似乎我C一些弯路,方向不对。我要做得事情应该是~写一个PluginQ而非Extension?/p>

及时修正了下一步的研究计划Q那么就让我们先来编译和试Mozilla提供的一个小例子吧。原文连接在q里Q?/p>

https://developer.mozilla.org/En/Compiling_The_npruntime_Sample_Plugin_in_Visual_Studio。文章中是以VS2003举例Q我q里以VC6来进行测试,q且步骤中需要注意的地方特别说明了一下?/p>

1、先到这里下载相x码:http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/。不知道Z么Mozilla只提供了面形式Q没有打个包Q害得我得一个个文g下蝲和保存,郁闷?/p>

2、在VC6中新Z个Win32 Dynamic-Link Library工程Q取?#8220;nprt”。注意:工程以小写np开_q且长度不超q?个字W,q样以后׃省事很多?/p>

3、下一步,选择“An empty DLL project”Q然?#8220;Finish”?/p>

4、将刚才下蝲的源码添加到工程中来。test.html不用dQnprt.def也添加进来?/p>

5、现在还不能~译Q否则会出很多错误。打开Project SettingsQ{到C/C++标签,在Category中选择PreprocessorQ在Preprocessor Definitions中最后面dQ?XP_WIN32,MOZILLA_STRICT_API,XPCOM_GLUE,XP_WIN,_X86_。注Q如果你使用VS 2005Q需要添加全部的定义QWIN32;_WINDOWS;NPRT_EXPORTS;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE;XP_WIN;_X86_

6、在Additional include directories下面dXULRunner SDK的include路径Q可以是l对路径Q也可以是相对\径,看你当初怎么解压的了。例如:..\..\xulrunner-sdk\include

7、在Category中选择Precompiled HeadersQ选择Not using precompiled headersQOKQ关闭Project Settings对话框。打开npp_gate.cppQ将下面的代码注释掉Q?br>jref NPP_GetJavaClass (void)
{
  return NULL;
}

8、编译!……我靠Q有错:Fatal error C1083: Cannot open include file: 'npapi.h': No such file or directory。我可是严格按照教程上面写的d得啊?/p>

9、在xulrunner-sdk目录下搜索了一下npapi.hQ原来在xulrunner-sdk\sdk\include下面Q这好办Q多加一条包含\径不欧了?仿照W?步,d该目录;

10、编译!OKQ过了?/p>

11、到输出目录下将nprt.dll复制到FF安装目录的plugins目录下,例如QC:\Program Files\Mozilla Firefox\plugins\

12、如果此时FF开着也没关系Q不用关Q这点很不错Q。在地址栏键入about:pluginsQ看看是不是有一个npruntime scriptable example pluginQ如果有Q那pC欧了,FF认出了我们的插gQ?/p>

13、在FF中打开test.htmlQ嗯Q怎么q提C安装缺失插Ӟ用EditPlus打开test.htmlQ噢Q原来有q么一句:<embed type="application/x-java-mozilla-npruntime-scriptable-plugin" style="display: block; width: 50%; height: 100px;">。因为我们刚才没有添加名字ؓx-java-mozilla-npruntime-scriptable-plugin的插Ӟ所以当然认不出来啦?/p>

14、随便点一下页面上的按钮,看看单的交互行ؓ?/p>

 

OKQ第一个例子还顺利,比想象中的要利。下面就该研I一下代码了Q看看FF的插件和ActiveX的区别到底有多大?/p>

附一些参考资料:
http://xinsync.xju.edu.cn/index.php/archives/2124
http://mqjing.blogspot.com/2008/09/plugin-firefox-plugin.html



]]>
【原创】我的Firefox插g开发之旅(4Q?amp;mdash;&mdash;XULRunner的一个例?/title><link>http://www.shnenglu.com/epubcn/archive/2008/11/10/66502.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Mon, 10 Nov 2008 03:54:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2008/11/10/66502.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/66502.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2008/11/10/66502.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/66502.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/66502.html</trackback:ping><description><![CDATA[ <p>上一节写了一个ExtensionQ添加了一个按钮在FF3的工h上。接下来我准备在q个基础上添加一个功能,点击按钮Q读取本地磁盘上一个文件的内容Qƈ昄出来。怎么做呢Q用Javascript吗?因ؓ我最l的目标是从服务器上下蝲文gQ也可能会传输本地文件到服务器上Q用Javascript讉K本地文g有诸多限Ӟ而且也无法完成复杂的功能。所以最好是能够调用我编写的 DLL那就最好不q了。怎么做呢Q还是在Mozilla|站上找扄吧?/p> <p>在Mozilla|站上看刎ͼ可以自己~写Component来完成一些自定义操作。需要首先安装Gecko SDKQ现在叫XULRunner SDKQ,Windows上有两个版本Q?.8是for FF1.5/2.0的,1.9是for FF3.0的,׃我机器上安装的是FF3.0Q那么就先下?.9吧,与FF1.5/2.0兼容的问题以后再说?/p> <p>下蝲了XULRunner SDK 1.9Q解压到本地后,在环境变量里配置了PATH到xulrunner-sdk的bin目录Q以便可以在command prompt下直接运行xulrunner.exe。OKQ环境配|完毕,下面来个写个例子吧。Mozilla提供了一个短精悍的例子E序Q在q里Q?a title="https://developer.mozilla.org/en/Getting_started_with_XULRunner" >https://developer.mozilla.org/en/Getting_started_with_XULRunner</a></p> <p>q篇文章一步一步教我们~写一个HelloWorldE序Q写的很清楚。不q做完这个例子,我有几个疑问Q?br>1、在上一节我们写的Extension中,chrome.manifestq个文g是放在根目录的(与chrome目录同Q,Z么这里把它放在了chrome目录里面呢?能否保持和Extension相同Q我单尝试了一下,q修改了chrome.manifest里面content所指向的目录,然后q行了一下,什么都没发生,没有看到正常q行时所弹出的对话框Q看来还是解析不正确Q是不是xulrunner必须要求chrome.manifest在chrome目录下面呢?<br>2、application.ini中App节的IDQ和Extension的IDQ通常是一个GUIDQ有无关联呢Q?br>3、调用xulrunner.exe以后Q会产生两个目录Qextensions和updatesQ这两个目录是干什么用的呢Q?/p> <p>另外q里需要特别说明一点:在运行xulrunnerL行application.iniӞ千万不能丢掉.exeQ即不能?>xulrunner application.iniQ必L/>xulrunner.exe application.iniQ否则会弹出couldn't parse的错误提C,具体是什么原因我也不清楚?/p> <p>另外Q这里还有一关于xulrunner的教E,解释了一些概忉|的东西Q?a title="http://blogs.acceleration.net/ryan/archive/2005/05/06/1073.aspx" >http://blogs.acceleration.net/ryan/archive/2005/05/06/1073.aspx</a></p> <p>写完q个例子Q感觉方向好像不太对Qxulrunner好像主要q是做界面,怎么做组件呢Q怎么讉K本地盘文g、甚至系l注册表Q在Mozilla的开发者页面上又看C个东东:XPCOMQ开头的一D介l文字是q样的:</p> <p>XPCOM is a cross platform component object model, similar to Microsoft COM. It has multiple language bindings, letting the XPCOM components be used and implemented in JavaScript, Java, and Python in addition to C++. Interfaces in XPCOM are defined in a dialect of IDL called XPIDL. </p> <p>XPCOM itself provides a set of core components and classes, e.g. file and memory management, threads, basic data structures (strings, arrays, variants), etc. The majority of XPCOM components is not part of this core set and is provided by other parts of the platform (e.g. Gecko or Necko) or by an application or even by an extension. </p> <p>大概的意思是说XPCOMcM于微软的COMlg概念Q它可以定义一些接口,可以在JS、Java、Python以及C++中用。哈哈,看来q个才是我想要的东西。OKQ那接下来我来研究一下这个东东吧。下一节争取能完成我一开始提到的功能?/p><img src ="http://www.shnenglu.com/epubcn/aggbug/66502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2008-11-10 11:54 <a href="http://www.shnenglu.com/epubcn/archive/2008/11/10/66502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】我的Firefox插g开发之旅(3Q?amp;mdash;&mdash;我的W一个扩?/title><link>http://www.shnenglu.com/epubcn/archive/2008/11/08/66286.html</link><dc:creator>p色系l?/dc:creator><author>p色系l?/author><pubDate>Fri, 07 Nov 2008 16:55:00 GMT</pubDate><guid>http://www.shnenglu.com/epubcn/archive/2008/11/08/66286.html</guid><wfw:comment>http://www.shnenglu.com/epubcn/comments/66286.html</wfw:comment><comments>http://www.shnenglu.com/epubcn/archive/2008/11/08/66286.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/epubcn/comments/commentRss/66286.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/epubcn/services/trackbacks/66286.html</trackback:ping><description><![CDATA[ <p><strong>Q原创作品,转蝲h明链接)</strong></p> <p>单知道了XULQ迫不及待地想立即编写一个插Ӟ哪怕什么事情都不做也好。O(∩_∩)O</p> <p>通过q个面<a title="https://developer.mozilla.org/en/Building_an_Extension" >https://developer.mozilla.org/en/Building_an_Extension</a>Q可以找到编写一个插件必要做得一些事情,写的很清楚。最后生的目录和文件结构是q个样子Q?br>install.rdf<br>chrome.manifest<br>chrome<br>  |--content<br>      |--overlay.xul Q我准备在这里编写代码,在FF的工h上添加一个按钮)<br>  |--locale<br>      |--en-US<br>          |--sample.dtd<br>      |--zh-CN<br>          |--sample.dtd<br>      |--zh-TW<br>          |--sample.dtd<br>  |--skin<br>      |--classic<br>          |--sampleicon.png<br>          |--smallicon.png<br>          |--default.css Q界面显C的样式表,今后可能会用刎ͼ</p> <p><br>上面文g中的install.rdf、chrome.manifest基本上用例子中的好了,dtd文g里面是界面文字,q个可以模仿其他插g~写?br>overlay.xul我准备添加一D代码,用来在FF工具栏上d一个按钮。skin下面的png是准备在工具栏上d的按钮的图标?/p> <p>OKQ把上面整个目录用zip打个包,改后~名ؓxpiQ拖攑ֈFF3中,提示未验证作者、是否l安装。这个先不管它,以后再研I。安装以后,重启FF3Q哈哈,写的W一个Extension成功安装了!只不qoverlay.xul里面什么都没写Q所以还没有视觉上的成就感。下面开始添加overlay.xul中的代码?/p> <p>怎么在工h上添加按钮呢Q感谢Mozilla提供的文,专门有一文章是讲这个地Q?a title="https://developer.mozilla.org/en/Creating_toolbar_buttons" >https://developer.mozilla.org/en/Creating_toolbar_buttons</a>。文章里面讲的非常清楚,我这里就不废话了。不q有两点需要注意一下:<br>1、样式表中的ID和toolbarbutton的id一定要保持一_<br>2、按钮的label和tooltiptext可以直接d文字Q但如果使用了中文,有可能会昄qQ至在我的FF3上是q样Q;<br>3、按钮的图标一定要大小两种Q?4x24?6x16Q都提供Q?br>4、label和tooltiptext可以使用dtd中定义的文字Q但必须注意Qdtd文g必须存ؓUTF-8~码Q否则会D按钮昄不出来!</p> <p>在FF3的定制工h中,有图标,但下Ҏ有文字,好像是我哪里忘记d文字了,一会儿看看?#8230;…</p> <p>好了Q我的第一个FF插g写好了Q不q现在只是在工具栏上d了一个按钮而已Q什么事情都没做Q下一ơ我们添加一些行为给它?/p> <p>以下附上几个关键文g的内容:<br><strong></strong></p> <h5><strong>一、install.rdf</strong></h5> <p><strong><br></strong><?xml version="1.0"?><br><RDF xmlns="<a </a> xmlns:em="<a </a>><br>    <Description about="urn:mozilla:install-manifest"><br>        <em:id>{859606AC-AFFE-4691-82C5-FA0148A7E2D4}</em:id><br>        <em:version>1.0</em:version><br>        <em:type>2</em:type><br>        <em:name>MeetMePlus</em:name><br>        <em:description>Anywhere, anytime to starting a conferencing</em:description><br>        <em:creator>G-NET</em:creator><br>        <em:iconURL>chrome://meetmeplus/skin/gnet_32.png</em:iconURL><br>        <em:homepageURL><a >http://www.meetmeplus.com/</a></em:homepageURL><br>        <em:targetApplication><br>            <Description><br>                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id><br>                <em:minVersion>1.5</em:minVersion><br>                <em:maxVersion>3.0.*</em:maxVersion><br>            </Description><br>        </em:targetApplication><br>    </Description>      <br></RDF></p> <h5><strong>二、chrome.manifest</strong></h5> <p>overlay    chrome://browser/content/browser.xul    chrome://meetmeplus/content/overlay.xul<br>content    meetmeplus    chrome/content/<br>style    chrome://global/content/customizeToolbar.xul    chrome://meetmeplus/skin/default.css<br>skin    meetmeplus    classic/1.0    chrome/skin/classic/<br>locale    meetmeplus    zh-CN    chrome/locale/zh-CN/ </p> <h5><strong>三、overlay.xul</strong></h5> <p><?xml version="1.0"?><br><!DOCTYPE overlay SYSTEM "chrome://meetmeplus/locale/overlay.dtd"><br><?xml-stylesheet href="chrome://meetmeplus/skin/default.css" type="text/css"?> </p> <p><overlay id="mmp-overlay" xmlns="<a </a>><br>    <!-- Firefox toolbar --><br>    <toolbarpalette id="BrowserToolbarPalette"><br>        <toolbarbutton id="meetmeplus-button" type="menu-button" <br>            class="toolbarbutton-1 chromeclass-toolbar-additional"><br>            <menupopup><br>                <menuitem label="&mmp.gotohome;" tooltiptext="&mmp.gotohome.tooltip;" image="chrome://meetmeplus/skin/option_16.png" class="menuitem-iconic"/><br>                <menuseparator/><br>                <menuitem label="&mmp.option;" tooltiptext="&mmp.option.tooltip;" image="chrome://meetmeplus/skin/option_16.png" class="menuitem-iconic"/><br>            </menupopup><br>        </toolbarbutton><br>    </toolbarpalette><br></overlay> </p> <h5><strong>四、overlay.dtd</strong></h5> <p><!ENTITY mmp.gotohome "讉KG-NET MeetMePlus"><br><!ENTITY mmp.gotohome.tooltip "讉KG-NET MeetMePlus|站"><br><!ENTITY mmp.option "选项"><br><!ENTITY mmp.option.tooltip "自定义G-NET MeetMePlus的工作方?></p><img src ="http://www.shnenglu.com/epubcn/aggbug/66286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/epubcn/" target="_blank">p色系l?/a> 2008-11-08 00:55 <a href="http://www.shnenglu.com/epubcn/archive/2008/11/08/66286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】我的Firefox插g开发之旅(2Q?amp;mdash;&mdash;XUL是什么?http://www.shnenglu.com/epubcn/archive/2008/11/07/66210.htmlp色系l?/dc:creator>p色系l?/author>Fri, 07 Nov 2008 05:50:00 GMThttp://www.shnenglu.com/epubcn/archive/2008/11/07/66210.htmlhttp://www.shnenglu.com/epubcn/comments/66210.htmlhttp://www.shnenglu.com/epubcn/archive/2008/11/07/66210.html#Feedback0http://www.shnenglu.com/epubcn/comments/commentRss/66210.htmlhttp://www.shnenglu.com/epubcn/services/trackbacks/66210.htmlWhat is XULQ这个页面给Z详细的介l:http://www.xulplanet.com/tutorials/whyxul.html?/p>

看完后,了解了XUL原来是一个支持多UWEB技术的、基于XML的界面开发语a。它既可以在q程执行Q也可以安装到本地执行?/p>

在XUL中内|了很多界面元素Q如菜单、按钮、分늭{,q样׃需要自q写很多JS来维护和控制很多界面元素了。而且Q这些界面是按照当时的OS外观来展现的Q比如同一个按钮,在MacOS上和Windows上看h׃一栗另外XUL也允许自׃用JS和CSS来定制自q个性化界面。M一句话QXUL的主要作用就是用来展现Extension的用户交互界面的?/p>

OKQ知道了XUL是什么以后,那么怎么学习它的用法呢?文章最下方适时地给Z一个连接:begin the XUL tutorialQ还Zh性化:) 我点~~~

教程很多Q很强大。看来一时半会儿全搞清楚是不可能的了。慢慢来吧?/p>

哦对了,q发C个在U的XUL~辑器,把XUL代码_进去,下面可以实时地显C界面。不q不能引用外部脚本,否则出错。链接是Q?a title="http://ted.mielczarek.org/code/mozilla/xuledit/xuledit.xul" >http://ted.mielczarek.org/code/mozilla/xuledit/xuledit.xul?/p>

 

先写q些Q准备开始阅读XUL教程?#8230;…



]]>
RE99þþƷ66| ھƷþ| ھƷ˾þþþӰԺ԰| þۺϳDž| ݺۺϾþۺ88| 91Ʒþþþþio| 99Ʒþ| պƷþþþþþõӰ| þúݺɫݺɫۺ| þþƷ2020| 99ȶǾƷþþþþ| AVպƷþþþþþ| Ʒѿþþ㽶| AþþƷ| ëƬþþþþùëƬ| ޾ƷҹVAþó| 99þۺϺݺۺϾþ| þѾƷav| þþܳ| 99þۺϹƷ| þùƷ77777| 97Ʒ˾þô߽| þerƷѹۿ8| þþƷҹƬ| ĻӰӾþþ| ƷþþĻ| ˾þþƷһ| 99þþƷһ| þԭav| wwwɫ˾þþƷ| ŷ츾BBBþþ| ˾þۺϳ| Ժձһձþ | þþþӰԺС | ƷþþþþĻ| þAV| ǾþþƷ| þһ| ˳ŷþ| þAVij| 97þù¶Ʒ|