程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 玩轉C++ 托管技術簡介

玩轉C++ 托管技術簡介

編輯:C++入門知識

上網baidu一下或google一下這個東東就有很多人在問這個問題,最近我也用到了這個,所以就留下來以備往後需要是可以查找。我想通過這個來作為C#調用windows APIs的出發點,在以後的隨筆當中介紹一下我現階段用到的一些APIs或非托管類庫。

在調用非托管DLL的APIs前,我們應該好好掌握一下DllImportAttribute,MSDN給出的定義為:可將該屬性應用於方法。DllImportAttribute 屬性提供對從非托管 DLL 導出的函數進行調用所必需的信息。作為最低要求,必須提供包含入口點的 DLL 的名稱。

  1.  1 using System;  
  2.  2 using System.Runtime.InteropServices;  
  3.  3 public delegate bool CallBack(int hwnd, int lParam);  
  4.  4 public class EnumReportApp {  
  5.  5 [DllImport("user32")]  
  6.  6 public static extern int EnumWindows(CallBack x, int y);  
  7.  7 public static void Main()  
  8.  8 {  
  9.  9 CallBack myCallBack = new CallBack(EnumReportApp.Report);  
  10. 10 EnumWindows(myCallBack, 0);  
  11. 11 }  
  12. 12 public static bool Report(int hwnd, int lParam) {  
  13. 13 Console.Write("窗口句柄為");  
  14. 14 Console.WriteLine(hwnd);  
  15. 15 return true;  
  16. 16 }  
  17. 17 } 

從上面的例子中我們可以看出,從Kernel32.dll中引入這個API,其中EntryPoint一看就知道是入口點,也就是DLL中的函數名稱。其實只要用過VC++的人都知道,Windows APIs中都提供兩個版本,一個是W,一個是A也就是Ansi和Unicode之分,現在一般都采用W,Unicode編程,但是.Net和win32交互的時候,默認是使用CharSet.Ansi來傳送。在 DllImportAttribute.ExactSpelling 字段為 true 時它是 Visual Basic .NET 中的默認值)。

平台調用將只搜索您指定的名稱。例如,如果指定 MessageBox,則平台調用將搜索 MessageBox,如果它找不到完全相同的拼寫則失敗。當 ExactSpelling 字段為 false它是 C++ 托管擴展和 C# 中的默認值),平台調用將首先搜索未處理的別名 (MessageBox),如果沒有找到未處理的別名,則將搜索已處理的名稱 (MessageBoxA)。

  • 對Visual C++ 2005編譯器進行學習研究
  • 無奈的C++的復雜性問題介紹說明
  • 闡述復雜的C++編程語言技巧說明
  • 技術人員對於C++語言編程技巧說明
  • 圖解C++語言進行編制技巧說明

我們可以通過創建一個代理,它帶有兩個參數hwnd和lparam,第一個參數是一個窗口句柄,第二個參數由應用程序定義,兩個參數均為整形。當這個回調函數返回一個非零值時,標示執行成功,零則暗示失敗,這個例子總是返回True值。以便持續枚舉。最後創建以代理對象(delegate),並把它作為一個參數傳遞給EnumWindows 函數,平台會自動地 把代理對象轉化成函數能夠識別的回調格式。

OK,如果熟悉了以上方方面面,基本上也能夠調用APIs了別忘了P/Invoke能夠幫上很大的忙,我們可以去wiki網站查詢我們所要的API:http://pinvoke.net。還需要說明的是很多例子等都來自MSDN和網上檢索得到的!!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved