当前位置: 首页 > news >正文

【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互

文章目录

    • 1. Lua 调用 C++ DLL 的机制
      • 入口与注册
        • entry.lua
      • DLL 导出接口
        • `onSimulationStart`代码
        • `onSimulationFrame`代码
        • `setUnitsData`代码
      • 生命周期与回调
        • `onSimulationStart`代码
        • `onSimulationFrame`代码
        • `onSimulationStop`代码
        • `coreInit`代码
        • `coreFrame`代码
        • `coreDeinit`代码
    • 2. DLL 与 DCS World 的交互
      • Lua State 共享
        • 示例
      • 数据交互方式
        • dcstools.cpp
      • 线程与同步
    • 3. 典型流程举例
    • 4. 总结



1. Lua 调用 C++ DLL 的机制

入口与注册

  • 在 DCS World 的 Mods 目录下,Olympus 以插件形式加载,Lua 脚本(如 entry.lua)声明插件并初始化。
  • 主要 Lua 脚本(如 OlympusCommand.lua)负责加载 DLL,并通过 require("olympus")package.loadlib 方式调用 C++ 导出的 Lua C API。
entry.lua
local self_ID = "DCS-Olympus"declare_plugin(self_ID,
{image		 = "Olympus.png",installed	 = true, -- if false that will be place holder , or advertisingdirName		 = current_mod_path,binaries	 ={
--		'Olympus',},load_immediately = true,displayName	 = "Olympus",shortName	 = "Olympus",fileMenuName = "Olympus",version		 = "{{OLYMPUS_VERSION_NUMBER}}",state		 = "installed",developerName= "DCS Refugees 767 squadron",info		 = _("DCS Olympus is a mod for DCS World. It allows users to spawn, control, task, group, and remove units from a DCS World server using a real-time map interface, similarly to Real Time Strategy games. The user interface also provides useful informations units, like loadouts, fuel, tasking, and so on. In the future, more features for DCS World GCI and JTAC will be available."),Skins	={{name	= "Olympus",dir		= "Theme"},},Options ={{name		= "Olympus",nameId		= "Olympus",dir			= "Options",CLSID		= "{Olympus-options}"},},
})plugin_done()

DLL 导出接口

  • C++ 侧通过 extern "C" DllExport int luaopen_olympus(lua_State *L) 导出模块初始化函数,供 Lua 加载。
  • 在 olympus.cpp 中,注册了一系列 Lua 可调用的 C 函数(如 onSimulationStartonSimulationFramesetUnitsData 等),这些函数会被 Lua 脚本直接调用。
onSimulationStart代码
//olympus.cppstatic int onSimulationStart(lua_State* L)
{LogInfo(L, "Trying to load core.dll from " + modPath);SetDllDirectoryA(modPath.c_str());setLogDirectory(modPath);log("onSimulationStart callback called successfully");string dllLocation = modPath + "\\core.dll";log("Loading core.dll");hGetProcIDDLL = LoadLibrary(to_wstring(dllLocation).c_str());if (!hGetProcIDDLL) {LogError(L, "Error loading core DLL");goto error;}log("Core DLL loaded successfully");coreInit = (f_coreInit)GetProcAddress(hGetProcIDDLL, "coreInit");if (!coreInit) {LogError(L, "Error getting coreInit ProcAddress from DLL");goto error;}coreDeinit = (f_coreDeinit)GetProcAddress(hGetProcIDDLL, "coreDeinit");if (!coreDeinit){LogError(L, "Error getting coreDeinit ProcAddress from DLL");goto error;}coreFrame = (f_coreFrame)GetProcAddress(hGetProcIDDLL, "coreFrame");if (!coreFrame) {LogError(L, "Error getting coreFrame ProcAddress from DLL");goto error;}coreUnitsData = (f_coreUnitsData)GetProcAddress(hGetProcIDDLL, "coreUnitsData");if (!coreUnitsData){LogError(L, "Error getting coreUnitsData ProcAddress from DLL");goto error;}coreWeaponsData = (f_coreWeaponsData)GetProcAddress(hGetProcIDDLL, "coreWeaponsData");if (!coreWeaponsData){LogError(L, "Error getting coreWeaponsData ProcAddress from DLL");goto error;}coreMissionData = (f_coreMissionData)GetProcAddress(hGetProcIDDLL, "coreMissionData");if (!coreMissionData){LogError(L, "Error getting coreMissionData ProcAddress from DLL");goto error;}coreDrawingsData = (f_coreDrawingsData)GetProcAddress(hGetProcIDDLL, "coreDrawingsData");if (!coreDrawingsData){LogError
http://www.lqws.cn/news/463789.html

相关文章:

  • LeetCode第279题_完全平方数
  • Vue3 的生命周期:从 Composition API 视角看
  • DeepEP开源MoE模型分布式通信库
  • Linux运维新人自用笔记(Ubuntu磁盘命名规则、新磁盘分区、主流文件系统类型、mkfs命令格式化文件系统、临时和永久挂载、挂载报错、dd指令)
  • 2.7 Python方法调用机制解析:从描述符到字节码执行
  • 5.2 Qt Creator 使用FFmpeg库
  • win环境使用openssl创建p12证书
  • 微前端MFE:(React 与 Angular)框架之间的通信方式
  • word-spacing 属性
  • Kubernetes控制平面组件:Kubelet详解(八):容器存储接口 CSI
  • C++链表的虚拟头节点
  • 课程目录:腾讯混元3D × Unity3D全流程开发
  • Python pytesseract【OCR引擎库】 简介
  • 【JVM|内存结构】第一天
  • 【论文笔记】【强化微调】TinyLLaVA-Video-R1:小参数模型也能视频推理
  • Spring-MyBatis基本操作
  • linux weston flutter remote desktop
  • 2025年- H83-Lc191--139.单词拆分(动态规划)--Java版
  • JF - 600MT称重变送器与Modbus TCP转Profibus DP网关通讯案例
  • MCPServer编程与CLINE配置调用MCP
  • 项目练习:Jaspersoft Studio制作PDF报表时,detail和column footer之间存在很大的空白区
  • SkyWalking探针技术监控Spring Boot微服务——部署与应用详解
  • Laravel 项目中图片上传后无法访问的问题
  • 进程间通信——管道
  • 【Qt开发】网络运用
  • “氢键本征型材料 + 柔性电容应变片”方案分析
  • NW849NX721美光固态闪存NX745NX751
  • C++中的指针与引用
  • ProtoBuf:proto3 语法详解
  • 三甲医院AI医疗样本数据集分类与收集全流程节点分析(下)