免註冊呼叫大漠外掛,實際上是使用 dmreg.dll 來配合實現,這個檔案有 2 個匯出介面 SetDllPathW
和 SetDllPathA
。 SetDllPathW
對應 unicode,SetDllPathA
對應 ascii 介面。
一、下載大漠外掛
下載地址:大漠外掛
解壓完成後,如下圖所示:
再解壓 dm.rar、大漠類庫生成工具.rar、免註冊.rar,解壓密碼為:1234
解壓完成後,如下圖所示:
二、生成大漠類庫#
開啟 大漠類庫生成工具 資料夾,如下圖所示:
開啟 大漠類庫生成工具 v24.0.exe 檔案,如下圖所示:
將 dm\7.2149\dm.dll
拖到 大漠類庫生成工具 裡面,如下圖所示:
類名選擇使用自定義類名,指定類名輸入 DmSoftCustomClassName(這裡只是示例,你可以輸入你喜歡的名字,如:abcde、aabbc、abab 等),如下圖所示:
點選生成按鈕,如下圖所示:
開啟 dm\7.2149\Output\C#
資料夾,可以看到生成的結果,如下圖所示:
生成的 obj.cs 即是使用在 C# 平臺下的類庫封裝,稍後在 C# 免註冊呼叫大漠外掛的示例中會用到。
三、建立控制檯應用程式#
我這裡建立的是 .NET Core 3.1 的控制檯應用程式,你也可以建立你喜歡的。
3.1 引入大漠外掛 dll#
在專案中建立 libs 資料夾,用於放置大漠外掛的 dll,如下圖所示:
dm.dll 在 dm\7.2149
資料夾下,如下圖所示:
DmReg.dll 在 免註冊\不註冊呼叫dm.dll的方法 v11.0
資料夾下,如下圖所示:
設定 dll 屬性 複製到輸出目錄 為 始終複製:
- 在 dm.dll 上單擊滑鼠右鍵,選擇 屬性;
- 在屬性皮膚中,“複製到輸出目錄”選項,選擇“始終複製”;
- 在 DmReg.dll 也重複上面的操作。
3.2 引入大漠類庫#
在專案中建立 DmSoft 資料夾,用於放置大漠類庫。
將之前生成的大漠類庫(obj.cs)複製到專案中的 DmSoft 資料夾,並改名為 DmSoftCustomClassName(可以改名,也可以不改名,還可以改成任意名,你喜歡就好……),如下圖所示:
3.3 建立 Resources 資料夾#
在專案中建立 Resources 資料夾,用於放置大漠外掛使用到的資源,比如圖片、字型檔等,如下圖所示:
3.4 建立大漠外掛配置類#
在專案中建立 Configs 資料夾,並在 Configs 中建立 DmConfig
類,用於設定大漠外掛用到的常量。
DmConfig.cs
namespace DmSoftTestConsoleApp.Configs
{
/// <summary>
/// 大漠外掛配置
/// </summary>
public class DmConfig
{
/// <summary>
/// 大漠外掛免註冊 DmReg.dll 路徑
/// </summary>
public const string DmRegDllPath = @"./libs/DmReg.dll";
/// <summary>
/// 大漠外掛 dm.dll 路徑
/// </summary>
public const string DmClassDllPath = @"./libs/dm.dll";
/// <summary>
/// 大漠外掛註冊碼
/// </summary>
public const string DmRegCode = "";
/// <summary>
/// 大漠外掛版本附加資訊
/// </summary>
public const string DmVerInfo = "";
/// <summary>
/// 大漠外掛全域性路徑,設定了此路徑後,所有介面呼叫中,相關的檔案都相對於此路徑. 比如圖片,字型檔等.
/// </summary>
public const string DmGlobalPath = @"./Resources";
}
}
```|
### 3.5 建立 C# 免註冊呼叫大漠外掛類
```C#
namespace DmSoftTestConsoleApp.Configs
{
/// <summary>
/// 大漠外掛配置
/// </summary>
public class DmConfig
{
/// <summary>
/// 大漠外掛免註冊 DmReg.dll 路徑
/// </summary>
public const string DmRegDllPath = @"./libs/DmReg.dll";
/// <summary>
/// 大漠外掛 dm.dll 路徑
/// </summary>
public const string DmClassDllPath = @"./libs/dm.dll";
/// <summary>
/// 大漠外掛註冊碼
/// </summary>
public const string DmRegCode = "";
/// <summary>
/// 大漠外掛版本附加資訊
/// </summary>
public const string DmVerInfo = "";
/// <summary>
/// 大漠外掛全域性路徑,設定了此路徑後,所有介面呼叫中,相關的檔案都相對於此路徑. 比如圖片,字型檔等.
/// </summary>
public const string DmGlobalPath = @"./Resources";
}
}
在 DmSoft 資料夾建立 RegisterDmSoft
類,用於實現 C# 免註冊呼叫大漠外掛。
RegisterDmSoft.cs
using System.Runtime.InteropServices;
using DmSoftTestConsoleApp.Configs;
namespace DmSoftTestConsoleApp.DmSoft
{
/// <summary>
/// 免註冊呼叫大漠外掛
/// </summary>
public static class RegisterDmSoft
{
// 不註冊呼叫大漠外掛,實際上是使用 dmreg.dll 來配合實現,這個檔案有 2 個匯出介面 SetDllPathW 和 SetDllPathA。 SetDllPathW 對應 unicode,SetDllPathA 對應 ascii 介面。
[DllImport(DmConfig.DmRegDllPath)]
private static extern int SetDllPathA(string path, int mode);
/// <summary>
/// 免註冊呼叫大漠外掛
/// </summary>
/// <returns></returns>
public static bool RegisterDmSoftDll()
{
var setDllPathResult = SetDllPathA(DmConfig.DmClassDllPath, 1);
if (setDllPathResult == 0)
{
// 載入 dm.dll 失敗
return false;
}
return true;
}
}
}
注意,在 .NET Core 中,無法使用 64 位程式載入 32 位 dll。解決方法是將程式設定為 32 位的。
四、測試#
4.1 測試 C# 免註冊呼叫大漠外掛#
在 Program
類中編寫測試程式碼。
Program.cs
using System;
using DmSoftTestConsoleApp.DmSoft;
namespace DmSoftTestConsoleApp
{
class Program
{
static void Main(string[] args)
{
if (Environment.Is64BitProcess)
{
Console.WriteLine("這是 64 位程式");
Console.WriteLine("按任意鍵結束程式");
Console.ReadKey();
return;
}
// 免註冊呼叫大漠外掛
var registerDmSoftDllResult = RegisterDmSoft.RegisterDmSoftDll();
Console.WriteLine($"免註冊呼叫大漠外掛返回:{registerDmSoftDllResult}");
Console.WriteLine("按任意鍵結束程式");
Console.ReadKey();
}
}
}
4.2 測試 Capture
方法#
修改 Program
類。
Program.cs
using System;
using System.IO;
using DmSoftTestConsoleApp.Configs;
using DmSoftTestConsoleApp.DmSoft;
namespace DmSoftTestConsoleApp
{
class Program
{
static void Main(string[] args)
{
if (Environment.Is64BitProcess)
{
Console.WriteLine("這是 64 位程式");
Console.WriteLine("按任意鍵結束程式");
Console.ReadKey();
return;
}
// 免註冊呼叫大漠外掛
var registerDmSoftDllResult = RegisterDmSoft.RegisterDmSoftDll();
Console.WriteLine($"免註冊呼叫大漠外掛返回:{registerDmSoftDllResult}");
if (!registerDmSoftDllResult)
{
throw new Exception("免註冊呼叫大漠外掛失敗");
}
// 建立物件
DmSoftCustomClassName dmSoft = new DmSoftCustomClassName();
// 收費註冊
var regResult = dmSoft.Reg(DmConfig.DmRegCode, DmConfig.DmVerInfo);
Console.WriteLine($"收費註冊返回:{regResult}");
if (regResult != 1)
{
throw new Exception("收費註冊失敗");
}
// 判斷 Resources 是否存在,不存在就建立
if (!Directory.Exists(DmConfig.DmGlobalPath))
{
Directory.CreateDirectory(DmConfig.DmGlobalPath);
}
// 設定全域性路徑,設定了此路徑後,所有介面呼叫中,相關的檔案都相對於此路徑. 比如圖片,字型檔等
dmSoft.SetPath(DmConfig.DmGlobalPath);
// 抓取指定區域(x1, y1, x2, y2)的影像,儲存為file(24位點陣圖)
var captureResult = dmSoft.Capture(0, 0, 2000, 2000, "screen.bmp");
Console.WriteLine($"Capture 返回:{captureResult}");
if (captureResult != 1)
{
throw new Exception("Capture 失敗");
}
Console.WriteLine("按任意鍵結束程式");
Console.ReadKey();
}
}
}
執行程式,dmSoft.Reg()
方法返回 -2
(程式沒有以管理員方式執行)。
五、在 VS 中設定程式以管理員身份執行#
新增應用程式清單檔案到專案中(專案 → 右鍵 → 新增 → 新建項 → 應用程式清單檔案),如下圖所示:
開啟 app.manifest 檔案,將 requestedExecutionLevel
元素的 level
屬性設定為 highestAvailable
。
也就是將
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
改為
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
按 F5 執行程式,VS 將提示“此任務要求應用程式具有提升的許可權。”,點選“使用其他憑據重新啟動(R)”,如下圖所示:
VS 重新啟動之後,按 F5 執行程式,screen.bmp 圖片儲存到 Resources 資料夾中。
六、原始碼地址#
原始碼地址:github.com/astrid9527/RegisterDmSo...
七、總結#
本文已經完整地介紹瞭如何使用 C# 免註冊呼叫大漠外掛的方法,解決方案的結構如下圖所示:
需要注意的地方有如下幾點
- 在 .NET Core 中
LoadLibrary
無法使用 64 位程式載入 32 位 dll。解決方法是將程式設定為 32 位的。 - dm.dll 和 DmReg.dll 需要設定為始終複製到輸出目錄。
- 注意檢查
SetPath(path)
方法中的path
是否存在,不存在就建立。 - 在 VS 中設定程式以管理員身份執行。
本作品採用《CC 協議》,轉載必須註明作者和本文連結