CoInitialize(NULL);
 
HRESULT hr=S_OK;
CLSID fso_CLSID;
IID iUnknown_IID;
hr=CLSIDFromString(_T("{0D43FE01-F093-11CF-8940-00A0C9054228}"),&fso_CLSID);
hr=IIDFromString(_T("{00000000-0000-0000-C000-000000000046}"),&iUnknown_IID);
 
//[HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID]
hr=CLSIDFromProgID(_T("Scripting.FileSystemObject"),&fso_CLSID);
hr=CLSIDFromProgIDEx(_T("Scripting.FileSystemObject"),&fso_CLSID);
 
//注意:ProgIDFromCLSID会自己在COM库中申请内存,必须使用COM库中的CoTaskMemFree函数来释放
//HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\ProgID
LPOLESTR lpStrProgID=NULL;
hr=ProgIDFromCLSID(fso_CLSID,&lpStrProgID);
CoTaskMemFree(lpStrProgID);
 
LPOLESTR lpStrCLSID=NULL;
StringFromCLSID(fso_CLSID,&lpStrCLSID);
CoTaskMemFree(lpStrCLSID);
 
OLECHAR oleStrGUID[200];
int nLength=StringFromGUID2(fso_CLSID,oleStrGUID,200);
 
LPOLESTR lpStrIID=NULL;
hr=StringFromIID(iUnknown_IID,&lpStrIID);
CoTaskMemFree(lpStrIID);
 
//根据CLSID创建COM组件,并根据IID查询一个接口,本例创建了Scripting.FileSystemObject组件,并查询了一个IUnknown接口
//此时会加载scrrun.dll(Scripting.FileSystemObject组件在此dll中实现)
IUnknown *pUnknown=NULL;
hr=CoCreateInstance(fso_CLSID,NULL,CLSCTX_INPROC_SERVER,iUnknown_IID,(LPVOID*)&pUnknown);
 
//可以被VBScript等脚本调用的组件,都实现了IDispatch接口
//本例中使用IDispatch接口来调用“方法”
IDispatch *pDispatch=NULL;
hr=pUnknown->QueryInterface(IID_IDispatch,(LPVOID*)&pDispatch);
 
DISPID dispid;
LPOLESTR lpFunc=_T("FileExists");
//查询组件中实现的“方法”的ID
hr=pDispatch->GetIDsOfNames(IID_NULL,&lpFunc,1,LOCALE_USER_DEFAULT,&dispid);
 
//为方法“FileExists”准备参数
//本例用FileExists来判断E:\Desktop\COMString\COMString.cpp是否存在
VARIANTARG param[1];
param[0].vt=VT_BSTR;
param[0].bstrVal=SysAllocString(_T("E:\\Desktop\\COMString\\COMString.cpp"));
 
DISPPARAMS dispparamsArgs;
ZeroMemory(&dispparamsArgs,sizeof(DISPPARAMS));
dispparamsArgs.cArgs=1;
dispparamsArgs.cNamedArgs=0;
dispparamsArgs.rgdispidNamedArgs=NULL;
dispparamsArgs.rgvarg=param;
 
//调用FileExists方法
VARIANT VarResult;
EXCEPINFO ExcepInfo;
unsigned int uArgErr;
hr=pDispatch->Invoke(dispid,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispparamsArgs, &VarResult, &ExcepInfo, &uArgErr);
SysFreeString(param[0].bstrVal);
 
if (VarResult.vt==VT_BOOL)
{
    //VarResult.boolVal是判断结果
}
 
pDispatch->Release();
pUnknown->Release();
 
CoUninitialize();



本文链接地址: COM.0 一些COM函数的使用示例
https://blog.qingfengju.com/index.asp?id=263

上一篇: COM.6 Windows Shell扩展(在右键菜单显示“显示或者隐藏扩展名”)
下一篇: ASP中使用进程外COM组件的配置

分类:Win32/C++ 查看次数:5956 发布时间:2010/6/2 15:43:08