मेरे पास एक COM क्लास CMyCOMServer
है, जो कि एक ही ऐप्लिकेशन में IMyInterface
लागू करता है, दोनों सही GUID के साथ। CMyCOMServer::QueryInterface
यदि IU अज्ञात या IMyInterface का अनुरोध किया गया है, तो S_OK (और स्वयं को सही प्रकार पर डालें) वापस कर देगा, अन्यथा यह E_NOINTERFACE लौटाता है।CoCreateInstance E_NOINTERFACE लौटा रहा है भले ही इंटरफ़ेस
एक ही पीसी पर एक और ऐप्लिकेशन में, मैं फोन:
HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER,
__uuidof(IMyInterface),(void **)&pInterface);
यह रिटर्न E_NOINTERFACE। इसलिए मैंने माना कि मैं कुछ गलत कर रहा था और CMyCOMServer::QueryInterface
पर ब्रेकपॉइंट जोड़ा। मैंने पाया कि जब CoCreateInstance
कहा जाता है, QueryInterface
अलग इंटरफेस के लिए कई बार शुरू हो रहा है:
- पहले, IUnknown अनुरोध किया जाता है - कोई समस्या नहीं
- फिर, IMarshall आदि जैसे कई इंटरफेस अनुरोध कर रहे हैं ... इन समर्थित नहीं हैं इसलिए E_NOINTERFACE
- वापस आ गया है, अंत में, IMyInterface का अनुरोध किया गया है। मैं QueryInterface S_OK वापस आती है और इंटरफ़ेस सूचक के रूप में
(IMyInterface *)this
सेट के रूप में उम्मीद
तो मेरी भ्रम की स्थिति है क्यों बुला CoCreateInstance मुझे एक शून्य सूचक जा रहा है, सत्यापित करने और E_NOINTERFACE की वापसी कोड, जब COM सर्वर अनुप्रयोग स्पष्ट रूप से लौटा रहा है इंटरफ़ेस मैं पूछता हूं?
संपादित करें: मेरा क्लाइंट ऐप स्टार्टअप पर CoInitialize (NULL) को कॉल करता है, इससे कोई फर्क नहीं पड़ता।
बस स्पष्ट करने के लिए: आपका COM सर्वर एक ऐप में चलाता है, और क्लाइंट एक और ऐप में चलता है? क्योंकि इसका मतलब है कि वे अलग-अलग प्रक्रियाओं में होंगे, और बदले में इसका मतलब है कि आप _need_ marshalling, संभवतः कस्टम। – MSalters
हां वे करते हैं। 1 पीसी पर दो अलग-अलग ऐप्स। हालांकि मुझे पहले मार्शलिंग के साथ कभी गड़बड़ नहीं हुई थी, इसलिए मैं उलझन में हूं। मैंने पहले ही इसके बारे में सुना और मैंने COM विकास की उचित मात्रा में काम किया है। –