【问题标题】:How to add code in runtime如何在运行时添加代码
【发布时间】:2015-10-06 14:07:42
【问题描述】:

我正在搜索 stackoverflow 问题,但没有一个回答我的问题。我有一个游戏引擎,我想在运行时加载玩家 AI(用 C++ 编写)。

  1. 点击按钮,出现文件对话框
  2. 选择带有 AI 的文件(.dll 之类的?)
  3. 点击“开始”按钮,游戏开始使用我添加的 AI。

AI 可以是一个方法或整个类,没关系。我想我应该生成 .dll 但我不知道该怎么做。这个类应该是这样的:

class PlayerAI
{
    void computeSomething(list of argument, Object& output)
    {
        // some logic
    }
}

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    假设纯 Windows 平台,因为没有指定 -

    如果要注入 DLL,首先使用 LoadLibrary-function 获取它的句柄,如下所示:

    HINSTANCE handleLib; 
    handleLib = LoadLibrary(TEXT("YourDLL.dll")); 
    

    然后您可以获得指向 lib 中特定函数的函数指针。像这样:

    FUNC_PTR func;
    func = (FUNC_PTR) GetProcAddress(handleLib, "yourFunc");
    

    然后你可以像这样调用函数:

     (func) (L"TESTSTRING HERE"); 
    

    完成后,调用 FreeLibrary(libhandle)

    如何在 VS 中声明一个导出的函数是这样的(这需要在你预编译的 DLL 中标记你的函数:

    __declspec(dllexport) int __cdecl yourFunc(LPWSTR someString)
    {
       //Code here... 
    }
    

    【讨论】:

      【解决方案2】:

      由于您提到已编译的 DLL,因此您想查看 LoadLibraryGetProcAddress。这就是您在运行时加载 DLL 并从中提取特定函数的方式。

      示例可以在Using Run-Time Dynamic Linking下找到。

      【讨论】:

      • 注意:DLL 导出通常不适合 C++ 类。您可能希望使用与 C 兼容的接口(如果需要,可以在后台使用 C++ 类); C++ 的名称修改和 ABI 不太适合这个用例。
      • 如果问题以任何方式被标记为“Windows”,这肯定是赞成票。 This question / answer 处理计算世界的 POSIX 部分。
      • @DevSolar 你的意思是除了问题中的注释“.dll 什么的”?
      • @Angew:在 Linux 中:echo "int main() {}" > somefile.dll 哎呀!您可以为文件命名任何内容。 :P
      • @Angew:我不基于包含“或某事”的陈述进行假设。 ;-) 此外,总会有未来的访客需要考虑,他们最有可能根据问题标题来到这里。 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多