博客日历
2025年01月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
30 | 31 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
存档
2024年03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
COM.0 一些COM函数的使用示例
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.6 Windows Shell扩展(在右键菜单显示“显示或者隐藏扩展名”)
下一篇: ASP中使用进程外COM组件的配置
分类:Win32/C++ 查看次数:5956 发布时间:2010/6/2 15:43:08