error C2039: lstrlenW不是ATL的成员解决方法

<p>

问题解决方法&nbsp;

</p>
<p>

&nbsp;以下为解决的步骤:

</p>
<p>

&nbsp;1.         从微软网站上下载VisualStudioDeviceWindowsEmbeddedCompact7.msi补丁包,安装该补丁包。&nbsp;

</p>
<p>

下载地址为:

http://www.microsoft.com/en-us/download/details.aspx?id=27729 
</p>
<p>

&nbsp;这个补丁包微软解决了VS2008中的很多问题,

</p>
<p>

具体可参看如下链接:

http://support.microsoft.com/kb/2468183
</p>
<p>

<br />

</p>
<p>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>

  1. 在2节新建的工程上单击右键,选择“属性”菜单,弹出如下菜单:
    </p>

<p>

<img src="/wp-content/uploads/2014/10/20141007083104_64126.jpg" alt="" /> 

</p>
<p>

<br />

点击你当前项目的属性-》C/C++-》常规-》 附加包含目录:
</p>
<p>

<span style="line-height:1.5;">&nbsp;</span> ce7的安装目录下的include和altmfc\include;该路径因CE安装路径的不同而不同。单击“确定”,关闭该对话框,重新编译工程,1节描述的错误不再出现。

</p>
<p>

<br />

</p>
<p>

<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">头文件会更新在以下位置:</span><br />



<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">对于 32 位操作系统:</span>
</p>
<div class="indent" style="margin:0px;padding:0px 20px 10px;color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;background-color:#FFFFFF;">

&nbsp;<b><i>&lt;system drive=""&gt;:&lt;/system&gt;</i>\Program Files\Microsoft Visual Studio 9.0\VC\ce7</b> 

</div>
<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">对于 64 位操作系统:</span>

<div class="indent" style="margin:0px;padding:0px 20px 10px;color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;background-color:#FFFFFF;">

<b>&lt;system drive=""&gt;:&lt;/system&gt;\Program 文件 (x86) \Microsoft Visual Studio 9.0\VC\ce7</b> 

</div>
<p>

<br />

</p>
<p>

<br />

</p>























Read >>


.NET 窗口句柄操作

<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。</span><br />



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">1、如何获得一个窗口的句柄?</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">例如获取窗口PictureBox控件(其他控件也可以)的句柄,</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">IntPtr handle = pictureBox.Handle;</span>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">2、注意:窗口创建和窗口创建完毕即有句柄完全是两回事!!!</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">窗口创建时,窗口并没有创建句柄,只有Application.Run(form)或者form.Show()之后才有句柄,即窗口只有显示或者启动消息循环后才有句柄!如果创建form之后Form. form. = new Form(),主线程中调用form.Handle,如果句柄尚未创建,引用该属性将强制创建句柄,对系统内的逻辑将产生致命的影响。</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">3、如何判断一个窗口的句柄创建完毕?</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">利用IsHandleCreated 属性:此属性指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;否则为 false。</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">4、一些属性:</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(1)、CreateControl :强制创建控件,包括句柄和任何子控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(2)、CreateHandle :为该控件创建句柄,</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">通常,不应该直接调用 CreateHandle 方法。首选的方法是调用CreateControl方法,此方法在创建控件时强制为该控件及其子控件创建一个句柄。给继承者的说明 在派生类中重写 CreateHandle 时,请确保调用了基类的 CreateHandle 方法,以便确保已创建该句柄。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(3)、DestroyHandle :毁坏与该控件关联的句柄</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(4)、FromChildHandle :检索包含指定句柄的控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(5)、FromHandle :返回当前与指定句柄关联的控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(6)、Handle :获取控件绑定到的窗口句柄,Handle 属性的值是 Windows HWND。如果句柄尚未创建,引用该属性将强制创建句柄。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(7)、IsHandleCreated :指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;否则为 false。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(8)、RecreateHandle :强制为控件重新创制句柄</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(9)、RecreatingHandle :指示当前是否在重创句柄</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">5.注意:</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">句柄是随机量,两次运行一般都会得到两次不同的结果</span>

</span>
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><br />

</span>
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>1. c#里FindWindow的用法</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

