如何检索COM类的接口ID,以便它可以传递给CoCreateInstance?

我想编程地检索任何类的接口ID,以便我可以将它传递给CoCreateInstance。 很感谢任何forms的帮助!!

请参阅下面的“我如何得到这个”

HRESULT hResult; CLSID ClassID; void *pInterface; if(!(hResult = SUCCEEDED(CoInitialize(NULL)))) { return 1; } if(S_OK == CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID)) { hResult = CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER, <<How Do I Get This?>>, (LPVOID *)&pInterface); } CoUninitialize(); 

编辑:感谢所有的帮助,似乎现在完美的工作!

 HRESULT hResult; CLSID ClassID; IClassFactory *pClf; void *pVdb; if(!(hResult = SUCCEEDED(CoInitialize(NULL)))) { return 1; } if(SUCCEEDED(CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID)) { IDispatch *pDispatch; if(SUCCEEDED(CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pDispatch)) { OLECHAR *sMember = L"FileExists"; DISPID idFileExists; if(SUCCEEDED(pDispatch->GetIDsOfNames( IID_NULL, &sMember, 1, LOCALE_SYSTEM_DEFAULT, &idFileExists)) { unsigned int puArgErr = 0; VARIANT VarResult; EXCEPINFO pExcepInfo; VariantInit(&VarResult); VariantInit(&pExcepInfo); DISPPARAMS pParams; memset(&pParams, 0, sizeof(DISPPARAMS)); pParams.cArgs = 1; VARIANT Arguments[1]; VariantInit(&Arguments[0]); pParams.rgvarg = Arguments; pParams.cNamedArgs = 0; pParams.rgvarg[0].vt = VT_BSTR; pParams.rgvarg[0].bstrVal = SysAllocString(L"C:\\Test.txt"); hResult = pDispatch->Invoke( idFileExists, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &pParams, &VarResult, &pExcepInfo, &puArgErr ); SysFreeString(pParams.rgvarg[0].bstrVal); printf("File Exists? %d\n", abs(VarResult.boolVal)); } pDispatch->Release(); } } CoUninitialize(); 

您需要事先知道您要求的界面。 您可以从SDK头文件的产品规格中获得,或者可以将COM对象的TLB导入到您的项目中。

最简单的方法是使用#import

你已经知道了。 这将是编译时输出类型 ,你希望函数存储在你已经给出的pInterface变量中。

换句话说,你打算把你创建的那个对象作为什么样的接口类型? 你打算调用哪个接口的方法?

您从CLSIDFromProgID获得的类型可能是任何版本的接口,包括在您编译代码时甚至不存在的接口。 您通常可以假定,在运行时可用的任何版本也支持您在编译时知道的较低版本。 你要求操作系统实例化一个新版本的实例,但是你也要求它返回一个引用到较小版本的接口 – 那个你知道如何处理的接口。

该函数使用您请求的类型为您调用对象上的QueryInterface ,如下所示:

 obj->QueryInterface(riid, pInterface); 

如果你没有更具体的要求,只需使用IUnknown

平台SDK与OleView实用程序的源代码一起发布,t包含了构建所有可能的CLSID的树和它们的名字的很好的例子