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
ますか?