亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

DirectoryEntry.MoveTo 異常:由 UnsafeNativeMethods

DirectoryEntry.MoveTo 異常:由 UnsafeNativeMethods

C#
慕森王 2022-06-19 16:48:38
System.DirectoryServices 包含類/方法DirectoryEntry.MoveTo(..)。唯一記錄的異常是InvalidOperationException如果目標 DirectoryEntry 不是容器。我希望會有各種其他潛在的例外情況,尤其是有權限的情況下。在引擎蓋下,.MoveTo()呼叫DirectoryEntry.ContainerObject.MoveHere(this.Path, newName);DirectoryEntry新的目標位置在哪里。哪個電話:internal class UnsafeNativeMethods{    [Guid("001677D0-FD16-11CE-ABC4-02608C9E7553")]    [InterfaceType(ComInterfaceType.InterfaceIsDual)]    [ComImport]    public interface IAdsContainer    {        [SuppressUnmanagedCodeSecurity]        [return: MarshalAs(UnmanagedType.Interface)]        object MoveHere([MarshalAs(UnmanagedType.BStr), In] string sourceName, [MarshalAs(UnmanagedType.BStr), In] string newName);        ...    }    ...}有問題的 GUID 是指activeds.tlb類型庫。該庫定義IADsContainer.MoveHere為[id(0x00000009)]HRESULT MoveHere(                [in] BSTR SourceName,                 [in] BSTR NewName,                 [out, retval] IDispatch** ppObject);斷開連接是 activeds.dll 返回一個 HRESULT,并通過 out 參數給調用者一個指向該對象的指針。但是 .NET 包裝器具有不同的簽名,并且沒有 HRESULT。兩個問題:UnsafeNativeMethods.IAdsContainer.MoveHere 如何映射到具有不同簽名的 COM 接口?HRESULT 發生了什么?關于#2...如果中間有一個對象調用 MoveHere 的 HRESULT 版本,則該對象可能會檢查結果并引發異?;蚍祷厮鼘嵗?IAdsContainer。但我不知道中間可能是什么對象,.NET 框架代碼和 .tlb 文件都沒有給我任何線索。它拋出的任何異常都沒有記錄。
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

它采用最后一個參數[out, retval] IDispatch** ppObject并將其作為返回值,并解釋返回的 HRESULT 并COMException在需要時拋出一個。我只是還沒有看到執行此操作的實際代碼。

我懷疑正是這個[ComImport]屬性告訴.NET 以不同的方式對待它。

事實上,源代碼確實顯示了由于該屬性而進行的一些特殊處理,盡管我不會假裝我完全理解發生了什么。

例如,采取GetCustomMarshaledCOMObject方法。當它返回時,它會調用GetIUnknown并執行一些特殊的魔法false

GetIUnknown方法專門檢查ComImportAttribute并返回false是否存在。

甚至調用的方法也GetCustomMarshaledCOMObject說:

// Check for COMObject & do some special custom marshaling


查看完整回答
反對 回復 2022-06-19
  • 1 回答
  • 0 關注
  • 211 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號