基于iSCSI的光存储软件架构设计 (Windows + Qt版本)

1. 整体架构概览 (Windows平台)

cpp 复制代码
┌─────────────────────────────────────────────────────────────┐
│                 Windows客户端层 (Initiator)                   │
│  ┌─────────────────────────────────────────────────────┐  │
│  │          Microsoft iSCSI Initiator Service           │  │
│  │          或StarWind iSCSI Initiator                  │  │
│  └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
                               │
                    iSCSI协议 (TCP/IP网络)
                               │
┌─────────────────────────────────────────────────────────────┐
│                Windows服务器层 (Qt应用程序)                   │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────────────────┐  │
│  │              Qt GUI主界面                            │  │
│  │      (状态监控,配置管理,手动控制)                   │  │
│  └─────────────────────────────────────────────────────┘  │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────────────────┐  │
│  │          iSCSI Target服务层 (Windows服务)            │  │
│  │          可选: StarWind Target或自定义服务           │  │
│  └─────────────────────────────────────────────────────┘  │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────────────────┐  │
│  │          光存储控制核心 (Qt/C++ DLL)                 │  │
│  │         (业务逻辑,设备控制,数据管理)               │  │
│  └─────────────────────────────────────────────────────┘  │
├─────────────────────────────────────────────────────────────┤
│  ┌────────────┐  ┌────────────┐  ┌──────────────┐      │
│  │ 激光器控制 │  │ 运动控制器 │  │  DMD控制     │      │
│  │  (NI-VISA, │  │  (NI-Motion│  │  (厂商SDK)   │      │
│  │   SDK)     │  │  或Galil)  │  │              │      │
│  └────────────┘  └────────────┘  └──────────────┘      │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────────────────┐  │
│  │             Windows硬件驱动层                        │  │
│  │     (厂商驱动,NI驱动,USB/PCIe接口)                 │  │
│  └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

2. Qt工程结构设计

cpp 复制代码
OpticalStorageSystem/
├── OpticalStorageSystem.pro          # Qt项目文件
├── src/
│   ├── main.cpp                      # 程序入口
│   ├── mainwindow/                   # 主窗口模块
│   │   ├── MainWindow.h/.cpp
│   │   ├── StatusMonitorWidget.h/.cpp
│   │   ├── ControlPanelWidget.h/.cpp
│   │   └── ConfigurationWidget.h/.cpp
│   ├── core/                         # 核心业务模块
│   │   ├── OpticalStorageCore.h/.cpp
│   │   ├── StorageManager.h/.cpp
│   │   └── ISCSIManager.h/.cpp
│   ├── hardware/                     # 硬件控制模块
│   │   ├── HardwareCoordinator.h/.cpp
│   │   ├── LaserController.h/.cpp
│   │   ├── MotionController.h/.cpp
│   │   ├── DMDController.h/.cpp
│   │   └── TemperatureController.h/.cpp
│   ├── services/                     # Windows服务模块
│   │   ├── ISCSIService.h/.cpp
│   │   ├── ServiceManager.h/.cpp
│   │   └── SystemTrayIcon.h/.cpp
│   ├── utils/                        # 工具模块
│   │   ├── Logger.h/.cpp
│   │   ├── ConfigManager.h/.cpp
│   │   ├── DataConverter.h/.cpp
│   │   └── ErrorHandler.h/.cpp
│   └── models/                       # 数据模型
│       ├── DeviceModel.h/.cpp
│       ├── StorageModel.h/.cpp
│       └── LogModel.h/.cpp
├── ui/                               # Qt Designer文件
│   ├── MainWindow.ui
│   ├── StatusMonitor.ui
│   ├── ControlPanel.ui
│   └── SettingsDialog.ui
├── resources/                        # 资源文件
│   ├── icons/
│   ├── styles/
│   └── translations/
├── libs/                             # 第三方库
│   ├── ni-visa/                      # NI-VISA库
│   ├── galil/                        # Galil运动控制库
│   └── dmd-sdk/                      # DMD厂商SDK
├── tests/                            # 测试模块
├── deployment/                       # 部署配置
│   ├── WindowsInstaller.nsi         # NSIS安装脚本
│   └── service-install.bat          # 服务安装脚本
└── docs/                             # 文档

