iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

完成驅動程式的實作後,就可以開始撰寫動態連結函庫(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


上一篇
Day15 使用I/O存取環控晶片-5
下一篇
Day17 使用I/O存取環控晶片-7
系列文
Windows Driver + Electron 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言