昨天將動態連結函庫(DLL)編譯好之後,今天就來測試我們的動態連結函庫是否可用。要如何測試呢?今天會撰寫一個Windows Console Application來驗證動態連結函庫,會利用這個測試程式來示範如何將連結動態連結函庫到專案中,所使用的測試系統為B760 Pro RS/D4,此主機板使用的環控晶片為NCT6796D。
選擇C++/Windows/主控台,用主控台應用程式建立專案,專案名稱為TestApp。
Visual Studio會在來源檔案中自動產生出TestApp.cpp
,將以下程式碼複製至TestApp.cpp
中。
#include <iostream>
#include "SioSdk.h"
using namespace std;
int main()
{
bool result;
unsigned int Speed = 0;
result = Install();
if (result) {
result = Open();
if (result) {
Speed = GetCpuFanSpeed();
cout << "CPU Fan Speed " << Speed << endl;
}
else {
printf("Open file failed\n");
}
}
else {
printf("Install system file failed\n");
}
Close();
return 0;
}
接著我們需要到屬性內設定相關路徑及設定,首先至C/C++>一般>其他Include目錄
添加Day19所建立的動態連結函庫所在的目錄。
然後到連結器>一般>其他程式庫目錄,新增動態連結函庫的輸出目錄。
然後到連結器>輸入>其他相依性,新增SioSdk.lib。
設定完後就可以建置方案並按F5開始偵錯,但TestApp會產生錯誤如下:
經查詢後得知此錯誤碼為:
ERROR_ACCESS_DENIED
5 (0x5)
存取遭到拒絕。
因為我們的驅動程式為KMDF,需要使用管理者權限才能使用,要解決的話要到連結器>資訊清單檔>UAC執行層級,將其設定為requireAdministrator。
重新建置方案並偵錯,會彈出下列視窗,以管理者權限重新啟動Visual Studio。
重新啟動後再次偵錯,依舊產生錯誤並彈出錯誤訊息視窗如下:
此錯誤碼為:
ERROR_PATH_NOT_FOUND
3 (0x3)
系統找不到所指定的路徑。
因為動態連結函庫並沒有複製到TestApp輸出目錄中,需要到建置事件>建置後事件,把Day19建立的動態連結函庫複製到TestApp輸出目錄。
xcopy /y /d "..\..\SioSdk\$(IntDir)SioSdk.dll" "$(OutDir)"
再次建置方案並偵錯,還是會跳出錯誤訊息:
也是錯誤碼0x3,但這次是因為StartService
找不到驅動程式。由於之後是使用Electron來呈現應用程式,動態連結函庫會使用Electron的路徑去開啟驅動程式,所以要再到建置事件>建置後事件中添加下方指令,建立資料夾並把Day15產生的驅動程式複製到TestApp輸出目錄:
if not exist $(OutDir)resources\lib mkdir $(OutDir)resources\lib
xcopy /y /d "..\..\Sio\$(IntDir)Sio.sys" "$(OutDir)resources\lib"
偵錯啟動,測試程式有順利結束並讀取到CPU風扇的轉速並印出。
經過測試程式的驗證,我們所獨立出來的驅動程式與動態連結函庫可以正確讀取CPU風扇轉速,之後就可以進入到前端應用程式部分。
系統錯誤碼 (0-499) (WinError.h) - Win32 apps | Microsoft Learn
建立使用 DLL 的用戶端應用程式
TestApp - Repo