從 WPF 呼叫 NVAPI & ADL

WPF 使用 C#,是屬於 Managed Code
NVAPI & ADL 是使用 C/C++,屬於 Unmanaged Code
所以必須透過橋樑來處理


第一步:

Using Unmanaged code and assembler in C# 知道 C# 可以透過 DllImport 來呼叫 DLL 中的 Function,不過糟糕的是 NVAPI 是採用 Static Lib Link,我們要使用的 Function 並沒有 Export 出來,因此折衷的辦法是在 NVAPI 外面再包一層 DLL,然後將我們需要的 Function Export 出來給 C# 呼叫 (先試著直接呼叫,等比較熟後看是包成自訂控制項或其它方式)

PS :
  1. 字串的處理記得在 DllImport 中設定 CharSet 的參數,否則 ANSI 與 UNICODE 未設定正確將產生錯誤
  2. 偵錯工具類型要設為 "混合",否則在 Managed Project 中無法偵錯 Unmanaged code
  3. NVAPI 採用 __cdecl、而 C# DllImport 預設是採用 __stdcall。我們的 DLL 是採用 Static Link 的方式呼叫 NVAPI,所以沒問題;但 C# 是用 Dynamic Link 方式呼叫 DLL,所以兩邊的 Calling Convention 必須一致,否則會產生堆疊錯誤。因此我們包的 DLL 要沿用 NVAPI 採用 __cdecl?還是配合 C# 採用 __stdcall 呢?暨然是 DLL,還是照慣例用 __stdcall 吧

    Calling Convention

    cdecl 參數由右到左放入堆疊、呼叫端清除 (C/C++) MFC
    stdcall 由右到左、自行清除 (Win32) DLL
    pascal 由左到右、自行清除 (VC++2.0 & Win16) Borland Delphi
    fastcall 由左到右、自行清除 (前三個參數 EAX, EDX, ECX 剩下才放 Stack)
    Microsoft fastcall ECX, EDX 餘同上

    留言

    這個網誌中的熱門文章

    Linux 批次檔的寫法

    【分享】如何顯示 Debug Message

    [分享] Visual Studio 遠端偵錯