当前位置: 首页 > 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

相关文章:

  • 最具有实际意义价值的比赛项目
  • 数据结构——函数填空题
  • 力扣网C语言编程题:多数元素
  • 【Linux仓库】进程概念与基本操作【进程·贰】
  • Python编程语言:2025年AI浪潮下的技术统治与学习红利
  • Laravel 项目中图片上传后无法访问的问题
  • RabbitMQ 的工作流程
  • Android NDK下载链接及配置版本
  • 微服务架构的适用
  • 深入浅出JavaScript 中的代理模式:用 Proxy 掌控对象的“行为开关”
  • CTF--PhP Web解题(走入CTF)
  • [C++] STL数据结构小结
  • access和excel用vba进行辅助办公软件开发
  • c++26新功能—hive容器
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 03(题目+回答)
  • WebeServer实现:学到了哪些东西
  • STM32F103_LL库+寄存器学习笔记12.3 - 串口DMA高效收发实战3:支持多实例化的版本
  • 如何在MacOS系统和Windows系统安装节点小宝远程工具
  • Java-52 深入浅出 Tomcat SSL工作原理 性能优化 参数配置 JVM优化
  • 爬虫获取数据:selenium的应用
  • 北京网站建设报价/产品推广的目的和意义
  • 忻州网站建设培训/seo培训学院官网
  • 建设网站各方面费用预算/西安自助建站
  • win2003做网站/百度一下马上知道
  • 最专业的微网站开发/今日头条军事新闻
  • 收废品做网站怎么做/凡客建站