完成驅動程式的實作後,就可以開始撰寫動態連結函庫(DLL)。由於我們的應用程式會需要讀取環控晶片的數值,這次會用讀取CPU風扇轉速作為範例,所以我們會新增有關讀取CPU風扇轉速相關的函式。
開啟一個新的專案,C++/Windows/程式庫,選取動態連結程式庫(DLL)。
設定專案名稱為SioSdk。
建立完成後,對來源檔案點選右鍵,加入>新增項目。
之後跳出新增項目視窗,我們點選左下角顯示所有範本。
點選C++檔,新增SioSdk.cpp
。
建立完成後,對標頭檔點選右鍵,加入>新增項目,新增SioSdk.h
。
將下列加入SioSdk.h
include <stdio.h>
include <stdlib.h>
include <Shlwapi.h>
include <strsafe.h>
pragma warning(disable:4201) // nameless struct/union
include <winioctl.h>
pragma warning(default:4201)
include <cfgmgr32.h>
include <initguid.h>
pragma once
ifdef SIOSDK_EXPORTS
define SIO_API __declspec(dllexport)
else
define SIO_API __declspec(dllimport)
endif
define SVCNAME TEXT("SIOACC")
define DEVICE_NAME TEXT("\\\\.\\SIOACC")
define INDEX_PORT 0x2E
define DATA_PORT 0x2F
define SEC_INDEX_PORT 0x4E
define SEC_DATA_PORT 0x4F
define ENTER_CONFIG 0x87
define EXIT_CONFIG 0xAA
define LDN_SEL 0x07
define LDN_HWM 0x0B
define BASE1_LO 0x61
define BASE1_HI 0x60
define HWM_BANK_NO 0x4E
define IOCTL_CUSTOM_READ_IO_COMMAND CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
define IOCTL_CUSTOM_WRITE_IO_COMMAND CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
ypedef struct _IO_PORT_INPUT {
ULONG PortNumber;
union _IO_PORT_DATA {
ULONG LongData;
USHORT ShortData;
UCHAR CharData;
} IoPortData;
IO_PORT_INPUT;
xtern "C"
SIO_API HANDLE hDevice;
SIO_API bool Install();
SIO_API bool Open();
SIO_API bool Close();
SIO_API unsigned int GetCpuFanSpeed();
``
如同之前的實作,宣告環控晶片相關的I/O地址、裝置名稱、I/O control code及傳遞埠號跟寫入資料的結構。
在標頭檔上方有宣告`__declspec(dllexport)`和`__declspec(dllimport)`,用`SIOSDK_EXPORTS`作為判斷條件,在使用Visual Studio的專案範本時,Visaul Studio會新增`<PROJECTNAME>_EXPORTS`至**C/C++**>**前置處理器定義**中,在本次的專案中為`SIOSDK_EXPORTS`。
![](https://raw.githubusercontent.com/papa12804/pics/master/DLL-7.png)
`SIOSDK_EXPORTS`的定義主要是用來區分`__declspec(dllexport)`和`__declspec(dllimport)`,**使標頭檔能讓動態連結函庫及應用程式共用**。當在編譯動態連結函庫時會使用`__declspec(dllexport)`,就可以將函式匯出,而當應用程式使用這個標頭檔時,就會轉換成`__declspec(dllimport)`,匯入這些函式。
今天簡單介紹了動態連結函庫專案的建立及標頭檔的內容,明天會接著介紹環控晶片Hardware Monitor的基礎知識。
在 Visual Studio 中建立 C++ DLL
SioSdk - Repo