3. Qt主程序架构

cpp 复制代码
// main.cpp - 程序入口
#include <QApplication>
#include <QStyleFactory>
#include <QSharedMemory>
#include <QMessageBox>
#include "MainWindow.h"
#include "SystemTrayIcon.h"
#include "ServiceManager.h"

int main(int argc, char *argv[])
{
    // 防止多实例运行
    QSharedMemory sharedMemory("OpticalStorageSystem");
    if (!sharedMemory.create(1)) {
        QMessageBox::critical(nullptr, "错误", "程序已在运行中!");
        return -1;
    }

    QApplication app(argc, argv);
    
    // 设置应用程序信息
    app.setApplicationName("光学存储系统");
    app.setApplicationVersion("1.0.0");
    app.setOrganizationName("YourCompany");
    
    // 设置样式
    app.setStyle(QStyleFactory::create("Fusion"));
    
    // 加载翻译文件
    QTranslator translator;
    translator.load(":/translations/zh_CN.qm");
    app.installTranslator(&translator);
    
    // 初始化日志系统
    Logger::instance().initialize();
    
    // 创建系统托盘图标
    SystemTrayIcon trayIcon;
    trayIcon.show();
    
    // 启动iSCSI服务
    ServiceManager::instance().startISCSIService();
    
    // 创建主窗口
    MainWindow mainWindow;
    
    // 如果是最小化启动,隐藏主窗口
    bool startMinimized = ConfigManager::instance().getStartMinimized();
    if (!startMinimized) {
        mainWindow.show();
    }
    
    return app.exec();
}

4. 主窗口设计

cpp 复制代码
// MainWindow.h - Qt主窗口类
#pragma once

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QTimer>
#include <QThread>
#include "OpticalStorageCore.h"
#include "HardwareCoordinator.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
private slots:
    void onHardwareStatusUpdated(const HardwareStatus& status);
    void onStorageOperationCompleted(const OperationResult& result);
    void onSystemError(const QString& error);
    
    void onStartWriteClicked();
    void onStartReadClicked();
    void onEmergencyStopClicked();
    void onConfigureHardwareClicked();
    
    void updateRealTimeStatus();
    void showSystemTrayMenu();
    
protected:
    void closeEvent(QCloseEvent *event) override;
    void changeEvent(QEvent *event) override;
    
private:
    Ui::MainWindow *ui;
    OpticalStorageCore* m_storageCore;
    HardwareCoordinator* m_hardwareCoordinator;
    QThread* m_workerThread;
    QTimer* m_statusTimer;
    QSystemTrayIcon* m_trayIcon;
    
    void setupUI();
    void setupConnections();
    void initializeHardware();
    void saveSettings();
    void loadSettings();
};

5. 硬件协调器 (Windows适配)

cpp 复制代码
// HardwareCoordinator.h - Windows硬件协调器
#pragma once

#include <QObject>
#include <Windows.h>
#include <visa.h>        // NI-VISA
#include "LaserController.h"
#include "MotionController.h"
#include "DMDController.h"

#ifdef USE_GALIL
#include "GalilController.h"  // Galil运动控制
#endif

#ifdef USE_NI_MOTION
#include "NIMotionController.h"  // NI运动控制
#endif

class HardwareCoordinator : public QObject
{
    Q_OBJECT
    
public:
    explicit HardwareCoordinator(QObject *parent = nullptr);
    ~HardwareCoordinator();
    
    enum HardwareVendor {
        Vendor_Thorlabs,
        Vendor_Coherent,
        Vendor_NI,
        Vendor_Galil,
        Vendor_TI_DMD
    };
    
    struct HardwareConfig {
        HardwareVendor laserVendor;
        HardwareVendor motionVendor;
        HardwareVendor dmdVendor;
        
        QString laserDeviceAddr;   // e.g., "USB0::0x1313::0x8088::M00345678::INSTR"
        QString motionDeviceAddr;  // e.g., "192.168.1.100" for Galil Ethernet
        QString dmdDeviceAddr;     // DMD设备地址
    };
    
public slots:
    bool initialize(const HardwareConfig& config);
    bool shutdown();
    
