在C#中單擊右鍵新增引用時彈出錯誤提示對話方塊
你這個不是託管dll,只有託管dll才可以通過右鍵-引用,如果是非託管dll(比如用c++,delphi等編寫的dll),需要用 [DllImport]引用
DllImport所在的名字空間 using System.Runtime.InteropServices;
MSDN中對DllImportAttribute的解釋是這樣的:可將該屬性應用於方法。DllImportAttribute 屬性提供對從非託管 DLL 匯出的函式進行呼叫所必需的資訊。作為最低要求,必須提供包含入口點的 DLL 的名稱。
DllImport 屬性定義如下:
namespace System.Runtime.InteropServices
{
[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
public DllImportAttribute(string dllName) {...}
public CallingConvention CallingConvention;
public CharSet CharSet;
public string EntryPoint;
public bool ExactSpelling;
public bool PreserveSig;
public bool SetLastError;
public string Value { get {...} }
}
}
說明:
1、DllImport只能放置在方法宣告上。
2、DllImport具有單個定位引數:指定包含被匯入方法的 dll 名稱的 dllName 引數。
3、DllImport具有五個命名引數:
a、CallingConvention 引數指示入口點的呼叫約定。如果未指定 CallingConvention,則使用預設值 CallingConvention.Winapi。
b、CharSet 引數指示用在入口點中的字符集。如果未指定 CharSet,則使用預設值 CharSet.Auto。
c、EntryPoint 引數給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。
d、ExactSpelling 引數指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用預設值 false。
e、PreserveSig 引數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT 返回值和該返回值的一個名為 retval 的附加輸出引數的簽名。如果未指定 PreserveSig,則使用預設值 true。
f、SetLastError 引數指示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用預設值 false。
4、它是一次性屬性類。
5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。
DllImport的用法:
DllImport("MyDllImport.dll")]
private static extern int mySum(int a,int b);
一 在C#程式設計中使用Win32類庫
常用對應型別:
1、DWORD 是 4 位元組的整數,因此我們可以使用 int 或 uint 作為 C# 對應型別。
2、bool 型別與 BOOL 對應。
示例一:呼叫 Beep() API 來發出聲音
Beep() 是在 kernel32.lib 中定義的,在MSDN 中的定義,Beep具有以下原型:
BOOL Beep(DWORD dwFreq, // 聲音訊率
DWORD dwDuration // 聲音持續時間);
用 C# 編寫以下原型:
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
示例二:列舉型別和常量
MessageBeep() 是在 user32.lib 中定義的,在MSDN 中的定義,MessageBeep具有以下原型:
BOOL MessageBeep(UINT uType // 聲音型別
);
用C#編寫一下原型:
public enum BeepType
{
SimpleBeep = -1,
IconAsterisk = 0x00000040,
IconExclamation = 0x00000030,
IconHand = 0x00000010,
IconQuestion = 0x00000020,
Ok = 0x00000000,
}
uType 引數實際上接受一組預先定義的常量,對於 uType 引數,使用 enum 型別是合乎情理的。
[DllImport("user32.dll")]
public static extern bool MessageBeep(BeepType beepType);
示例三:處理結構
有時我需要確定我筆記本的電池狀況。Win32 為此提供了電源管理函式,搜尋 MSDN 可以找到GetSystemPowerStatus() 函式。
BOOL GetSystemPowerStatus(
LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);
此函式包含指向某個結構的指標,我們尚未對此進行過處理。要處理結構,我們需要用 C# 定義結構。我們從非託管的定義開始:
typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
然後,通過用 C# 型別代替 C 型別來得到 C# 版本。
struct SystemPowerStatus
{
byte ACLineStatus;
byte batteryFlag;
byte batteryLifePercent;
byte reserved1;
int batteryLifeTime;
int batteryFullLifeTime;
}
這樣,就可以方便地編寫出 C# 原型:
[DllImport("kernel32.dll")]
public static extern bool GetSystemPowerStatus(
ref SystemPowerStatus systemPowerStatus);
在此原型中,我們用“ref”指明將傳遞結構指標而不是結構值。這是處理通過指標傳遞的結構的一般方法。
此函式執行良好,但是最好將 ACLineStatus 和 batteryFlag 欄位定義為 enum:
enum ACLineStatus: byte
{
Offline = 0,
Online = 1,
Unknown = 255,
}
enum BatteryFlag: byte
{
High = 1,
Low = 2,
Critical = 4,
Charging = 8,
NoSystemBattery = 128,
Unknown = 255,
}
請注意,由於結構的欄位是一些位元組,因此我們使用 byte 作為該 enum 的基本型別
相關文章
- javascript中的彈出對話方塊JavaScript
- MFC對話方塊新增選單欄並新增滑鼠單擊響應
- iOS專案開發實戰——彈出提示對話方塊iOS
- TWebBrowser禁止彈出Alert對話方塊Web
- JavaScript彈出儲存對話方塊JavaScript
- Java 中彈出對話方塊的幾種方式Java
- #在ios9及以上系統中建立對話方塊並彈出iOS
- c#中的模態對話方塊和非模態對話方塊C#
- Java在Swing中如何實現彈出一個對話方塊的效果?Java
- ASP.NET_頁面中彈出對話方塊幫助類ASP.NET
- 給應用程式加個彈出對話方塊
- Qt 對話方塊新增工具欄QT
- 實現對gridview刪除行時彈出確認對話方塊的一種簡單方法View
- 關於bootstrap彈出二級對話方塊的使用boot
- 直播平臺原始碼,簡單實現 彈出確認 取消對話方塊原始碼
- 在 Flutter 使用 GetX 對話方塊Flutter
- 直播視訊app原始碼,底部彈出的列表對話方塊APP原始碼
- 請問在java程式中如何調出“開啟方式”對話方塊?Java
- Delphi中點選網頁彈出的Alert對話方塊的確定按鈕網頁
- React中的模式對話方塊React模式
- 針對Ztree的右鍵彈出選單(jquery.popupSmallMenu.js)jQueryJS
- 常用元件 / 對話方塊及選單元件
- 右鍵選單中的文字文件新增快捷鍵
- C# MessageBox 訊息對話方塊C#
- js禁用滑鼠右鍵兵彈出提示例項程式碼JS
- 絕對精彩:在網頁裡做類似window右鍵的彈出式選單 (轉)網頁
- C#將自己的程式新增到右鍵選單C#
- Windows 配置新增右鍵選單 —— 在VSCode中開啟WindowsVSCode
- win10右鍵選單彈出方向怎麼自定義_win10如何自定義右鍵選單彈出方向Win10
- VUE:點選開啟的對話方塊外面時,對話方塊總是被關閉Vue
- 在Excel中設定當資料輸入錯誤時提示出錯信Excel
- 一對一直播app開發,自定義彈出對話方塊的樣式APP
- 原生js實現的點選彈出螢幕居中對話方塊效果JS
- Android 中的特殊攻擊面(一)——邪惡的對話方塊Android
- js如何防止自帶右鍵選單的彈出JS
- pageoffice6 版本線上開啟檔案彈出網頁對話方塊網頁
- 對話方塊函式函式
- 登入對話方塊