代码之家  ›  专栏  ›  技术社区  ›  NTDLS

如何检索COM类的接口ID以便将其传递给CoCreateInstance?

  •  10
  • NTDLS  · 技术社区  · 15 年前

    我想通过程序检索任何类的接口ID,以便将其传递给CoCreateInstance。非常感谢您的帮助!你说什么?

    请参见下面的“如何获取此信息”:

    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();
    
    3 回复  |  直到 13 年前
        1
  •  3
  •   Remus Rusanu    15 年前
        2
  •  3
  •   Rob Kennedy    15 年前

    pInterface

    CLSIDFromProgID

    QueryInterface

    obj->QueryInterface(riid, pInterface);
    

    IUnknown

        3
  •  2
  •   Dewfy    15 年前