如何將一個空指針(又名:void*
或句柄)放入COM VARIANT
-類型中。包裝類_variant_t
將其錯誤地轉換爲布爾值。但我需要把它作爲指針,以便.NET的COM-Marshaller將它識別爲IntPtr
。如何將一個void *放入COM VARIANT中,以便通過COM-Interop將其作爲IntPtr編組爲.NET?
我讀過的其中一條線索是this one at MSDN Social。他們建議這樣一種解決方案:
VARIANTARG Arg;
VariantInit(&Arg);
V_VT(&Arg) = VT_INT;
V_INT(&Arg) = (int)m_hWnd;
這種解決方案的問題是,V_INT
(構件intVal
)是32 bit integer並迫使指針是32個的指針。換句話說:我無法傳輸64位指針。有沒有解決這個問題的方法?任何其他方式把它轉換爲64位整數?
我已經測試了一些代碼。因此,我使用.NET方法接收任何System.Object
並顯示其值和類型。
public static void TakePtr(object ptr)
{
Console.WriteLine("Received a " + ptr.GetType() + " with value " + ptr);
}
我VARIANT
由v.llVal = 0; v.byref = myPointer;
充滿了兼容性,因此它應該被編譯總是正確關於32/64位指針。另外我需要設置變體類型,以便.NET將它映射到System.IntPtr
而不需要鑄造。 (因爲對於真正的Assembly,我不能更改代碼,也不想包裝它,這會增加主要的複雜性。)。
- .NET傳送一個
System.IntPtr
向後作爲VT_INT
,其forewards MAPPS到System.Int32
。 VT_I8
mapps到System.Int64
但不是System.IntPtr
。
那麼VARENUM
標誌會指定System.IntPtr
?
簡單地傳遞值是一個部分問題,現在應該解決。 (我已經爲我的問題添加了解決方案。)另一方面,.NET沒有將它識別爲'System.IntPtr' *而沒有投射*的問題仍然存在。 –