從 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 :
Calling Convention
而 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 :
- 字串的處理記得在 DllImport 中設定 CharSet 的參數,否則 ANSI 與 UNICODE 未設定正確將產生錯誤
- 偵錯工具類型要設為 "混合",否則在 Managed Project 中無法偵錯 Unmanaged code
- 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 餘同上 |
留言