2010-02-22 12 views
10

मैं किसी भी कक्षा के लिए इंटरफेस आईडी को प्रोग्रामिक रूप से पुनर्प्राप्त करना चाहता हूं ताकि मैं इसे CoCreateInstance पर पास कर सकूं। किसी भी प्रकार के मदद की बहुत सराहना की जाएगी!!एक COM कक्षा की इंटरफ़ेस आईडी कैसे पुनर्प्राप्त करें ताकि इसे 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(); 
+0

हाँ, "पुराने स्कूल" सामान पर वोट प्राप्त करना मुश्किल है। लेकिन कम से कम यह अगले व्यक्ति के लिए समीक्षा करने के लिए यहाँ है! : डी – NTDLS

उत्तर

3

आप अग्रिम पता है कि आप किसी भी इंटरफ़ेस के लिए पूछने की जरूरत है निर्माण करने के लिए बहुत अच्छा उदाहरण हैं। यह आपको एसडीके हेडर फाइलों से उत्पाद विनिर्देशों से मिलता है, या आप अपनी प्रोजेक्ट में COM ऑब्जेक्ट का टीएलबी आयात कर सकते हैं।

सबसे आसान तरीका है जिस तरह से #import

+0

यदि इसे पहले से जानना है, तो मैं सी ++ में COM DLL कैसे लिख सकता हूं और इसे क्लासिक एएसपी में सर्वर.क्रेटऑब्जेक्ट() के माध्यम से उपयोग कर सकता हूं? क्लासिक एएसपी मेरे डीएलएल से जुड़ने में सक्षम है और इसके साथ इंटरफ़ेस मुझे मेरी कक्षा के भीतर कार्यों को कॉल करने की इजाजत देता है। – NTDLS

+1

क्योंकि एएसपी एक अच्छी तरह से knonw इंटरफेस के लिए पूछता है, IDISpatch http://msdn.microsoft.com/en-us/library/ms221608.aspx –

+1

बिल्कुल। मेरे उत्तर से प्रश्न का प्रयोग: "आप किस इंटरफेस के तरीकों पर कॉल करने जा रहे हैं?" जवाब IDISpatch है, इसलिए आप CoCreateInstance से उस इंटरफ़ेस के लिए पूछते हैं। फिर आप अन्य विधियों को कॉल करने के लिए आईडीस्पैच के तरीकों का उपयोग करते हैं जिनके नाम और पैरामीटर जिन्हें आप संकलित समय पर नहीं जानते थे। –

2

मंच एसडीके OleView उपयोगिता के स्रोत कोड के साथ वितरित किया जाता है, टी के लिए सभी संभव CLSIDs के वृक्ष और उन्हें नाम

3

उपयोग करने के लिए आप पहले से ही यह पता है। यह संकलन-समय आउटपुट प्रकार होगा कि आप फ़ंक्शन को pInterface वैरिएबल में स्टोर करना चाहते हैं जिसे आपने दिया है।

दूसरे शब्दों में, आप उस ऑब्जेक्ट का इलाज करने के लिए किस इंटरफ़ेस प्रकार का उपयोग करेंगे? आप किस इंटरफ़ेस के तरीकों पर कॉल करने जा रहे हैं?

CLSIDFromProgID से प्राप्त होने वाला प्रकार इंटरफ़ेस का कोई भी संस्करण हो सकता है, जिसमें एक भी शामिल है जो आपके कोड को संकलित करते समय भी मौजूद नहीं था। आप आम तौर पर मान सकते हैं कि रन टाइम पर जो भी संस्करण उपलब्ध है, वह कुछ कम संस्करण का भी समर्थन करता है जिसे आप संकलित समय के बारे में जानते हैं। आप ओएस से हाल के संस्करण के उदाहरण को तुरंत चालू करने के लिए कहते हैं, लेकिन फिर आप इसे कम संस्करण के इंटरफ़ेस के संदर्भ को वापस करने के लिए भी कहते हैं - जिसे आप जानते हैं कि उसे कैसे संभालना है।

समारोह आप के लिए वस्तु पर QueryInterface कहता है, इस तरह के प्रकार आप का अनुरोध किया है, कुछ का उपयोग कर:

obj->QueryInterface(riid, pInterface); 

आप अनुरोध करने के लिए और अधिक विशिष्ट कुछ भी नहीं है, तो बस IUnknown का उपयोग करें।

संबंधित मुद्दे

 संबंधित मुद्दे