    bool startWriteOperation(const QByteArray& data, qint64 lba);
    bool startReadOperation(qint64 lba, qint64 size);
    
    bool calibrateSystem();
    bool runSelfTest();
    
signals:
    void hardwareStatusChanged(const QString& status);
    void operationProgress(int percent);
    void operationCompleted(bool success, const QString& message);
    void errorOccurred(const QString& error);
    
private slots:
    void handleLaserError(const QString& error);
    void handleMotionError(const QString& error);
    void handleDMDError(const QString& error);
    
private:
    // 硬件控制器实例
    LaserController* m_laserController;
    MotionController* m_motionController;
    DMDController* m_dmdController;
    
    // Windows特定
    HINSTANCE m_niVisaDll;      // NI-VISA DLL句柄
    HINSTANCE m_galilDll;       // Galil DLL句柄
    
    // 同步和线程安全
    QMutex m_hardwareMutex;
    QWaitCondition m_operationCondition;
    
    // 私有方法
    bool loadVendorLibraries();
    bool initializeNI_VISA();
    bool initializeGalilLibrary();
    
    bool coordinatedMove(const Position3D& target);
    bool executeWriteSequence(const WritePattern& pattern);
    bool verifyWriteOperation();
    
    // Windows服务控制
    bool startWindowsService(const QString& serviceName);
    bool stopWindowsService(const QString& serviceName);
};

6. iSCSI服务集成 (Windows)

cpp 复制代码
// ISCSIManager.h - Windows iSCSI管理器
#pragma once

#include <QObject>
#include <Windows.h>
#include <iscsidsc.h>  // Windows iSCSI Discovery API

class ISCSIManager : public QObject
{
    Q_OBJECT
    
public:
    ISCSIManager(QObject *parent = nullptr);
    ~ISCSIManager();
    
    enum TargetType {
        Type_Microsoft,
        Type_StarWind,
        Type_Custom
    };
    
    struct ISCSITargetConfig {
        QString targetName;
        QString targetAlias;
        QString initiatorName;
        QString ipAddress;
        int port;
        TargetType type;
        
        // 认证
        bool useCHAP;
        QString chapUsername;
        QString chapSecret;
        
        // 存储配置
        QString virtualDiskPath;
        qint64 diskSize;  // in bytes
    };
    
public slots:
    bool createTarget(const ISCSITargetConfig& config);
    bool deleteTarget(const QString& targetName);
    bool startTarget();
    bool stopTarget();
    
    QList<ISCSITargetConfig> listTargets() const;
    bool isTargetRunning(const QString& targetName) const;
    
private:
    // Windows iSCSI API
    bool setupMicrosoftTarget(const ISCSITargetConfig& config);
    bool setupStarWindTarget(const ISCSITargetConfig& config);
    
    // 虚拟磁盘管理
    bool createVirtualDisk(const QString& path, qint64 size);
    bool attachVirtualDisk(const QString& path);
    
    // 注册表操作 (Windows配置存储)
    bool saveToRegistry(const ISCSITargetConfig& config);
    bool loadFromRegistry(const QString& targetName, ISCSITargetConfig& config);
    
    // Windows服务管理
    SC_HANDLE openServiceManager();
    bool createService(const QString& serviceName, const QString& displayName, 
                      const QString& binaryPath);
    
private:
    QMap<QString, ISCSITargetConfig> m_targets;
    CRITICAL_SECTION m_criticalSection;  // Windows线程同步
};

7. 运动控制器实现 (Windows + Galil)

cpp 复制代码
// MotionController.cpp - Galil运动控制实现
#include "MotionController.h"
#include "Galil.h"  // Galil SDK

class GalilMotionController : public MotionController
{
public:
    GalilMotionController() : m_galil(nullptr), m_connectionType(Ethernet) {}
    
