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 必需软件
-
Qt: 5.15+ (MSVC 2019 64-bit版本)
-
Visual Studio: 2019或2022 (C++桌面开发工作负载)
-
Windows SDK: 10.0.19041.0+
-
第三方SDK:
-
NI-VISA Runtime 20.0+
-
Galil Tools Suite
-
DMD厂商SDK (如TI DLP SDK)
-
-
构建工具: 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. 测试策略
-
单元测试: Google Test + Qt Test
-
硬件模拟: 使用虚拟设备驱动进行无硬件测试
-
集成测试: 完整的读写循环测试
-
性能测试: 使用Windows Performance Monitor
-
兼容性测试: Windows 10/11, 不同硬件配置
这个架构充分考虑了Windows平台的特性,结合Qt框架的跨平台优势,同时针对光学存储设备的特殊需求进行了专门设计。系统可以作为Windows服务运行,也可以通过Qt GUI进行管理和监控。