FindWindow()函数的用法。要在C#里使用该API,写出FindWindow()函数的声明:<br />

            [DllImport("coredll.dll", EntryPoint = "FindWindow")]

            private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。 看例子
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr ParenthWnd = new IntPtr(0);

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParenthWnd = FindWindow(null,"Word Mobile");<br />

            //判断这个窗体是否有效

            if (ParenthWnd != IntPtr.Zero)

            {

                MessageBox.Show("找到窗口");

            }
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show("没有找到窗口");<br />

   
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面的讨论中可以看出,如果要搜索的外部程序的窗口标题比较容易得到,问题是比较简单的。可如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢?如果你安装了Visual C++,你可以使用其中的Spy,在Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类。<br />

    在Win32 API中还有一个FindWindowEx,它非常适合寻找子窗口。
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

本文摘自:&nbsp;<a href="http://blog.csdn.net/enginetanmary/archive/2007/04/20/1572319.aspx">http://blog.csdn.net/enginetanmary/archive/2007/04/20/1572319.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>2. FindWindowEx用法</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;函数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;参数:

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;hwndParent:要查找子窗口的父窗口句柄。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

C#中使用该函数首先导入命名空间:<br />

view plaincopy to clipboardprint?

using System.Runtime.InteropServices; 

using System.Runtime.InteropServices;
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

然后写API引用部分的代码,放入 class 内部

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;view plaincopy to clipboardprint?<br />

[DllImport("user32.dll", EntryPoint = "FindWindow")]  

private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow ) 

[DllImport("user32.dll", EntryPoint = "FindWindow")]

private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow )
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

例如:

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

view plaincopy to clipboardprint?<br />

const int BM_CLICK = 0xF5;  

IntPtr maindHwnd = FindWindow(null, "QQ用户登录"); //获得QQ登陆框的句柄  

if (maindHwnd != IntPtr.Zero)  

{  

    IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登录");   //获得按钮的句柄  

    if (childHwnd != IntPtr.Zero)  

    {  

        SendMessage(childHwnd, BM_CLICK, 0, 0);     //发送点击按钮的消息  

    }  

    else 

    {  

        MessageBox.Show("没有找到子窗口");  

    }  

}  

else 

{  

    MessageBox.Show("没有找到窗口");  

}  
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

本文摘自:<a href="http://blog.csdn.net/coolszy/archive/2010/04/24/5523784.aspx">http://blog.csdn.net/coolszy/archive/2010/04/24/5523784.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

以及&nbsp;<a href="http://topic.csdn.net/u/20100105/22/6369868a-93b4-4ae5-b522-93536fa3fc23.html">http://topic.csdn.net/u/20100105/22/6369868a-93b4-4ae5-b522-93536fa3fc23.html</a>&nbsp;中的经典<span>回答</span>。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>3. c#通过SendMessage发送消息</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

请查看:&nbsp;<a href="http://blog.csdn.net/spo22/archive/2009/11/16/4816811.aspx">http://blog.csdn.net/spo22/archive/2009/11/16/4816811.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>4. 全部的Windows消息</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span>请查看:&nbsp;&nbsp;</span>&nbsp;<a href="http://topic.csdn.net/t/20050713/18/4142641.html">http://topic.csdn.net/t/20050713/18/4142641.html</a><br />



</span>
</p>
<h2 style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span style="color:#526673;font-family:微软雅黑, 黑体;font-size:18.18181800842285px;line-height:20px;background-color:#E2E2E2;">C#&nbsp;获得窗口控件句柄</span></span> 

</h2>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span> </span> 

</p>

