次のコード行を実行すると
dispatch.GetTypeInfoCount(ref typeInfoCount);
次の例外がスローされます
タイプ 'System.Int32' のオブジェクトはタイプ 'System.UInt32&' に変換できません
using System.Runtime.InteropServices;
using ComTypes2 = System.Runtime.InteropServices.ComTypes;
public class ComHelper
{
[ComImport(), Guid("00020400-0000-0000-c000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IDispatch
{
void GetTypeInfoCount(ref uint pctinfo);
void GetTypeInfo(uint itinfo, uint lcid, ref IntPtr pptinfo);
void stub_GetIDsOfNames();
void Invoke(int dispIdMember,
ref Guid riid,
uint lcid,
ushort dwFlags,
ref ComTypes2.DISPPARAMS pDispParams,
ref object pVarResult,
ref IntPtr pExcepInfo,
ref uint pArgErr);
}
public static bool CheckIfComPropertyOrMethodExists<T1>(T1 objectToCheck, string propertyOrMethodName)
{
ComTypes2.ITypeInfo objectTypeInfo = null;
var objectITypeInfo = default(IntPtr);
var pFuncDesc = default(IntPtr);
try
{
// Convert the object to IDispatch
var dispatch = (IDispatch)objectToCheck;
uint typeInfoCount = 0;
// Attempt to get the objects TypeInfo
dispatch.GetTypeInfoCount(ref typeInfoCount);
if (typeInfoCount < 1) throw new ApplicationException("No type info");
dispatch.GetTypeInfo(0, 0, ref objectITypeInfo);
if (objectITypeInfo == IntPtr.Zero) throw new ApplicationException("No ITypeInfo");
objectTypeInfo = (ComTypes2.ITypeInfo)Marshal.GetTypedObjectForIUnknown(objectITypeInfo, typeof(ComTypes2.ITypeInfo));
var pTypeAttr = default(IntPtr);
objectTypeInfo.GetTypeAttr(out pTypeAttr);
var typeAttr = (ComTypes2.TYPEATTR)Marshal.PtrToStructure(pTypeAttr, typeof(ComTypes2.TYPEATTR));
objectTypeInfo.ReleaseTypeAttr(pTypeAttr);
// Find the method we're looking for in the list of COM objects methods
for (var iFunc = 0; iFunc <= typeAttr.cFuncs - 1; iFunc++)
{
objectTypeInfo.GetFuncDesc(iFunc, out pFuncDesc);
var funcDesc = (ComTypes2.FUNCDESC)Marshal.PtrToStructure(pFuncDesc, typeof(ComTypes2.FUNCDESC));
string[] names = { string.Empty };
int pcNames;
objectTypeInfo.GetNames(funcDesc.memid, names, 1, out pcNames);
var funcName = names[0];
if (funcName == propertyOrMethodName)
{
return true;
}
objectTypeInfo.ReleaseFuncDesc(pFuncDesc);
}
return false;
}
finally
{
if (objectTypeInfo != null)
{
objectTypeInfo.ReleaseFuncDesc(pFuncDesc);
}
Marshal.Release(objectITypeInfo);
}
}
}
答えは簡単だと思いますが、現時点では解決できません。GetTypeInfoCount のパラメーターは uint です。GetTypeInfoCount メソッドへの参照によって渡されるローカル変数 typeInfoCount も uint です。型変換の例外が発生するのはなぜですか?
この質問は以下に関連しています
例外を生成せずに COM プロパティまたはメソッドが存在するかどうかを確認する方法は?
これまでの便利なリンク
http://msdn.microsoft.com/en-us/library/ebbff4bc-36b2-4861-9efa-ffa45e013eb5%28VS.85%29