gpt4 book ai didi

c++ - 使用 getProcAddress 在导出的 DLL 函数中实例化一个类

转载 作者:行者123 更新时间:2023-11-30 01:22:17 33 4
gpt4 key购买 nike

我有以下 DLL 的 .h 代码,并使用 getProcAddress 在另一个代码中使用 DLL。

// MathFuncsDll.h

#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif

namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
public:
int x = 10;
MyMathFuncs();

// Returns a + b + x
MATHFUNCSDLL_API double Add(double a, double b);

};
}

对应的.cpp代码为

// MathFuncsDll.cpp : Defines the exported functions for the DLL application. 
//

#include "stdafx.h"
#include "MathFuncsDll.h"
#include <stdexcept>

using namespace std;

namespace MathFuncs
{
MyMathFuncs ::MyMathFuncs()
{
x = 10;
}

double MyMathFuncs::Add(double a, double b)
{
return a + b + x;
}

}

函数 Add 被导出,它将 a 和 b 与初始值 x = 10 相加。

我创建了一个相同的 DLL 文件并使用 LoadLibrary 和 GetProcAddress 调用函数。

当我不使用构造函数并直接添加 10 时代码工作正常,即 a + b + 10。但是当我执行 a + b + x 时它失败了,并且基本上没有调用构造函数。

如何使用 GetProcAddress 实例化此类对象,以便在加载 DLL 和调用函数时获得实例化的对象方法。

最佳答案

调用构造函数不是是自动的。当您使用 operator new 时,这通常由 C++ 编译器处理,但现在不再这样做了。您将必须使用 GetProcAddress() 来获取构造函数地址并调用它。

在你这样做之前,你必须为对象分配内存。您将谁的地址传递给构造函数。这是困难的地方,您不知道要分配多少内存。对于像这样的简单类,这是可以猜测的,但是当类具有虚拟方法或快速实现多重继承时,C++ 编译器应用的优化使得这不切实际。

这是与 C++ 互操作如此困难且其他语言运行时支持不佳的一个重要原因。唯一可靠的方法是同时导出一个类工厂函数,这是一个使用 new 运算符创建对象并返回指针的简单函数。现在还有一个销毁对象的问题,您需要某种内存管理器来确保 operator delete 的正确实现也被调用。通常通过引用计数完成,例如 std::shared_ptr<>。

总而言之,您将顺利地重新发明 COM。

关于c++ - 使用 getProcAddress 在导出的 DLL 函数中实例化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16664176/

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