c++ programming كيفية استرداد معرف واجهة فئة كوم بحيث يمكن تمريرها إلى كوكريتينستانس؟




windows programming (3)

أريد أن بروجيكاتيكلي استرداد معرف واجهة لأي فئة حتى أستطيع أن تمريرها إلى كوكرياتينستانس. أي مساعدة هو محل تقدير كبير جدا !!

راجع "كيف أحصل على هذا" أدناه:

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();

كنت تعرف ذلك. سيكون نوع إخراج الوقت الذي تريده لتخزين الدالة في متغير pInterface الذي أعطيته.

وبعبارة أخرى، ما هو نوع الواجهة التي ستقوم بمعالجة هذا الكائن الذي قمت بإنشائه؟ ما هي طرق الواجهة التي ستدعوها؟

النوع الذي تحصل عليه من CLSIDFromProgID قد يكون أي إصدار من واجهة، بما في ذلك واحدة التي لم تكن موجودة حتى في الوقت الذي جمعت التعليمات البرمجية الخاصة بك. يمكنك عادة افتراض أن أي إصدار متاح في وقت التشغيل كما يدعم بعض الإصدار أقل أن تعرف عن في وقت الترجمة. يمكنك أن تطلب من نظام التشغيل إنشاء مثيل من الإصدار الأخير، ولكن بعد ذلك يمكنك أيضا أن تطلب منه أن ترجع إشارة إلى واجهة الإصدار الأقل - تلك التي تعرف كيفية التعامل معها.

وظيفة استدعاء QueryInterface على الكائن بالنسبة لك، وذلك باستخدام النوع الذي طلبته، شيء من هذا القبيل:

obj->QueryInterface(riid, pInterface);

إذا كان لديك شيء أكثر تحديدا لطلب، مجرد استخدام IUnknown .


يتم توزيع منصة سك مع شفرة المصدر من الأداة المساعدة أوليفيو، ر يحتوي على مثال جيد جدا لبناء شجرة كل كلسيدس الممكنة وأسماء لهم


تحتاج إلى معرفة مقدما ما واجهة تسأل عنه. هذا تحصل من مواصفات المنتج، من ملفات رأس سك أو يمكنك استيراد تلب الكائن كوم في المشروع الخاص بك.

الطريقة الأسهل هي استخدام #import





com