Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / WinForms / Managed / System / WinForms / ComponentModel / COM2Interop / ComNativeDescriptor.cs / 1305376 / ComNativeDescriptor.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms.ComponentModel.Com2Interop {
using System.Runtime.Serialization.Formatters;
using System.Runtime.Remoting;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.Design;
using Microsoft.Win32;
///
///
/// Top level mapping layer between COM Object and TypeDescriptor.
///
///
internal class ComNativeDescriptor : TypeDescriptionProvider {
private static ComNativeDescriptor handler = null;
private AttributeCollection staticAttrs = new AttributeCollection(new Attribute[]{BrowsableAttribute.Yes, DesignTimeVisibleAttribute.No});
///
///
/// Our collection of Object managers (Com2Properties) for native properties
///
private WeakHashtable nativeProps = new WeakHashtable();
///
///
/// Our collection of browsing handlers, which are stateless and shared across objects.
///
private Hashtable extendedBrowsingHandlers = new Hashtable();
///
///
/// We increment this every time we look at an Object, at specified
/// intervals, we run through the properies list to see if we should
/// delete any.
///
private int clearCount = 0;
private const int CLEAR_INTERVAL = 25;
internal static ComNativeDescriptor Instance {
get {
if (handler == null) {
handler = new ComNativeDescriptor();
}
return handler;
}
}
[
System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")
]
// called via reflection for AutomationExtender stuff. Don't delete!
//
public static object GetNativePropertyValue(object component, string propertyName, ref bool succeeded)
{
return Instance.GetPropertyValue(component, propertyName, ref succeeded);
}
///
/// This method returns a custom type descriptor for the given type / object.
/// The objectType parameter is always valid, but the instance parameter may
/// be null if no instance was passed to TypeDescriptor. The method should
/// return a custom type descriptor for the object. If the method is not
/// interested in providing type information for the object it should
/// return null.
///
/// This method is prototyped as virtual, and by default returns null
/// if no parent provider was passed. If a parent provider was passed,
/// this method will invoke the parent provider's GetTypeDescriptor
/// method.
///
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
{
return new ComTypeDescriptor(this, instance);
}
internal string GetClassName(Object component) {
string name = null;
// does IVsPerPropretyBrowsing supply us a name?
if (component is NativeMethods.IVsPerPropertyBrowsing) {
int hr = ((NativeMethods.IVsPerPropertyBrowsing)component).GetClassName(ref name);
if (NativeMethods.Succeeded(hr) && name != null) {
return name;
}
// otherwise fall through...
}
UnsafeNativeMethods.ITypeInfo pTypeInfo = Com2TypeInfoProcessor.FindTypeInfo(component, true);
if (pTypeInfo == null) {
//Debug.Fail("The current component failed to return an ITypeInfo");
return "";
}
if (pTypeInfo != null) {
string desc = null;
try {
pTypeInfo.GetDocumentation(NativeMethods.MEMBERID_NIL, ref name, ref desc, null, null);
// strip the leading underscores
while (name != null && name.Length > 0 && name[0] == '_') {
name = name.Substring(1);
}
return name;
}
catch {
}
}
return "";
}
internal TypeConverter GetConverter(Object component) {
return TypeDescriptor.GetConverter(typeof(IComponent));
}
internal Object GetEditor(Object component, Type baseEditorType) {
return TypeDescriptor.GetEditor(component.GetType(), baseEditorType);
}
internal string GetName(Object component) {
if (!(component is UnsafeNativeMethods.IDispatch)) {
return "";
}
int dispid = Com2TypeInfoProcessor.GetNameDispId((UnsafeNativeMethods.IDispatch)component);
if (dispid != NativeMethods.MEMBERID_NIL) {
bool success = false;
object value = GetPropertyValue(component, dispid, ref success);
if (success && value != null) {
return value.ToString();
}
}
return "";
}
internal Object GetPropertyValue(Object component, string propertyName, ref bool succeeded) {
if (!(component is UnsafeNativeMethods.IDispatch)) {
return null;
}
UnsafeNativeMethods.IDispatch iDispatch = (UnsafeNativeMethods.IDispatch)component;
string[] names = new string[]{propertyName};
int[] dispid = new int[1];
dispid[0] = NativeMethods.DISPID_UNKNOWN;
Guid g = Guid.Empty;
try {
int hr = iDispatch.GetIDsOfNames(ref g, names, 1, SafeNativeMethods.GetThreadLCID(), dispid);
if (dispid[0] == NativeMethods.DISPID_UNKNOWN || NativeMethods.Failed(hr)) {
return null;
}
}
catch {
return null;
}
return GetPropertyValue(component, dispid[0], ref succeeded);
}
internal Object GetPropertyValue(Object component, int dispid, ref bool succeeded) {
if (!(component is UnsafeNativeMethods.IDispatch)) {
return null;
}
Object[] pVarResult = new Object[1];
if (GetPropertyValue(component, dispid, pVarResult) == NativeMethods.S_OK) {
succeeded = true;
return pVarResult[0];
}
else {
succeeded = false;
return null;
}
}
internal int GetPropertyValue(Object component, int dispid, Object[] retval) {
if (!(component is UnsafeNativeMethods.IDispatch)) {
return NativeMethods.E_NOINTERFACE;
}
UnsafeNativeMethods.IDispatch iDispatch = (UnsafeNativeMethods.IDispatch)component;
try {
Guid g = Guid.Empty;
NativeMethods.tagEXCEPINFO pExcepInfo = new NativeMethods.tagEXCEPINFO();
int hr;
try{
hr = iDispatch.Invoke(dispid,
ref g,
SafeNativeMethods.GetThreadLCID(),
NativeMethods.DISPATCH_PROPERTYGET,
new NativeMethods.tagDISPPARAMS(),
retval,
pExcepInfo, null);
/*if (hr != NativeMethods.S_OK){
Com2PropertyDescriptor.PrintExceptionInfo(pExcepInfo);
} */
if (hr == NativeMethods.DISP_E_EXCEPTION) {
hr = pExcepInfo.scode;
}
}
catch (ExternalException ex){
hr = ex.ErrorCode;
}
return hr;
}
catch {
//Debug.Fail(e.ToString() + " " + component.GetType().GUID.ToString() + " " + component.ToString());
}
return NativeMethods.E_FAIL;
}
///
///
/// Checks if the given dispid matches the dispid that the Object would like to specify
/// as its identification proeprty (Name, ID, etc).
///
internal bool IsNameDispId(Object obj, int dispid) {
if (obj == null || !obj.GetType().IsCOMObject) {
return false;
}
return dispid == Com2TypeInfoProcessor.GetNameDispId((UnsafeNativeMethods.IDispatch)obj);
}
///
///
/// Checks all our property manages to see if any have become invalid.
///
private void CheckClear(Object component) {
// walk the list every so many calls
if ((++clearCount % CLEAR_INTERVAL) == 0) {
lock(nativeProps) {
clearCount = 0;
List
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DiscreteKeyFrames.cs
- TypeConverterAttribute.cs
- SrgsElementFactory.cs
- WorkflowApplicationAbortedEventArgs.cs
- StringBuilder.cs
- ComponentEditorForm.cs
- GroupQuery.cs
- basemetadatamappingvisitor.cs
- DataPagerField.cs
- HttpResponseHeader.cs
- SqlProviderManifest.cs
- APCustomTypeDescriptor.cs
- ReadOnlyDataSourceView.cs
- ReflectTypeDescriptionProvider.cs
- HyperLinkField.cs
- WinInet.cs
- PackWebRequest.cs
- sortedlist.cs
- LassoHelper.cs
- ServiceContractDetailViewControl.cs
- SqlUtils.cs
- SpecularMaterial.cs
- BitmapEffectCollection.cs
- CapabilitiesUse.cs
- PrintPageEvent.cs
- PcmConverter.cs
- XamlToRtfParser.cs
- WorkingDirectoryEditor.cs
- RtType.cs
- BindToObject.cs
- BinaryCommonClasses.cs
- GestureRecognizer.cs
- UniqueIdentifierService.cs
- StructuredProperty.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- IFlowDocumentViewer.cs
- ParseElementCollection.cs
- FormsAuthenticationUserCollection.cs
- AttributeConverter.cs
- TreeBuilder.cs
- DataReaderContainer.cs
- DataControlPagerLinkButton.cs
- FixUp.cs
- CheckableControlBaseAdapter.cs
- DataView.cs
- ConfigurationSettings.cs
- BaseTemplateBuildProvider.cs
- TextEditorTables.cs
- FilterElement.cs
- DataGridCommandEventArgs.cs
- ProviderUtil.cs
- NavigationPropertyEmitter.cs
- OleStrCAMarshaler.cs
- LocalizabilityAttribute.cs
- TileBrush.cs
- JapaneseCalendar.cs
- ContentElement.cs
- TransportChannelListener.cs
- ProviderCommandInfoUtils.cs
- BinHexEncoding.cs
- RewritingValidator.cs
- SingleAnimationBase.cs
- SimpleType.cs
- DataGridTablesFactory.cs
- SQLUtility.cs
- IgnoreFileBuildProvider.cs
- PolicyUnit.cs
- XPathParser.cs
- PerspectiveCamera.cs
- ClientConfigurationHost.cs
- CheckBoxBaseAdapter.cs
- ArrangedElement.cs
- MetadataStore.cs
- Vector3DValueSerializer.cs
- SignatureHelper.cs
- ChangeConflicts.cs
- TableMethodGenerator.cs
- TrackingExtract.cs
- ParallelTimeline.cs
- Brushes.cs
- InProcStateClientManager.cs
- DataContractJsonSerializerOperationBehavior.cs
- DataColumn.cs
- XmlNode.cs
- TableDetailsRow.cs
- ScrollEventArgs.cs
- SqlConnectionPoolGroupProviderInfo.cs
- XPathExpr.cs
- OleStrCAMarshaler.cs
- FlagsAttribute.cs
- DispatcherObject.cs
- Line.cs
- StateDesigner.cs
- COAUTHIDENTITY.cs
- AdRotator.cs
- DefaultValueConverter.cs
- WebPartConnection.cs
- ZipIOLocalFileBlock.cs
- DecoderNLS.cs
- Tablet.cs