void*void ポインター (別名またはハンドル) を COMタイプに配置するにはどうすればよいですかVARIANT。ラッパー クラス_variant_tはこれを誤ってブール値に変換します。しかし、COM-Marshaller for .NET がそれをIntPtr.
私が読んだスレッドの 1つは、MSDN Social のこのスレッドでした。彼らは次のような解決策を提案しました。
VARIANTARG Arg;
VariantInit(&Arg);
V_VT(&Arg) = VT_INT;
V_INT(&Arg) = (int)m_hWnd;
この解決策の問題は、V_INT(member intVal) が32 ビット整数であり、ポインターを強制的に 32 ビット ポインターにすることです。つまり、64 ビット ポインターを転送できません。その問題の解決策はありますか?64ビット整数として転送する他の方法はありますか?
私はいくつかのコードでこれをテストしました。したがって、any を受け取り、System.Objectその値と型を出力する .NET メソッドを使用します。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
MyVARIANTは互換性のために満たされてv.llVal = 0; v.byref = myPointer;いるため、32/64 ビット ポインターに関して常に正しくコンパイルされるはずです。さらに、バリアント型を設定して、.NET がSystem.IntPtr キャストせずにマップするようにする必要があります。(実際のアセンブリの場合、コードを変更することはできず、コードをラップしたくないためです。これにより、大幅な複雑さが追加されます。)
- .NET は
System.IntPtrを として後方に転送し、前方VT_INTに をマップしSystem.Int32ます。 VT_I8にマップしますSystem.Int64が、ではありませんSystem.IntPtr。
では、どのVARENUMフラグが ? を指定しSystem.IntPtrますか?