gpt4 book ai didi

c++ - 如何从主项目c++加载DLL

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:24 29 4
gpt4 key购买 nike

我创建了一个项目,它使用 2 个 DLL 相互对战(一个 DLL 是一个播放器)。游戏是第一个玩家选择一个数字,第二个玩家选择另一个数字,然后PlayRound函数比较两个数字。我的问题是不确定如何加载 DLL(运行/加载时间)。我创建了我的第一个 DLL (simple.dll),它有一个为简单起见总是返回“int 2”的 Pick 函数:

#include "stdafx.h"
#define ASEXPORT
#include <iostream>
#include "player.h"

using namespace std;

int Pick(int Round, int MyMoves[], int OpponentMoves[])
{
return 2;
}

这个项目有一个头文件(player.h),代码如下:

#ifndef ASEXPORT
#define DLLIMPORTOREXPORT dllimport
#else
#define DLLIMPORTOREXPORT dllexport
#endif

_declspec(DLLIMPORTOREXPORT) int Pick(int Round, int MyMoves[], int OpponentMoves[]);

不确定将此代码包含在何处,是将其包含在主函数中还是函数中:

    HINSTANCE hinstLib; 
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

//hinstLib = LoadLibrary(TEXT(player2Name));

hinstLib = LoadLibrary();
// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "simple.DLL");

// If the function address is valid, call the function.

if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}

// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}

// Report any failures
if (! fRunTimeLinkSuccess)
printf("Unable to load DLL or link to functions\n");
if (! fFreeResult)
printf("Unable to unload DLL\n");
//

我希望我说得容易理解

最佳答案

你可以在我的 ModuleService 中看到这个在 IndieZen 核心库中实现。我将 .dll 和 .so 视为“模块”。在我的插件系统中,我有一个标准,即每个模块实现一个且仅一个导出函数,在我的示例中是 getModule(),在您的用例中是 Pick()

我的示例在 I_Module 的实现中返回界面。在我的例子中,模块是插件的集合,所以你唯一能做的就是获得 I_Plugin 的实现。 ,它又可以用来访问类工厂,然后这些类工厂构造实现预定义接口(interface)(扩展点)的对象(扩展)。

我知道这对您的示例来说太过分了,但是代码很容易理解;随意复制/粘贴您可以使用的子集。

关键是不要在 Pick 函数上使用 _declspec(DLLIMPORTOREXPORT);你应该只导出函数而不是导入它。您也不应该将这些 DLL 链接到您的主应用程序,也不应该将 DLL 的头文件包含到您的主应用程序中。这将使您能够灵活地导入两个单独的 DLL,这些 DLL 公开相同的功能(在您的情况下为 Pick),而不会出现链接错误。它还将为您提供直到运行时才知道 DLL 名称的优势(您可能需要一些配置或 GUI 让用户选择哪些播放器)。

我的实现,带有引用计数、类工厂等,会给你带来额外的优势,因为你可以在同一个 DLL 中实现两个可以互相对战的玩家。

关于c++ - 如何从主项目c++加载DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485350/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com