Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / ComponentModel / COM2Interop / BaseCAMarshaler.cs / 1 / BaseCAMarshaler.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms.ComponentModel.Com2Interop { using System.Runtime.Remoting; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System; using Microsoft.Win32; using System.Globalization; ////// /// This class performs basic operation for marshaling data passed /// in from native in one of the CA*** structs (CADWORD, CAUUID, etc), /// which are structs in which the first word is the number of elements /// and the second is a pointer to an array of such elements. /// /// internal abstract class BaseCAMarshaler { private static TraceSwitch CAMarshalSwitch = new TraceSwitch("CAMarshal", "BaseCAMarshaler: Debug CA* struct marshaling"); private IntPtr caArrayAddress; private int count; private object[] itemArray; ////// /// Base ctor /// protected BaseCAMarshaler(NativeMethods.CA_STRUCT caStruct) : base() { if (caStruct == null) { count = 0; Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "BaseCAMarshaler: null passed in!"); } // first 4 bytes is the count count = caStruct.cElems; caArrayAddress = caStruct.pElems; Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "Marshaling " + count.ToString(CultureInfo.InvariantCulture) + " items of type " + ItemType.Name); } ~BaseCAMarshaler() { try { if (itemArray == null && caArrayAddress != IntPtr.Zero) { object[] items = Items; } } catch { } } protected abstract Array CreateArray(); ////// /// Returns the type of item this marshaler will /// return in the items array. /// public abstract Type ItemType { get; } ////// /// Returns the count of items that will be or have been /// marshaled. /// public int Count { get { return count; } } ////// /// The marshaled items. /// public virtual object[] Items { get { try { if (itemArray == null) { itemArray = Get_Items(); } } catch (Exception ex) { Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "Marshaling failed: " + ex.GetType().Name + ", " + ex.Message); } #if DEBUG if (itemArray != null) { Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "Marshaled: " + itemArray.Length.ToString(CultureInfo.InvariantCulture) + " items, array type=" + itemArray.GetType().Name); } #endif return itemArray; } } ////// /// Override this member to perform marshalling of a single item /// given it's native address. /// protected abstract object GetItemFromAddress(IntPtr addr); // Retrieve the items private object[] Get_Items() { // cycle through the addresses and get an item for each addr IntPtr addr; Array items = new object[Count]; //cpb vs38262 System.Array.CreateInstance(this.ItemType,count); object curItem; for (int i = 0; i < count; i++) { try { addr = Marshal.ReadIntPtr(caArrayAddress, i * IntPtr.Size); curItem = GetItemFromAddress(addr); if (curItem != null && ItemType.IsInstanceOfType(curItem)) { items.SetValue(curItem, i); } Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "Marshaled " + ItemType.Name + " item, value=" + (curItem == null ? "(null)" : curItem.ToString())); } catch (Exception ex) { Debug.WriteLineIf(CAMarshalSwitch.TraceVerbose, "Failed to marshal " + ItemType.Name + " item, exception=" + ex.GetType().Name +", " +ex.Message); } } // free the array Marshal.FreeCoTaskMem(caArrayAddress); caArrayAddress = IntPtr.Zero; return(object[])items; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SystemResourceKey.cs
- DataGridViewCellCancelEventArgs.cs
- HashCodeCombiner.cs
- ObjectKeyFrameCollection.cs
- PreProcessor.cs
- TemplatedAdorner.cs
- ClientBuildManagerTypeDescriptionProviderBridge.cs
- ViewManager.cs
- TextTreeTextElementNode.cs
- ScrollProviderWrapper.cs
- WeakReferenceKey.cs
- FormClosedEvent.cs
- AddInAdapter.cs
- CapiNative.cs
- Soap12ServerProtocol.cs
- dataSvcMapFileLoader.cs
- AudienceUriMode.cs
- ScrollBarAutomationPeer.cs
- AnimationClockResource.cs
- ToolStripPanelRow.cs
- MSAAWinEventWrap.cs
- ComIntegrationManifestGenerator.cs
- ScrollChrome.cs
- CorrelationKey.cs
- SmiConnection.cs
- TextEditorTables.cs
- RoleManagerModule.cs
- ApplicationInterop.cs
- MarginsConverter.cs
- InternalBase.cs
- Annotation.cs
- FlowLayoutSettings.cs
- HttpModuleCollection.cs
- CollectionViewProxy.cs
- TimerExtension.cs
- TokenBasedSetEnumerator.cs
- EntitySet.cs
- SubpageParaClient.cs
- DefaultAuthorizationContext.cs
- ALinqExpressionVisitor.cs
- StringPropertyBuilder.cs
- Baml2006ReaderContext.cs
- HintTextMaxWidthConverter.cs
- RightsManagementEncryptionTransform.cs
- PriorityQueue.cs
- SQLInt16.cs
- SQLInt32Storage.cs
- ListViewDeletedEventArgs.cs
- FolderLevelBuildProviderCollection.cs
- GlyphManager.cs
- ThemeableAttribute.cs
- XmlSchemaAnnotation.cs
- DesignTimeVisibleAttribute.cs
- InternalRelationshipCollection.cs
- ColorIndependentAnimationStorage.cs
- TextSelectionProcessor.cs
- StandardTransformFactory.cs
- Camera.cs
- CodeComment.cs
- ParamArrayAttribute.cs
- TextPointerBase.cs
- SizeConverter.cs
- DataGridViewBand.cs
- BaseDataBoundControl.cs
- SudsParser.cs
- GroupAggregateExpr.cs
- RepeaterItemEventArgs.cs
- NavigationPropertyEmitter.cs
- WebPartTransformerAttribute.cs
- DataGridViewCellEventArgs.cs
- Variable.cs
- NumberAction.cs
- ConfigViewGenerator.cs
- CodeGeneratorOptions.cs
- DataGridViewCellStyleContentChangedEventArgs.cs
- NamespaceDecl.cs
- LayoutSettings.cs
- OracleFactory.cs
- SqlInternalConnectionSmi.cs
- JobStaple.cs
- DataGridAutoFormatDialog.cs
- SymbolUsageManager.cs
- CursorConverter.cs
- WebProxyScriptElement.cs
- FixUp.cs
- AstTree.cs
- LineGeometry.cs
- SignatureSummaryDialog.cs
- ContractInstanceProvider.cs
- SecurityPolicyVersion.cs
- DrawingCollection.cs
- ViewManager.cs
- EmissiveMaterial.cs
- InputScope.cs
- SplitterDesigner.cs
- DataGridAutomationPeer.cs
- PropertyGridCommands.cs
- MouseWheelEventArgs.cs
- EdmConstants.cs
- sqlser.cs