public class ComHelper
{
/// <summary>
/// Returns a string value representing the type name of the specified COM object.
/// </summary>
/// <param name="comObj">A COM object the type name of which to return.</param>
/// <returns>A string containing the type name.</returns>
public static string GetTypeName(object comObj)
{
if (comObj == null)
return String.Empty;
if (!Marshal.IsComObject(comObj))
//The specified object is not a COM object
return String.Empty;
IDispatch dispatch = comObj as IDispatch;
if (dispatch == null)
//The specified COM object doesn't support getting type information
return String.Empty;
System.Runtime.InteropServices.ComTypes.ITypeInfo typeInfo = null;
try
{
try
{
// obtain the ITypeInfo interface from the object
dispatch.GetTypeInfo(0, 0, out typeInfo);
}
catch (Exception ex)
{
#if LINQPAD
ex.Dump();
#endif
//Cannot get the ITypeInfo interface for the specified COM object
return String.Empty;
}
string typeName = "";
string documentation, helpFile;
int helpContext = -1;
try
{
//retrieves the documentation string for the specified type description
typeInfo.GetDocumentation(-1, out typeName, out documentation,
out helpContext, out helpFile);
}
catch (Exception ex)
{
// Cannot extract ITypeInfo information
return String.Empty;
}
return typeName;
}
catch (Exception ex)
{
// Unexpected error
return String.Empty;
}
finally
{
if (typeInfo != null) Marshal.ReleaseComObject(typeInfo);
}
}
}
/// <summary>
/// Exposes objects, methods and properties to programming tools and other
/// applications that support Automation.
/// </summary>
[ComImport()]
[Guid("00020400-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IDispatch
{
[PreserveSig]
int GetTypeInfoCount(out int Count);
[PreserveSig]
int GetTypeInfo(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid,
out System.Runtime.InteropServices.ComTypes.ITypeInfo typeInfo);
[PreserveSig]
int GetIDsOfNames(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)]
string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
[PreserveSig]
int Invoke(
int dispIdMember,
ref Guid riid,
uint lcid,
ushort wFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
out object pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
IntPtr[] pArgErr);
}
Wednesday, November 14, 2012
Ask what that COM object is
Man this is helpful, if you are working with any COM objects.
Ask it what type it is - HowTo: get the actual type name behind System.__ComObject with Visual C# or VB.NET
Automate Visual Studio from Linqpad
I really love LinqPad. Not that it doesn't have features I want, but that it just handles so many things in a convienent way. Starting with the whopping 6mb size. Enough about that.
I was just sure that there was a way to reach into Visual Studio from another process and do stuff. I had forgotten how. I had forgotten that I had even succeeded before. I tried to find a way again. This is the rather short magic that was needed.
var dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
and a simple ask/command sample in linqpad
const string SolutionExplorerWindow="{3AE79031-E1BC-11D0-8F78-00A0C9110057}";
const string SolutionFolder="{66A26720-8FB5-11D2-AA7E-00C04F688DDE}";
//EnvDTE.DTE
var dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
dte.Dump();
dte.FileName.Dump();
dte.Solution.FullName.Dump();
dte.Windows.Item(SolutionExplorerWindow).Activate();
//var uih=dte.ActiveWindow.Object as UIHierarchy;
Url Rewrite UI lies!
Url rewrite lies in the setup UI =(
Take this pattern `piwik/piwik.php*` using wildcard matching (not regex)
click Test Pattern and enter input data to test `piwik/piwik.php?anything=match`
it claims `{R:0}` will then include the query string for the action properties. It lies.
When I setup a diagnostic page to see what was coming across from the rewrite, there were no query string arguments, unless the Append query string box was checked. =(
Subscribe to:
Comments (Atom)