[DllImport("User32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

    [DllImport("user32.dll", EntryPoint = "FindWindowEx",SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd,int Msg, IntPtr wParam, string lParam);

    const int WM_GETTEXT = 0x000D;
    const int WM_SETTEXT = 0x000C;
    const int WM_CLICK = 0x00F5;

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        int retval = 0; //增加一个返回值用来判断操作是否成功
        //string lpszParentClass = "#32770"; //整个窗口的类名
        string lpszParentWindow = "Form1"; //窗口标题
        string lpszClass = "WindowsForms10.EDIT.app.0.b7ab7b"; //需要查找的子窗口的类名,也就是输入框
        //string lpszClass = "Edit";
        string lpszClass_Submit = "WindowsForms10.BUTTON.app.0.b7ab7b"; //需要查找的Button的类名
        //string lpszClass_Submit = "Button";
        string lpszName_Submit = "确定"; //需要查找的Button的标题
        string text = "";

        IntPtr ParenthWnd = new IntPtr(0);
        IntPtr EdithWnd = new IntPtr(0);

        //查到窗体,得到整个窗体
        ParenthWnd = FindWindow(null, lpszParentWindow);

        //判断这个窗体是否有效
        if (!ParenthWnd.Equals(IntPtr.Zero))
        {
          //得到Form1这个子窗体的文本框,并设置其内容
          EdithWnd = FindWindowEx(ParenthWnd, EdithWnd, lpszClass, "");   [color=#FF0000]这里获取到的EdithWnd始终为0;[/color]
        
          if (!EdithWnd.Equals(IntPtr.Zero))
          {
            text = "test1";
            //调用SendMessage方法设置其内容
            SendMessage(EdithWnd, WM_SETTEXT, IntPtr.Zero, text);
            retval++;
          }
        
          //得到Button这个子窗体,并触发它的Click事件
          EdithWnd = FindWindowEx(ParenthWnd,
          (IntPtr)0, lpszClass_Submit, lpszName_Submit);
          if (!EdithWnd.Equals(IntPtr.Zero))
          {
            SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
            retval++;
          }
        }
    }



<p>

<br />

</p>






































































































Read >>


短消息的Text模式以及PDU模式的区别

发送短消息常用Text和PDU(Protocol Data
Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。


Read >>


单端模拟输入 与 差分模拟输入的区别

<p>

<span style="font-size:18px;">单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1 V),信号源到模拟输入硬件的导线较短(低于15 ft),且所有的输入信号共用一个基准地线.如果信号达不到这些标准,此时应该用差分输入.对于差分输入,每一个输入信号都有自有的基准地线;由于共模噪声可以被导线所消除,从而减小了噪声误差.单端输入时, 是判断信号与 GND 的电压差. &nbsp;</span> 

</p>
<p>

<span style="font-size:18px;"><br />

</span>
</p>
<p>

<span style="font-size:18px;">差分输入时, 是判断两个信号线的电压差. &nbsp;</span> 

</p>
<p>

<span style="font-size:18px;">
<p>
    <!--more-->
</p>
<p>
    <br />
</p>



</span>
</p>
<p>

<span style="font-size:18px;">信号受干扰时, 差分的两线会同时受影响, 但电压差变化不大. (抗干扰性较佳) &nbsp;而单端输入的一线变化时, GND 不变, 所以电压差变化较大. (抗干扰性较差) &nbsp;差分信号和普通的单端信号走线相比,最明显的优势体现在以下三个方面: &nbsp;</span> 

</p>
<p>

<span style="font-size:18px;"><br />

</span>
</p>
<span style="font-size:18px;">a.抗干扰能力强,因为两根差分走线之间的耦合很好,当外界存在噪声干扰时,几乎是同时被耦合到两条线上,而接收端关心的只是两信号的差值,所以外界的共模噪声可以被完全抵消。  </span>

<span style="font-size:18px;">b.能有效抑制EMI,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。  </span>

<p>

<span style="font-size:18px;">c.时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。目前流行的LVDS(low voltage differential signaling)就是指这种小振幅差分信号技术。 &nbsp;&nbsp;</span> 

</p>
<p>

<span style="font-size:18px;"><br />

</span>
</p>
<span style="font-size:18px;">当AD的输入信号只有一路时,为了更好地抑制共模噪声,我们可以采用差分输入方式。</span>
















Read >>


phpRPC Efficient Ajax remote procedure call

<p>

<img width="360" height="360" alt="" src="http://www.phprpc.org/images/architecture.gif" /> 

</p>
<p>

<br />

PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。
</p>
<p>

<br />

</p>
<p>

<br />

目前该协议的最新版本为 3.0。该版本目前已有以下几种语言的实现: 
</p>
<p>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>



<span style="font-size:14px;">ASP:</span>提供 JScript 和 VBScript 两种语言的支持。
</p>
<p>

<strong><span style="font-size:16px;">ActionScript</span></strong>:提供 ActionScript 2.0 和 ActionScript 3.0 两个版本的支持。&nbsp;

</p>
<p>

<strong><span style="font-size:16px;">Delphi/C++Builder/Kylix</span></strong>:提供 Delphi/C++Builder 6.0-2009 和 Kylix 客户端的支持,不但可以支持 Win32 原生程序开发,而且还支持 Linux 程序开发。&nbsp;

</p>
<p>

<strong><span style="font-size:16px;">Java:支</span></strong>持 JDK 1.2 以上的所有版本,它还支持 Google Android 开发包。另外,它还有单独的 J2ME 版本,支持 CLDC-1.1 和 MIDP-1.0。

</p>
<p>

<strong><span style="font-size:16px;">JavaScript:</span></strong>提供两个版本的实现,一个使用纯 Javascript 实现,另一个需要调用一个 swf 文件,两个版本都支持跨域的远程过程调用,但是使用 swf 的版本不限制参数长度,并且有更好的安全控制机制。这两个版本已经通过完整测试的浏览器包括 IE 5+,Netscape 7+,Firefox,Mozilla,Opera,Safari,Epiphany,Camino 与 Konqueror。并且纯 JavaScript 版本还通过了 Pocket IE、Opera Mini、Opera Mobile、iPhone、Android 等手持设备浏览器的测试。

</p>
<p>

<strong><span style="font-size:16px;">.NET:</span></strong>支持 .NET 框架下所有的语言(如 C#、VB.NET、VC.NET、Delphi.NET 等),并且支持目前所有版本的 .NET Framework 和 .NET Compact Framework,当然它也支持 Mono。最新版本增加了对 SilverLight 2.0 的支持。&nbsp;

</p>
<p>

<strong><span style="font-size:16px;">PHP:</span></strong>支持 PHP4 与 PHP5,同样支持正处于开发阶段的 PHP6。&nbsp;

</p>
<p>

<strong><span style="font-size:16px;">Python:</span></strong>支持 Python 2.4、2.5、2.6,而且支持在 Google App Engine 上应用。&nbsp;

</p>
<p>

<strong><span style="font-size:16px;">Ruby:</span></strong>该版本支持 Ruby 1.8.5 及其更高版本。服务器除了支持以 cgi、fcgi、scgi、lsapi 方式运行外,还支持以独立服务器 ( mongrel、thin、ebb 或 webrick ) 方式运行。

</p>
<p>

<strong><span style="font-size:16px;">Perl:</span></strong>目前该版本尚不成熟,有待完善。

Lazarus(Free Pascal):移植自 Delphi 版本, 需要 Indy for Lazarus 支持。
其中 ASP、.NET、Java、Ruby、Python 和 PHP 版本除了提供客户端实现外,还提供了服务器端实现。
</p>
<p>

<br />

</p>
<p>

<br />

</p>
<h2>

为什么要有 PHPRPC?&nbsp;

</h2>
<p>

<br />

</p>
<p>

<br />

</p>

如果不是因为头脑发热心血来潮,那么一定是为了解决某些问题才有了 PHPRPC。 好吧,我承认是因为我受够了那些大企业所鼓吹的强大无比的 SOAP(WebService)之后才开始考虑写 PHPRPC 的。如果你也是一个需要类似于 SOAP 所鼓吹的能力,而实际上又被 SOAP 折磨的痛苦不堪却又无所适从的人的话,或许 PHPRPC 就是你的最佳选择。

<p>

<br />

</p>
<p>

<span style="font-size:16px;">简单地讲, phpPRC只做一件事情, 那就是让数据传输变得更加简单/安全/高效.</span> 

</p>
<p>

<span><span style="line-height:24px;">phpPRC与通用的Webservice SOAP构建标准是不相符合的.</span></span> 

</p>
<p>

<span><span style="line-height:24px;"><br />

</span></span>
</p>
<h2>

<span><span style="line-height:24px;">怎么用?</span></span> 

</h2>
<p>

<span><span style="line-height:24px;"><span style="color:#333333;line-height:26px;font-family:Arial;font-size:14px;background-color:#FFFFFF;">首先下载相应的语言包文件:http://phprpc.org/zh_CN/docs/ 我这里为了测试方便,下载的php版本,把压缩包解压到网站根目录。在根目录下创建两个测试文件server.php与client.php</span></span></span> 

</p>
<p>

<span><span style="line-height:24px;"> </span></span> 

</p>

<?php
include ("php/phprpc_server.php");
function HelloWorld() {
    return 'Hello World!';
}
$server = new PHPRPC_Server();
$server->add('HelloWorld');
$server->start();
?>
<?php
include ("php/phprpc_client.php");
$client = new PHPRPC_Client('http://127.0.0.1/server.php');
echo $client->HelloWorld();
?>

<h2>

<span><span style="line-height:24px;">怎么用? 之2</span></span> 

</h2>
<p>

<span><span style="line-height:24px;">服务端程序一般用的技术, 如ASP, ASP.NET, .NET, PHP, Java等, 可以用相应的支持程序包发布Server端的RPC服务.<br />

</span></span>
</p>
<p>

<span><span style="line-height:24px;">客户端, 可用javascript, ActionScript(Flex应用), ASP, PHP等.</span></span> 

</p>
<p>

<span><span style="line-height:24px;"><br />

</span></span>
</p>
<p>

<span><span style="line-height:24px;">总之, 很方便. 解决了我的ASP.NET程序迁移的问题, 再也不用操心windows主机了, 可以拥抱服务众多的Linux主机.</span></span> 

</p>
<p>

<br />

</p>
<p>

<br />

</p>
<p>

项目主页:&nbsp;<a href="http://www.phprpc.org/" target="_blank">http://www.phprpc.org/</a> 

</p>









































Read >>


VS2008调试WinCE7.0 系统找不到指定文件错误

<p>

<span style="font-size:16px;">最近使用VS2008调试WinCE7.0, 部署程序时报错 系统找不到指定文件.</span> 

</p>
<p>

<br />

</p>
<p>

<span style="font-size:16px;">分析了下原因:</span> 

</p>
<p>

<span style="font-size:16px;">1 &nbsp;打开 我的电脑 确定与WinCe设备连接正常,可以访问WinCE内存数据.</span> 

</p>
<p>

<span style="font-size:16px;">2 &nbsp;原因出在部署应用程序的时候报错.&nbsp;</span> 

</p>
<p>

<span style="font-size:16px;">3 &nbsp;将系统刷回WinCE6.0 &nbsp;没有报错.</span> 

</p>
<p>

<span style="font-size:16px;">4 &nbsp;重新将系统刷回WinCE7.0, 对比分析.</span> 

</p>
<p>

<span style="font-size:16px;">原来我使用的开发板,厂家出厂的WinCE7.0&nbsp;</span><span style="font-size:16px;">Image中已经预装好了最新版的.net cf 3.5了, 而WinCE6.0 则没有预装.</span> 

</p>
<p>

<span style="font-size:16px;">因此WinCE6.0一切正常, WinCE7.0不是.</span> 

</p>
<p>

<span style="font-size:16px;">找到原因,就很好解决了.</span> 

</p>
<p>

<br />

</p>
<p>

<img src="/wp-content/uploads/2014/09/20140924023056_71324.jpg" alt="" /> 

</p>
<p>

<br />

</p>
<p>

<span style="font-size:16px;">将 []部署.net cf最新版本的选型取消即可,</span> 

</p>
<p>

<span style="font-size:16px;">一切正常!</span> 

</p>


电流输出与电压输出型传感器的区别

<span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;"> </span><u>传感器</u><span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;">输出有很多形式,但是大多是电流输出和电压输出,有些客户在选择传感器的时候不知道应该选择电路输出还是电压输出,下面我们就来说说这两种输出的区别,下面我们以</span><u>压力传感器</u><span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;">为例进行说明。</span>
<p>

<!--more-->

</p>
<p>

<br />

</p>


<span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;">    压力传感器是应用最多的一款传感器之一,电流输出和电压输出的压力传感器都非常常见,这两种输出主要有下面几个区别,首先,早期的变送器大多为电压输出型,即将测量信号转换为0-5V电压输出,这是运放直接输出,信号功率<0.05W,通过模拟/数字转换电路转换数字信号供</span><u>单片机</u><span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;">读取、控制。其次,在信号需要远距离传输或使用环境中电网干扰较大的场合,电压输出型传感器的使用受到了极大限制,暴露了抗干扰能力较差,线路损耗破坏了精度等等等缺点,而两线制电流输出型变送器以其具有极高的抗干扰能力得到了广泛应用。最后,电压输出型变送器抗干扰能力极差,线路损耗的破坏,谈不上精度有多高,有时输出的直流电压上还叠加有交流成分,使单片机产生误判断,控制出现错误,严重时还会损坏设备,输出0-5V绝对不能远传,远传后线路压降大,精确度大打折扣。</span>

<span style="line-height:28px;font-family:Simsun;font-size:14px;background-color:#F8FCFD;">    电流输出、电压输出的传感器都是非常常见的,但是就目前发展趋势来看,电压输出正在逐渐淘汰,现在数字输出的传感器也正在被客户接收,数字输出的传感器信号容易处理,便于集成,未来更多的传感器将会选择数字输出的。</span>






Read >>


iBeacon介绍

<span style="font-size:14px;font-family:'Microsoft YaHei';">Source:Blog:http://www.36kr.com/p/206695.html</span>



<span style="font-size:14px;font-family:'Microsoft YaHei';">好吧,转载之前我个人先说明下,iBeacon技术能够实现大范围应用的功臣是BLE技术.</span>

<span style="font-size:14px;font-family:'Microsoft YaHei';">BLE...低功耗蓝牙技术.</span>

<span style="font-size:14px;font-family:'Microsoft YaHei';">不得不说BLE就是屌丝逆袭啊!</span>

<span style="font-size:14px;font-family:'Microsoft YaHei';">想当年人手一台智能机(还是Symbian和Linux(moto系的))的时候,每机都配蓝牙.</span>

<span style="font-size:14px;font-family:'Microsoft YaHei';">后来,,什么wifi啊,NFC啊,七七八八的都来了,特点各不相同.</span>

<span style="font-size:14px;font-family:'Microsoft YaHei';">BLE技术使得bluetooth在某些特定领域的应用变得容易得多.</span>



<span style="font-size:14px;font-family:'Microsoft YaHei';">我只能说 ZigBee之流的,悲催了!</span>



<span style="font-size:14px;font-family:'Microsoft YaHei';">啰嗦结束,下面是正文.</span>

<p>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>

</p>
<p>

<br />

</p>
<p style="font-size:18px;font-family:'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif;vertical-align:baseline;color:#333332;background:#FFFFFF;">

对于软硬件平台紧密结合的一个优点是,OS 的升级可以迅速推动新技术的发展,产生整个平台和生态系统级别的网络效应。苹果的<a target="_blank" href="http://www.36kr.com/search/?q=iBeacon">iBeacon</a>就是这样一个例子。以下是 Steve Cheney 对这个新特性将如何改变本地商业的 10 点看法。

</p>

  1. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> iBeacon 最早推出是在今年的苹果 WWDC 大会上。作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4.0(BTE)已经超过 2 年前(苹果从 iPhone 4S 开始)。蓝牙芯片近年来发展迅速,在性能和效率方面都有很大提高,且不断变得更小更便宜。现在,一块纽扣电池就能提供长达 2 年的使用寿命,而且是在设备不断对外发射信号的情况下。 </p>
  2. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> Beacon 可以是任何形状,放置在任何地方。从开发者的角度,Beacon 可以发送自己独特的 ID,App 的开发者就能利用这个 ID 知道设备的位置并为你提供相应服务。苹果已经将 iBeacon 整合进了 CoreLocation 框架,它的所有行为都将会苹果进行处理。 </p>
  3. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 人们喜欢把蓝牙和 NFC 做比较。事实上,蓝牙的一个优势是如今的芯片已经内置了对 OTA 固件更新的支持,意味着 Beacon 在装载之后仍可以更新。新的固件可以对 Beacon 进行省电方面的优化等。 </p>
  4. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 此外,可以利用 iBeacon 分清楚不同的距离概念,比如近(near),适中(medium)和远(far),从而使得 iBeacon + 蓝牙在目前基于位置的服务中远远好于 GPS + WiFi 的组合。另外值得注意的是,iBeacon + 蓝牙在室内导航(Indoor Navigation)方面前景光明。 </p>
  5. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 如今通过 3 个或 3 个以上 Beacon 来进行三角定位已经非常容易,使得粗略的室内定位的成本下降到 100 美元以下,未来甚至可以更低。零售商有什么理由不采用 Beacon 来吸引每个拥有 iPhone 的消费者呢?Google 一直对室内定位感兴趣,在这方面也有多年的经验。尽管 Beacon 更关注近距离和不同的场景来实现更精确的定位,两者对苹果 Google 来说有各自不同的吸引力。 </p>
  6. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 室内导航可以走得更远,而不仅仅像现在一样只感知到你的存在即可。举个例子,如果每隔 10 英尺放 15 个 Beacon 就能形成一个网状网络,那么每个 Beacon 之间就能交换 ID 信息。这无疑提高了室内导航的精度。在这个例子中,关键在于 Beacon 能够随着固件 OTA 的更新而更新。在这个细分市场上,Estimote 已经领先了一大步,Beacon 的工作能够被延长许多年。 </p>
  7. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 如果要完成这样一整套的工作,必须需要在整个平台的级别有很多努力。这也是苹果在这方面的统一是其在这个领域大幅领先的原因。iOS 可以在 WiFi 和 GPS 打开时通过 CoreLocation 框架来唤醒 app,然后 app 寻找、发现附近的 beacon,只有这时 beacon 才开始与 app 通信,使得 app 不会一直在后台运行,无谓地浪费电量(iBeacon 只有在被激活之后才能唤醒 app)。另外,苹果有一个利用最新的 M7 处理器的 CoreMotion 框架。Android 在这方面还没有为开发者提供很统一的框架。定位服务是电池杀手,只有消费者看到 iBeacon 的价值并且还不那么耗电时,开发者才会开始采用 iBeacon,所以 Android 需要为开发者提供一套统一的开发工具。 </p>
  8. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 苹果对于 iBeacon 的推进虽然背离了 NFC 市场,但仍然能够依靠其开放的平台和开发者环境建立一个新的标准(强调苹果的开放是因为我认为人们错误地认为苹果是封闭的 ,但是从本文第 7 点中可以看到,Android 系统的碎片化使得只有少部分 Android 手机能够在 1 年到 1 年半之内支持类似 Beacon 一样的系统)。而苹果不需要做任何“封闭”的事情来消除 Android 的这个问题,因为 iBeacon 这个标准的基础是几乎完全开放的技术。 </p>
  9. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 这一切似乎抛出了一个重要的问题:苹果有针对本地商户的战略规划吗?我认为答案是肯定的。这个战略有能力改变商户对本地的理解吗?答案还是肯定的。iOS 7 和 iBeacon 在一夜之间用一个标准化的技术创造了一个生态系统网络,而且有完全开放的开发者环境。显而易见的是,苹果已经开始整理各种碎片,使得消费者通过苹果的设备进行线下的交易——如不需要任何售货员,只需轻松通过指纹识别支付的方式——而苹果只需开放其支付的 API,剩下的就水到渠成了。 </p>
  10. <p style="font-weight:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;background:transparent;"> 一个显然的事实是,未来几年零售业在移动平台的推动下将发生翻天覆地的变化。苹果和 Google 无疑是背后重要的推动力量,开发者也会青睐他们。本地商业是一个无比庞大的市场,仅在美国就是 1 万亿美元的潜在机会。我的观点是,它最终可能会变成苹果的“封闭平台”,而 Android 平台的碎片化反而可能延缓这些技术的应用。 </p>

<p>

<br />

</p>















Read >>


旧题重弹:判断点位于多边形内部算法

<p style="color:#4B4B4B;font-family:verdana, Arial, helvetica, sans-seriff;">

<strong>1. 叉乘判别法(只适用于凸多边形)<br />



想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断结果3维矢量中Z分量的符号是否发生变化,进而推导出点是否处于凸多边形内外。这里要注意的是,多边形顶点究竟是左手序还是右手序,这对具体判断方式有影响。



2. 面积判别法(只适用于凸多边形)



第四点分别与三角形的两个点组成的面积分别设为S1,S2,S3,只要S1+S2+S3>原来的三角形面积就不在三角形范围中.可以使用海伦公式 。

<p>
    <!--more-->
</p>
<p>
    <br />
</p>



3. 角度和判别法(适用于任意多边形)

<span style="color:#4B4B4B;font-family:verdana, Arial, helvetica, sans-seriff;font-size:14px;line-height:20px;background-color:#FFFFFF;">该点与没对相邻顶点的夹角之和为360,则在内,否则在外</span>
</p>
<p style="color:#4B4B4B;font-family:verdana, Arial, helvetica, sans-seriff;">

<br />

4. 水平/垂直交叉点数判别法(适用于任意多边形)


</p>
<p style="color:#4B4B4B;font-family:verdana, Arial, helvetica, sans-seriff;">

<span style="color:#333333;font-family:Simsun;font-size:medium;line-height:1.5;">以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。</span> 

</p>
<p align="left" style="color:#FFFFFF;font-family:Simsun;font-size:medium;">

<span><span> </span></span><span><span> </span><span style="color:#333333;">但是有些特殊情况要加以考虑。如图下图(a)(b)(c)(d)所示。在图(a)中,L和多边形的顶点相交,这时候交点只能计算一个;在图(b)中,L和多边形顶点的交点不应被计算;在图(c)和(d) 中,L和多边形的一条边重合,这条边应该被忽略不计。如果L和多边形的一条边重合,这条边应该被忽略不计。</span></span> 

</p>
<p align="left" style="color:#FFFFFF;font-family:Simsun;font-size:medium;">

<span><span style="color:#333333;">&nbsp;&nbsp;&nbsp;&nbsp;</span><img src="http://dev.gameres.com/Program/Abstract/Geometry_3.gif" width="300" height="600" /></span> 

</p>
<p align="left" style="color:#FFFFFF;font-family:Simsun;font-size:medium;">

<span><span> </span></span><span><span> </span><span style="color:#333333;">为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:</span><br />

</span><span><span style="color:#333333;">    count ← 0;</span>

<span style="color:#333333;">     以P为端点,作从右向左的射线L; </span>

<span style="color:#333333;">     for 多边形的每条边s</span>

<span style="color:#333333;">      do if P在边s上 </span>

<span style="color:#333333;">           then return true;</span>

<span style="color:#333333;">         if s不是水平的</span>

<span style="color:#333333;">           then if s的一个端点在L上</span>

<span style="color:#333333;">                  if 该端点是s两端点中纵坐标较大的端点</span>

<span style="color:#333333;">                    then count ← count+1</span>

<span style="color:#333333;">                else if s和L相交</span>

<span style="color:#333333;">                  then count ← count+1;</span>

<span style="color:#333333;">     if count mod 2 = 1 </span>

<span style="color:#333333;">       then return true;</span>

<span style="color:#333333;">     else return false;</span></span><span>



<span> </span><span style="color:#333333;">其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。</span></span>
</p>
<p align="left" style="color:#FFFFFF;font-family:Simsun;font-size:medium;">

<span><span> </span></span><span><span> </span><span style="color:#333333;">判断点是否在多边形中的这个算法的时间复杂度为O(n)。</span></span> 

</p>
<p>

<br />

</p>
<p style="color:#4B4B4B;font-family:verdana, Arial, helvetica, sans-seriff;">

<br />

</p>



































Read >>


C#中使用指针总结

<p style="color:#333333;font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;background-color:#FFFFFF;">

C#为了类型安全,默认并不支持指针。但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式。在不安全模式下,我们可以直接操作内存,这样就可以使用指针了。在不安全模式下,CLR并不检测unsafe代码的安全,而是直接执行代码。unsafe代码的安全需要开发人员自行检测。

Read >>