    bool initialize(const QString& address) override {
        // Galil库初始化
        GReturn rc = G_NO_ERROR;
        
        switch(m_connectionType) {
        case Ethernet:
            rc = GOpen(address.toUtf8().constData(), &m_galil);
            break;
        case Serial:
            rc = GOpen(QString("COM%1 -BAUD 19200").arg(address).toUtf8().constData(), &m_galil);
            break;
        case USB:
            rc = GOpen(address.toUtf8().constData(), &m_galil);
            break;
        }
        
        if (rc != G_NO_ERROR) {
            emit errorOccurred(QString("Galil初始化失败: %1").arg(rc));
            return false;
        }
        
        // 配置运动参数
        configureMotionParameters();
        return true;
    }
    
    bool moveTo(const Position3D& pos, double speed) override {
        if (!m_galil) return false;
        
        // 设置速度
        char cmd[256];
        sprintf(cmd, "SP %d,%d,%d", 
                static_cast<int>(speed),
                static_cast<int>(speed),
                static_cast<int>(speed));
        GCommand(m_galil, cmd, m_response, sizeof(m_response), nullptr);
        
        // 绝对移动
        sprintf(cmd, "PA %d,%d,%d",
                static_cast<int>(pos.x * 1000),  // 转换为微米
                static_cast<int>(pos.y * 1000),
                static_cast<int>(pos.z * 1000));
        
        GCommand(m_galil, cmd, m_response, sizeof(m_response), nullptr);
        
        // 开始运动
        GCommand(m_galil, "BG", m_response, sizeof(m_response), nullptr);
        
        // 等待运动完成
        return waitForMotionComplete();
    }
    
private:
    GALIL m_galil;
    char m_response[1024];
    ConnectionType m_connectionType;
    
    void configureMotionParameters() {
        // 设置加速度
        GCommand(m_galil, "AC 100000,100000,100000", nullptr, 0, nullptr);
        GCommand(m_galil, "DC 100000,100000,100000", nullptr, 0, nullptr);
        
        // 设置平滑
        GCommand(m_galil, "IT 0,0,0", nullptr, 0, nullptr);
        
        // 启用限位开关
        GCommand(m_galil, "CN 1", nullptr, 0, nullptr);
    }
    
    bool waitForMotionComplete() {
        // 检查运动状态
        char status;
        do {
            GCommand(m_galil, "MG _BG", &status, sizeof(status), nullptr);
            QThread::msleep(10);  // 避免CPU占用过高
        } while (status == '1');  // '1'表示运动进行中
        
        return true;
    }
};

8. Qt项目文件配置

cpp 复制代码
# OpticalStorageSystem.pro
QT       += core gui network concurrent serialport
QT       -= app_bundle

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17
CONFIG += console  # 保留控制台输出用于调试

# 启用RTTI和异常
CONFIG += exceptions rtti

# Windows特定配置
win32 {
    CONFIG += embed_manifest_exe
    RC_FILE = resources/version.rc
    
    # Windows SDK版本
    win32-msvc* {
        QMAKE_CXXFLAGS += /MP /EHsc /Zc:__cplusplus
        QMAKE_LFLAGS += /MANIFEST:NO
    }
}

TARGET = OpticalStorageSystem
TEMPLATE = app

# 源代码目录
SOURCES += \
    src/main.cpp \
    src/mainwindow/MainWindow.cpp \
    src/mainwindow/StatusMonitorWidget.cpp \
    src/mainwindow/ControlPanelWidget.cpp \
    src/mainwindow/ConfigurationWidget.cpp \
    src/core/OpticalStorageCore.cpp \
    src/core/StorageManager.cpp \
    src/core/ISCSIManager.cpp \
    src/hardware/HardwareCoordinator.cpp \
    src/hardware/LaserController.cpp \
    src/hardware/MotionController.cpp \
    src/hardware/DMDController.cpp \
    src/hardware/TemperatureController.cpp \
    src/services/ISCSIService.cpp \
    src/services/ServiceManager.cpp \
    src/services/SystemTrayIcon.cpp \
    src/utils/Logger.cpp \
    src/utils/ConfigManager.cpp \
    src/utils/DataConverter.cpp \
    src/utils/ErrorHandler.cpp \
    src/models/DeviceModel.cpp \
    src/models/StorageModel.cpp \
    src/models/LogModel.cpp

