MFC+ADO数据库编程中,
在创建一个连接对象(Connection)和记录集对象(RecordSet)时,要用到CreateInstance,
创建连接对象时,我们经常能看到CreateInstance(_T("ADODB.Connection"))和CreateInstance(__uuidof(Connection))这两种写法~~
在实例中,这两种都是对的,
下面来看看他们的区别:
第一种是通过名字创建对象,可能会出现冲突.
第二是通过uuid创建对象,这个uuid是唯一的.
两种都是符合COM规范的.像JS都是使用第一种方式创建COM对象的
COM本质论上的一段原文
除了用CLSID来命名实现之外,COM也支持文本方式的别称,被称为programmaticID
或者ProgID。ProgID采用库名.类名.版本的形式,而且,与CLSID不同的是,我们只是为
了方便而要求ProgID是唯一的。通过COM API函数CLSIDFromProgID和
ProgIDFromCLSID,客户可以在ProgID和CLSID两者之间进行转换,这两个函数的原形如
下:
HRESULT CLSIDFromProgID ( [in,string]LPCOLESTR lpszProgID, [out] LPCLSID pclsid);
HRESULT ProgIDFromCLSID ( [in]REFCLSID clsid, [out,string]LPOLESTaR* lplpszProgID);
为了把一个ProgID转换为CLSID,我们只需简单的调用CLSIDFromProgID:
HRESULT GetCGorillaCLSID(CLSID& rclsid){
const OLECHAR wszProgID[] = OLESTR("Apes.Gorilla.l");
return CLSIDFromProgID(wszProgID,&rclsid);
}
第二种是以唯一的uuid(也叫CLSID)来获取,就像使用你的身份证来确定你这个人一样,
而第一种是以这个COM类的名来获取,就可能重名,或无法找到这个名,导致无法再找到对应的UUID(CLSID),就好像用张三来找你一样,
有几百个叫张三的,系统就不知道哪个是你了,或者你明明有身份证,但姓名没有登记正确,也就找不到你了.
因此第二种最好的方法,不会出错.他用的就是相当于数据库表中的主键一样.唯一值!
推荐使用第二种~~
PS:
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,
|