在用C++和ADO写数据库程序时,我习惯这样:CreateInstance(_T("ADODB.Connection"));现在出现问题了,Windows 2000系统中,虽然各种SQL代码调用返回信息都成功了,但是却没有正确执行SQL代码,后来改成CreateInstance(__uuidof(Connection))就好了,以下是CreateInstance的声明:
HRESULT CreateInstance(
const CLSID& rclsid,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
HRESULT CreateInstance(
LPCWSTR clsidString,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
HRESULT CreateInstance(
LPCSTR clsidStringA,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
第一个参数都是CLSID,但是为什么我在Windows XP下传递非CLSID的_T("ADODB.Connection")也能成功呢??
HRESULT CreateInstance(
const CLSID& rclsid,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
HRESULT CreateInstance(
LPCWSTR clsidString,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
HRESULT CreateInstance(
LPCSTR clsidStringA,
IUnknown* pOuter=NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
第一个参数都是CLSID,但是为什么我在Windows XP下传递非CLSID的_T("ADODB.Connection")也能成功呢??
第二是通过uuid创建对象,这个uuid是唯一的.
两种都是符合COM规范的.像JS都是使用第一种方式创建COM对象的
或者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);
}