HEADERS += \
    src/mainwindow/MainWindow.h \
    src/mainwindow/StatusMonitorWidget.h \
    src/mainwindow/ControlPanelWidget.h \
    src/mainwindow/ConfigurationWidget.h \
    src/core/OpticalStorageCore.h \
    src/core/StorageManager.h \
    src/core/ISCSIManager.h \
    src/hardware/HardwareCoordinator.h \
    src/hardware/LaserController.h \
    src/hardware/MotionController.h \
    src/hardware/DMDController.h \
    src/hardware/TemperatureController.h \
    src/services/ISCSIService.h \
    src/services/ServiceManager.h \
    src/services/SystemTrayIcon.h \
    src/utils/Logger.h \
    src/utils/ConfigManager.h \
    src/utils/DataConverter.h \
    src/utils/ErrorHandler.h \
    src/models/DeviceModel.h \
    src/models/StorageModel.h \
    src/models/LogModel.h

FORMS += \
    ui/MainWindow.ui \
    ui/StatusMonitor.ui \
    ui/ControlPanel.ui \
    ui/SettingsDialog.ui

# 资源文件
RESOURCES += \
    resources/icons.qrc \
    resources/translations.qrc

# 第三方库配置
win32 {
    # NI-VISA库
    LIBS += -L$$PWD/libs/ni-visa -lvisa32
    
    # Galil库
    LIBS += -L$$PWD/libs/galil -lGalil
    
    # DMD SDK (例如TI DLP SDK)
    CONFIG(debug, debug|release) {
        LIBS += -L$$PWD/libs/dmd-sdk/debug -lDLPSDKd
    } else {
        LIBS += -L$$PWD/libs/dmd-sdk/release -lDLPSDK
    }
    
    # Windows SDK库
    LIBS += -ladvapi32 -lsetupapi -luser32 -lole32 -loleaut32
}

# 包含路径
INCLUDEPATH += $$PWD/src
INCLUDEPATH += $$PWD/libs/ni-visa/include
INCLUDEPATH += $$PWD/libs/galil/include
INCLUDEPATH += $$PWD/libs/dmd-sdk/include

# 输出目录
DESTDIR = $$PWD/bin
OBJECTS_DIR = $$PWD/build/obj
MOC_DIR = $$PWD/build/moc
RCC_DIR = $$PWD/build/rcc
UI_DIR = $$PWD/build/ui

# 安装目标
target.path = $$[QT_INSTALL_EXAMPLES]/OpticalStorageSystem
INSTALLS += target

9. Windows服务包装

cpp 复制代码
// ISCSIService.cpp - Windows服务实现
#include "ISCSIService.h"
#include <windows.h>
#include <tchar.h>

SERVICE_STATUS g_ServiceStatus = {0};
SERVICE_STATUS_HANDLE g_StatusHandle = NULL;
HANDLE g_ServiceStopEvent = INVALID_HANDLE_VALUE;

class ISCSIServicePrivate
{
public:
    static VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
    static VOID WINAPI ServiceCtrlHandler(DWORD CtrlCode);
    static DWORD WINAPI ServiceWorkerThread(LPVOID lpParam);
    
    static OpticalStorageCore* m_storageCore;
};

OpticalStorageCore* ISCSIServicePrivate::m_storageCore = nullptr;

bool ISCSIService::installService()
{
    SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
    if (!scm) return false;
    
    TCHAR servicePath[MAX_PATH];
    GetModuleFileName(NULL, servicePath, MAX_PATH);
    
    SC_HANDLE service = CreateService(
        scm,
        _T("OpticalStorageISCSI"),
        _T("Optical Storage iSCSI Service"),
        SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START,
        SERVICE_ERROR_NORMAL,
        servicePath,
        NULL, NULL, NULL, NULL, NULL);
    
    if (!service) {
        CloseServiceHandle(scm);
        return false;
    }
    
    // 设置服务描述
    SERVICE_DESCRIPTION sd = { 
        _T("Provides iSCSI target services for optical storage system") 
    };
    ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &sd);
    
    CloseServiceHandle(service);
    CloseServiceHandle(scm);
    
    return true;
}

