漫谈WinCE输入法的编写(一)

//========================================================================
//TITLE:
//    漫谈WinCE输入法的编写(一)
//AUTHOR:
//    norains
//DATE:
//    Saturday  10-February -2007
//Environment:
//        EVC4.0 + Standard SDK
//========================================================================
        WinCE的输入法编写,说复杂也不复杂,说简单亦不简单.说复杂嘛,是因为输入法是一个COM,需要实现某些接口,并且由于其特殊性,不能像普通应用程序一样进行调试;说简单嘛,只要把层次搞清,剩下的就和普通应用程序没什么太多的区别.
       
        我觉得如果光谈概念,以我的文字功底,让人明白内中的机理,估计不是一件非常容易的事情.所以,我还是实际点,以我写过的一个输入法来做为例子.

        因为这篇文章不是专门介绍COM接口技术的原理,我们的目的仅仅是让输入法给跑起来,因此我们只需要了解输入法用到了什么接口,以及我们应该如何定义该接口的功能即可.

        为了代码层次分明,我这个例子采用了三个类:CClassFactory,CInputMethod和CIMWnd.前面两个类分别继承于IClassFactory和IInputMethod,是能让系统正常调用输入法所必须的com接口;而CIMWnd则是输入法的窗口,和普通的应用程序无异.

        这三个类的关系是CClassFactory通过自身的CreateInstance()函数来创建一个CInputMethod类的对象,然后CInputMethod类中会调用CIMWnd类来显示一个输入法窗口.以图片的形式来说,三者的关系如下:


        现在就让我们来看看CClassFactory类的声明:
         class  CClassFactory :  public  IClassFactory 
        
{
        
public:
            CClassFactory(
long *plDllCnt,HINSTANCE hInst);
            
virtual ~CClassFactory();                
            
          
//IUnknown methods
          STDMETHODIMP QueryInterface (THIS_ REFIID riid, LPVOID *ppv);
          STDMETHODIMP_(ULONG) AddRef (THIS);
          STDMETHODIMP_(ULONG) Release (THIS);
           
          
//IClassFactory methods
          STDMETHODIMP CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid,LPVOID *ppv);
          STDMETHODIMP LockServer (BOOL fLock);            
        
        
private:
            
long *m_plDllCnt;//point to the Global DLL reference count
          long m_lRef;
            HINSTANCE m_hInst;
        }
;
        

       
        IUnknown标准接口:
       
        QueryInterface:该函数用来查看对象支持哪种方法,这也是COM接口最先调用的函数.
       
        AddRef:增加一次对象调用计数.
       
        Release:减少一次对象调用计数.
       
       
       
        IClassFactory特有的接口:
       
        CreateInstance:系统调用该函数去创建另一个所需的实例.本文的例子中,这个函数体内创建了一个CInputMethod类的对象.
       
        LockServer:用来标识该DLL是否被卸载.本文中,只有检测到m_plDllCnt变量为0值,也就是说该DLL已经没有被引用,此时管理器才会卸载该DLL.
       
       
   
    接下来就让我们再来看看CInputMethod类:
     class  CInputMethod :  public  IInputMethod
    
{
    
public:
    
        
//IUnknown methods
        STDMETHODIMP_(ULONG) Release(THIS);
        STDMETHODIMP_(ULONG) AddRef(THIS);
        STDMETHODIMP QueryInterface(THIS_ REFIID riid, LPVOID 
*ppv);
    
        
//IInputMethod
        HRESULT STDMETHODCALLTYPE SetImData (DWORD dwSize, void *pvImData);
        HRESULT STDMETHODCALLTYPE GetImData (DWORD dwSize, 
void *pvImData);
        HRESULT STDMETHODCALLTYPE RegisterCallback(IIMCallback 
*pIMCallback);
        HRESULT STDMETHODCALLTYPE ReceiveSipInfo(SIPINFO 
*psi);
        HRESULT STDMETHODCALLTYPE GetInfo(IMINFO 
*pimi);
        HRESULT STDMETHODCALLTYPE Hiding();
        HRESULT STDMETHODCALLTYPE Showing();
        HRESULT STDMETHODCALLTYPE Deselect();
        HRESULT STDMETHODCALLTYPE Select(HWND hWndSip);
        HRESULT STDMETHODCALLTYPE UserOptionsDlg (HWND hwndParent);
        CInputMethod(
long *plDllCnt,HINSTANCE hInst);
        
virtual ~CInputMethod();
    
    
protected:
        CIMWnd 
*m_pIMWnd; //The input method window pointer
        HINSTANCE m_hInst; //The dll instance
        long *m_plDllCnt;//point to the Global DLL reference count
        long m_lRef;
    }
;

    CInputMethod的IUnknown标准接口的作用和CClassFactory相同,在此就不赘述.
   
   
    IInputMethod特有接口:
   
    SetImData:应用程序可以通过该接口来获取输入法(IM)的信息.
   
    GetImData:传递特定的信息给输入法.
   
    RegisterCallback:SIP提供给输入法的回调函数接口.通过该回调函数接口,输入法可以给调用输入法的应用程序发送字符或键盘信息等等.这个是比较重要的一个函数,输入法就是通过该函数传递过来的接口函数来建立和外部的联系.
   
    ReceiveSipInfo:SIP通过该接口传递消息给输入法.
   
    GetInfo:SIP通过该接口来获取输入法的信息.
   
    Hiding:隐藏输入法.
   
    Showing:显示输入法.
   
    Deselect:输入法即将从内存中卸载的时候将调用该接口.
   
    Select:输入法装载到内存之前调用该接口.最明显的用户感受是在输入法管理器中选择某种输入法时,该接口即被调用.
   
    UserOptionsDlg:控制面板通过该接口用来设置输入法的属性.
   
   
   
    CClassFactory和CInputMethod的具体实现我们将在下一章中再详细解说,请容我们稍微休息一会.
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java安全漫谈是一本关于Java安全的书籍,深入探讨了Java应用程序在网络环境中的安全性和相关的安全漏洞。该书内容涵盖了Java安全基础、Java虚拟机的安全机制、Java安全管理、Java安全开发等方面的知识。 首先,Java安全基础部分介绍了Java安全模型的原理和特点,包括Java类库的安全特性、权限管理和访问控制、安全策略配置等。这部分内容可帮助开发人员了解Java应用程序的安全需求,并提供相应的解决方案。 其次,Java虚拟机的安全机制是Java应用程序的基石。该书介绍了Java虚拟机的安全沙箱和类加载机制,并讨论了如何利用这些安全机制避免恶意代码的执行和隐患的防范。 此外,Java安全管理部分从用户角度出发,介绍了Java应用程序的安全管理工具和技术,如Java安全策略文件、权限管理和安全认证等。开发人员可以通过合理配置和使用这些工具来提高Java应用程序的安全性。 最后,该书还涉及了Java安全开发过程中的一些最佳实践和常见安全漏洞,如输入验证、跨站脚本攻击(XSS)、SQL注入、跨站请求伪造(CSRF)等。通过学习和掌握这些知识,开发人员可以编写出更加安全的Java应用程序。 总而言之,Java安全漫谈是一本全面讨论Java安全的书籍,内容涵盖了Java安全基础、Java虚拟机的安全机制、Java安全管理和Java安全开发等方面的知识。它对于开发人员和安全从业人员来说,都是一本重要的参考书,有助于提高Java应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值