91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么聲明一個COM接口

發布時間:2021-07-08 14:59:34 來源:億速云 閱讀:238 作者:Leah 欄目:編程語言

這篇文章給大家介紹C#中怎么聲明一個COM接口,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

COM 接口在 C# 中表示為具有 ComImport 和 Guid 屬性的接口。它不能在其基接口列表中包含任何接口,而且必須按照方法在 COM 接口中出現的順序聲明接口成員函數。

C#聲明COM接口必須包含其基接口的所有成員的聲明,IUnknown 和 IDispatch 的成員除外(.NET 框架將自動添加這些成員)。從 IDispatch 派生的 COM 接口必須用 InterfaceType 屬性予以標記。

從 C# 代碼調用 COM 接口方法時,公共語言運行庫必須封送與 COM 對象之間傳遞的參數和返回值。對于每個 .NET 框架類型均有一個默認類型,公共語言運行庫將使用此默認類型在 COM 調用間進行封送處理時封送。例如,C# 字符串值的默認封送處理是封送到本機類型 LPTSTR(指向 TCHAR 字符緩沖區的指針)。可以在C#聲明COM接口中使用 MarshalAs 屬性重寫默認封送處理。

在 COM 中,返回成功或失敗的常用方法是返回一個 HRESULT,并在 MIDL 中有一個標記為"retval"、用于方法的實際返回值的 out 參數。在 C#(和 .NET 框架)中,指示已經發生錯誤的標準方法是引發異常。

默認情況下,.NET 框架為由其調用的 COM 接口方法在兩種異常處理類型之間提供自動映射。返回值更改為標記為 retval 的參數的簽名(如果方法沒有標記為 retval 的參數,則為 void)。標記為 retval 的參數從方法的參數列表中剝離。任何非成功返回值都將導致引發 System.COMException 異常。此示例顯示用 MIDL 聲明的 COM 接口以及用 C# 聲明的同一接口(注意這些方法使用 COM 錯誤處理方法)。

下面是一個使用C# 映射媒體播放機COM 對象的程序。

  1. using System;  

  2. using System.Runtime.InteropServices;  

  3. namespace QuartzTypeLib  

  4. {  

  5. //聲明一個COM接口 IMediaControl,此接口來源于媒體播放機COM類  

  6. [Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"),  

  7. InterfaceType(ComInterfaceType.InterfaceIsDual)]  

  8. interface IMediaControl  

  9. { //列出接口成員  

  10. void Run();  

  11. void Pause();  

  12. void Stop();  

  13. void GetState( [In] int msTimeout, [Out] out int pfs);  

  14. void RenderFile(  

  15. [In, MarshalAs(UnmanagedType.BStr)] string strFilename);  

  16. void AddSourceFilter(  

  17. [In, MarshalAs(UnmanagedType.BStr)] string strFilename,  

  18. [Out, MarshalAs(UnmanagedType.Interface)]  

  19. out object ppUnk);  

  20. [return: MarshalAs(UnmanagedType.Interface)]  

  21. object FilterCollection();  

  22. [return: MarshalAs(UnmanagedType.Interface)]  

  23. object RegFilterCollection();  

  24. void StopWhenReady();  

  25. }  

  26. //聲明一個COM類:  

  27. [ComImport, Guid("E436EBB3-524F-11CE-9F53-0020AF0BA770")]  

  28. class FilgraphManager //此類不能再繼承其它基類或接口  

  29. {  

  30. //這里不能有任何代碼 ,系統自動增加一個缺省的構造函數  

  31. }  

  32. }  

  33. class MainClass  

  34. {  

  35. public static void Main(string[] args)  

  36. {  

  37. //命令行參數:  

  38. if (args.Length != 1)  

  39. {  

  40. DisplayUsage();  

  41. return;  

  42. }  

  43. String filename = args[0];  

  44. if (filename.Equals("/?"))  

  45. {  

  46. DisplayUsage();  

  47. return;  

  48. }  

  49. // 聲明FilgraphManager的實類對象:  

  50. QuartzTypeLib.FilgraphManager graphManager =new QuartzTypeLib.FilgraphManager();  

  51. //聲明IMediaControl的實類對象::  

  52. QuartzTypeLib.IMediaControl mc =(QuartzTypeLib.IMediaControl)graphManager;  

  53. // 調用COM的方法:  

  54. mc.RenderFile(filename);  

  55. //運行文件.  

  56. mc.Run();  

  57. //暫借停.  

  58. Console.WriteLine("Press Enter to continue.");  

  59. Console.ReadLine();  

  60. }  

  61. private static void DisplayUsage()  

  62. { // 顯示  

  63. Console.WriteLine("媒體播放機: 播放 AVI 文件.");  

  64. Console.WriteLine("使用方法: VIDEOPLAYER.EXE 文件名");  

  65. }  

  66. }  

  67. 運行示例:  

  68. 若要顯示影片示例 Clock.avi,請使用以下命令:  

  69. interop2 %windir%\clock.avi  

  70. 這將在屏幕上顯示影片,直到按 ENTER 鍵停止。  

  71. 在 .NET 框架程序中通過DllImport使用 Win32 API  

  72. .NET 框架程序可以通過靜態 DLL 入口點的方式來訪問本機代碼庫。
    DllImport 屬性用于指定包含外部方法的實現的dll 位置  

  73. DllImport 屬性定義如下:  

  74. namespace System.Runtime.InteropServices  

  75. {  

  76. [AttributeUsage(AttributeTargets.Method)]  

  77. public class DllImportAttribute: System.Attribute  

  78. {  

  79. public DllImportAttribute(string dllName) {...}  

  80. public CallingConvention CallingConvention;  

  81. public CharSet CharSet;  

  82. public string EntryPoint;  

  83. public bool ExactSpelling;  

  84. public bool PreserveSig;  

  85. public bool SetLastError;  

  86. public string Value { get {...} }  

  87. }  

關于C#中怎么聲明一個COM接口就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳山县| 曲阜市| 通化县| 西青区| 中山市| 东城区| 德保县| 太原市| 怀集县| 北辰区| 江西省| 都匀市| 商河县| 江山市| 阳谷县| 丹棱县| 盐边县| 桐梓县| 望谟县| 吴堡县| 噶尔县| 当雄县| 全州县| 海口市| 蕲春县| 丰顺县| 承德市| 彭水| 五峰| 安顺市| 石狮市| 任丘市| 龙州县| 东港市| 百色市| 黄浦区| 林周县| 河间市| 于都县| 盈江县| 彭水|