bool ISCSIService::startService()
{
    SERVICE_TABLE_ENTRY ServiceTable[] = {
        { _T("OpticalStorageISCSI"), ISCSIServicePrivate::ServiceMain },
        { NULL, NULL }
    };
    
    return StartServiceCtrlDispatcher(ServiceTable) == TRUE;
}

VOID WINAPI ISCSIServicePrivate::ServiceMain(DWORD argc, LPTSTR *argv)
{
    g_StatusHandle = RegisterServiceCtrlHandler(
        _T("OpticalStorageISCSI"), 
        ServiceCtrlHandler);
    
    if (!g_StatusHandle) return;
    
    ZeroMemory(&g_ServiceStatus, sizeof(g_ServiceStatus));
    g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    g_ServiceStatus.dwWin32ExitCode = 0;
    g_ServiceStatus.dwServiceSpecificExitCode = 0;
    g_ServiceStatus.dwCheckPoint = 0;
    g_ServiceStatus.dwWaitHint = 0;
    
    SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
    
    // 创建停止事件
    g_ServiceStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (!g_ServiceStopEvent) {
        g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
        return;
    }
    
    // 初始化存储核心
    m_storageCore = new OpticalStorageCore();
    if (!m_storageCore->initialize()) {
        delete m_storageCore;
        g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
        return;
    }
    
    g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
    
    // 创建工作线程
    HANDLE hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL);
    
    // 等待停止事件
    WaitForSingleObject(g_ServiceStopEvent, INFINITE);
    
    // 清理
    CloseHandle(g_ServiceStopEvent);
    WaitForSingleObject(hThread, 30000);  // 等待30秒
    CloseHandle(hThread);
    
    delete m_storageCore;
    
    g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
}

10. 部署和安装脚本

cpp 复制代码
; OpticalStorageInstaller.nsi - NSIS安装脚本
!include "MUI2.nsh"
!include "x64.nsh"

Name "光学存储系统"
OutFile "OpticalStorageSystem_Setup.exe"
InstallDir "$PROGRAMFILES\OpticalStorageSystem"

; 请求管理员权限
RequestExecutionLevel admin

; 界面配置
!define MUI_ABORTWARNING
!define MUI_ICON "resources\installer.ico"
!define MUI_UNICON "resources\uninstaller.ico"

; 页面
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "SimpChinese"

Section "主程序" SecMain
    SectionIn RO
    
    SetOutPath $INSTDIR
    
    ; 主程序文件
    File "bin\OpticalStorageSystem.exe"
    File "bin\*.dll"
    
    ; 配置文件
    File "config\default.ini"
    
    ; 创建开始菜单快捷方式
    CreateDirectory "$SMPROGRAMS\光学存储系统"
    CreateShortCut "$SMPROGRAMS\光学存储系统\光学存储系统.lnk" "$INSTDIR\OpticalStorageSystem.exe"
    CreateShortCut "$DESKTOP\光学存储系统.lnk" "$INSTDIR\OpticalStorageSystem.exe"
    
    ; 写入注册表
    WriteRegStr HKLM "SOFTWARE\OpticalStorageSystem" "InstallPath" $INSTDIR
    WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpticalStorageSystem" \
        "DisplayName" "光学存储系统"
    WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpticalStorageSystem" \
        "UninstallString" '"$INSTDIR\uninstall.exe"'
    
    ; 创建卸载程序
    WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd

Section "iSCSI服务" SecService
    SetOutPath $INSTDIR
    
    ; 服务程序
    File "bin\OpticalStorageService.exe"
    
    ; 安装服务
    ExecWait '"$INSTDIR\OpticalStorageService.exe" install'
    
    ; 启动服务
    ExecWait 'net start OpticalStorageISCSI'
SectionEnd

Section "设备驱动" SecDrivers
    SetOutPath "$INSTDIR\Drivers"
    
    ; NI-VISA驱动
    File "drivers\NI-VISA\*.exe"
    
    ; Galil驱动
    File "drivers\Galil\*.exe"
    
    ; 运行驱动安装
    ExecWait '"$INSTDIR\Drivers\NI-VISA_Runtime.exe" /q'
    ExecWait '"$INSTDIR\Drivers\GalilTools_Setup.exe" /S'
