C# 免註冊呼叫大漠外掛

zmxyzmxy1234發表於2022-04-07

免註冊呼叫大漠外掛,實際上是使用 dmreg.dll 來配合實現,這個檔案有 2 個匯出介面 SetDllPathWSetDllPathASetDllPathW 對應 unicode,SetDllPathA 對應 ascii 介面。

一、下載大漠外掛

下載地址:大漠外掛
解壓完成後,如下圖所示:

dmsoft

再解壓 dm.rar、大漠類庫生成工具.rar、免註冊.rar,解壓密碼為:1234

解壓完成後,如下圖所示:

dmsoft

二、生成大漠類庫#

開啟 大漠類庫生成工具 資料夾,如下圖所示:

大漠類庫生成工具

開啟 大漠類庫生成工具 v24.0.exe 檔案,如下圖所示:

大漠類庫生成工具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,如下圖所示:

DmSoftTestConsoleApp

dm.dlldm\7.2149 資料夾下,如下圖所示:

dm.dll

DmReg.dll免註冊\不註冊呼叫dm.dll的方法 v11.0 資料夾下,如下圖所示:

DmReg.dll

設定 dll 屬性 複製到輸出目錄始終複製

  1. 在 dm.dll 上單擊滑鼠右鍵,選擇 屬性
  2. 在屬性皮膚中,“複製到輸出目錄”選項,選擇“始終複製”;
  3. 在 DmReg.dll 也重複上面的操作。

始終複製到輸出目錄

3.2 引入大漠類庫#

在專案中建立 DmSoft 資料夾,用於放置大漠類庫。

將之前生成的大漠類庫(obj.cs)複製到專案中的 DmSoft 資料夾,並改名為 DmSoftCustomClassName(可以改名,也可以不改名,還可以改成任意名,你喜歡就好……),如下圖所示:

DmSoftTestConsoleApp

3.3 建立 Resources 資料夾#

在專案中建立 Resources 資料夾,用於放置大漠外掛使用到的資源,比如圖片、字型檔等,如下圖所示:

DmSoftTestConsoleApp

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 位的。

DmSoftTestConsoleApp

四、測試#

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

開啟 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# 免註冊呼叫大漠外掛的方法,解決方案的結構如下圖所示:

DmSoftTestConsoleApp

需要注意的地方有如下幾點

  1. 在 .NET Core 中 LoadLibrary 無法使用 64 位程式載入 32 位 dll。解決方法是將程式設定為 32 位的。
  2. dm.dll 和 DmReg.dll 需要設定為始終複製到輸出目錄
  3. 注意檢查 SetPath(path) 方法中的 path 是否存在,不存在就建立。
  4. 在 VS 中設定程式以管理員身份執行。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章