WINCE应用开发笔记三--COM、数据类型、c++编程的一些感觉

1. 使用RETAILMSG输出调试信息。RETAILMSG中第一个参数的用途:用于决定消息是否被输出。在程序设计中,通过这个参数可以控制整个程序中调试信息的输出,通过设置不同的调试级别,只需要通过几个简单的控制开关,就可以达到控制输出的目的。

 

2. 资源的分配与释放。在java中,不需要考虑资源释放的问题。在C++中,资源分配和释放是必须考虑的问题。从库或者COM的实现者的角度来看,很可能在某个方法被调用时,需要分配资源,而何时释放资源,由库的使用者决定,因此,需要提供相应的接口来释放资源。典型的有:

a. 创建的对象获取了接口,必须用这个接口来释放创建的对象。

b. 内部创建的局部的资源,如果库的创建者不能在内部释放,就需要把内存资源的指针传递出来,由库的使用者在外部创建。例如:

 

pAttrNode->get_baseName(&bsName);

pAttrNode->get_text(&bsText);

SysFreeString(bsName);

SysFreeString(bsText);

 

 

3.COM是二进制级的重用;C++类是源码级的重用。因此,COM是语言无关的。

 

4. COM如何做到平台无关、硬件无关?COM中使用的数据类型都是中间数据类型,中间数据类型和底层数据类型通过一些配置变量来控制。

 

5. 在java中,通过对象调用方法看起来是理所当然的。对C++来说,这是一种创新。java是解释性,在java虚拟机中,对象放在堆中,方法放在方法区中,根据对象调用方法这种机制从虚拟机的实现这一层就决定了。而C++的编译器在处理时,使用的是虚函数表。其最原始的处理方法是类似于单片机中的处理办法,根据类型和方法名决定地址,在编译时确定地址。而后来演变出的动态分配,实际上是在运行前创建一组上下文,在运行时改变,在运行时访问上下文,这也是虚函数实现的基础。对于C++来说,要使用多态,就需要声明为虚函数,根据对象地址访问不是常态,在编译时确定地址才是常态。

 

6. 使用COM前要先初始化COM,用CoInitializeEx。CoInitializeEx被当前线程调用,用于初始化COM: Component Object Model.CoInitializeEx一般只调用一次,对于同一个现场,重复调用CoInitializeEx是允许的,但后续的会返回S_FALSE。为了合理地关闭COM库,每一次成功的调用CoInitializeEx,包括返回S_FALSE的调用,都必须对应一次CoUninitialize。

 

7. CoUnitialize();关闭OLE COM库,释放其占用的资源。头文件objbase.h.

 

8. CoCreateInstance;CLASS_ID:通过这个类id决定使用哪个类来创建对象;Interface_id:通过这个接口id决定用哪个接口与创建的对象通信;

CoCreateInstance提供了一种简单的方法连接类对象,并创建了一个未初始化的实例,释放类对象,它实际上封装了以下函数:

CoGetClassObject(clsid,clsContext,NULL,IID_IClassFactory,&pCF);

pCF->CreateInstance(pUnkOuter,riid,ppvObj);

pCF->Release();

当你只希望创建对象的一个实例时,用coCreateInstance;当需要创建多个实例时,用iClassFactory接口和CoGetClassObject更有效。

 

9. GetModuleFileName:获取当前模块的文件名;例如:/Program Files/testXml/testXml.exe

 

10. SysAllocString:分配一个新的string,并拷贝传入的string;如果没有足够的空间,这个函数会返回null.wince只支持unicode string。用到这个的时候是因为COM的一个方法需要BSTR的类型,本来已经分配了一个字符串,可以直接传入,但是传入的参数可能会被修改,因此,分配了一个空间,存储同样的字符串,再传入。这种处理在java中也很常见,因为,java中用的是引用,很可能,在一个不知名的位置,数据被悄悄的修改了。

 

9. 常用的数据类型

windows定义了这么多的数据类型,主要是考虑到了随着编码的演化,程序的可移植性。

 

TCHAR?

WIN32 character string用于描述ANSI/DBCS/Unicode;

for ansi/dbcs; tchar is char

for unicode: tchar is wchar

 

 

WCHAR:

16-bit unicode character

 

 

 

#ifdef UNICODE

 typedef WCHAR TCHAR;

#else

 typedef char TCHAR;

#endif

 

 

LPTSTR:带T的就是中间数据类型;带W和不带W的是非中间数据类型;

 

 

#ifdef UNICODE

 typedef LPWSTR LPTSTR;

#else

 typedef LPSTR LPTSTR;

#endif

 

 

 

带P的是指针

 

LPSTR: 指向ANSI字符串;注意,在windows平台上,char是8位;在java中,char则是16位,指向的是unicode;

typedef CHAR *LPSTR;

 

 

 

LPWSTR:指向16位的unicode字符串;

typedef WCHAR *LPWSTR;

 

 

 

HRESULT:

被接口使用的返回码;0代表成功;非0代表错误码;

typedef LONG HRESULT;

S_OK为0

 

LONG:

32位的有符号整数;

typedef long LONG;

 

LPARAM:

消息参数

typedef LONG_PTR LPARAM;

 

LONG_PTR:用作指针;对于32位的系统,地址就是32位的,用long;对于64位的系统,地址是64位的,就用int64;

#if defined(_WIN64)

 typedef __int64 LONG_PTR; 

#else

 typedef long LONG_PTR;

#endif

 

 

 

DWORD:32位的无符号整数

typedef unsigned long DWORD;

 

HANDLE:handle to a object

typedef PVOID HANDLE;

 

HDC:handle to a dc(device context)

typedef HANDLE HDC;

 

PVOID:point to any type

typedef void *PVOID;

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值