SectionEnd

Section "卸载"
    ; 停止并删除服务
    ExecWait 'net stop OpticalStorageISSCI'
    ExecWait 'sc delete OpticalStorageISSCI'
    
    ; 删除文件和目录
    RMDir /r $INSTDIR
    
    ; 删除开始菜单快捷方式
    Delete "$SMPROGRAMS\光学存储系统\光学存储系统.lnk"
    RMDir "$SMPROGRAMS\光学存储系统"
    Delete "$DESKTOP\光学存储系统.lnk"
    
    ; 删除注册表项
    DeleteRegKey HKLM "SOFTWARE\OpticalStorageSystem"
    DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpticalStorageSystem"
SectionEnd

Function .onInit
    ; 检查是否已安装
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpticalStorageSystem" "UninstallString"
    StrCmp $R0 "" done
    
    MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
        "光学存储系统已安装。$\n$\n点击'确定'卸载旧版本,或'取消'退出安装。" \
        IDOK uninst
    Abort
    
    uninst:
        ExecWait '$R0 _?=$INSTDIR'
    
    done:
FunctionEnd

11. 开发环境配置

11.1 必需软件

  1. Qt: 5.15+ (MSVC 2019 64-bit版本)

  2. Visual Studio: 2019或2022 (C++桌面开发工作负载)

  3. Windows SDK: 10.0.19041.0+

  4. 第三方SDK:

    • NI-VISA Runtime 20.0+

    • Galil Tools Suite

    • DMD厂商SDK (如TI DLP SDK)

  5. 构建工具: CMake 3.20+, NSIS 3.0+

11.2 配置步骤

cpp 复制代码
:: 开发环境设置脚本
@echo off
set QT_PATH=C:\Qt\5.15.2\msvc2019_64
set VS_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional
set NI_VISA_PATH=C:\Program Files\IVI Foundation\VISA

:: 设置环境变量
set PATH=%QT_PATH%\bin;%VS_PATH%\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64;%PATH%
set INCLUDE=%NI_VISA_PATH%\Include;%INCLUDE%
set LIB=%NI_VISA_PATH%\Lib\msc;%LIB%

:: 克隆项目
git clone https://github.com/yourcompany/OpticalStorageSystem.git
cd OpticalStorageSystem

:: 生成构建文件
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A x64 ..

:: 打开Visual Studio
start OpticalStorageSystem.sln

12. 测试策略

  1. 单元测试: Google Test + Qt Test

  2. 硬件模拟: 使用虚拟设备驱动进行无硬件测试

  3. 集成测试: 完整的读写循环测试

  4. 性能测试: 使用Windows Performance Monitor

  5. 兼容性测试: Windows 10/11, 不同硬件配置

这个架构充分考虑了Windows平台的特性,结合Qt框架的跨平台优势,同时针对光学存储设备的特殊需求进行了专门设计。系统可以作为Windows服务运行,也可以通过Qt GUI进行管理和监控。

相关推荐
ytttr8733 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
天远Date Lab3 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python
listhi5203 小时前
基于Gabor纹理特征与K-means聚类的图像分割(Matlab实现)
开发语言·matlab
qq_433776423 小时前
【无标题】
开发语言·php
Davina_yu4 小时前
Windows 下升级 R 语言至最新版
开发语言·windows·r语言
阿珊和她的猫4 小时前
IIFE:JavaScript 中的立即调用函数表达式
开发语言·javascript·状态模式
listhi5204 小时前
卷积码编码和维特比译码的MATLAB仿真程序
开发语言·matlab
yuan199974 小时前
基于主成分分析(PCA)的故障诊断MATLAB仿真
开发语言·matlab
J_liaty4 小时前
Java版本演进:从JDK 8到JDK 21的特性革命与对比分析
java·开发语言·jdk
翔云 OCR API5 小时前
发票查验接口详细接收参数说明-C#语言集成完整示例-API高效财税管理方案
开发语言·c#