コード例 #1
0
        internal static MI_Deserializer.MI_Deserializer_ClassObjectNeededNative GetNativeClassObjectNeededCallback(string format, MI_Deserializer.MI_Deserializer_ClassObjectNeeded managedCallback)
        {
            if (managedCallback == null)
            {
                return(null);
            }

            return(delegate(
                       IntPtr context,
                       IntPtr serverNamePtr,
                       IntPtr namespaceNamePtr,
                       IntPtr classNamePtr,
                       IntPtr requestedClassObject)
            {
                MI_String serverName = MI_String.NewFromDirectPtr(serverNamePtr);
                MI_String namespaceName = MI_String.NewFromDirectPtr(namespaceNamePtr);
                MI_String className = MI_String.NewFromDirectPtr(classNamePtr);

                MI_Class classObject;

                try
                {
                    var localResult = managedCallback(serverName.Value, namespaceName.Value, className.Value, out classObject);
                    if (localResult == MI_Result.MI_RESULT_OK)
                    {
                        IntPtr outPtr;
                        if (MI_SerializationFormat.MOF.Equals(format, StringComparison.OrdinalIgnoreCase))
                        {
                            // The MOF deserializer helpfully tries to manage the class objects returned by the
                            // callback and will cheerfully delete them without warning. Return a copy instead.
                            MI_Class tmp;
                            localResult = classObject.Clone(out tmp);
                            if (localResult != MI_Result.MI_RESULT_OK)
                            {
                                return localResult;
                            }

                            outPtr = tmp.Ptr;
                        }
                        else
                        {
                            outPtr = classObject.Ptr;
                        }

                        Marshal.WriteIntPtr(requestedClassObject, outPtr);
                    }

                    return localResult;
                }
                catch
                {
                    return MI_Result.MI_RESULT_FAILED;
                }
            });
        }