覆盖 .dll 中的类/函数

发布于 2024-08-27 11:47:35 字数 203 浏览 7 评论 0原文

假设我有类 A 和类 B。B 继承自类 A,并实现了一些虚函数。唯一的问题是 B 是在 .dll 中定义的。现在,我有一个返回类 A 实例的函数,但它从 .dll 中返回类 B 实例的静态函数中检索该函数。我的计划是调用创建的对象,并希望具有这些函数在执行的 .dll 中,而不是在类 A 中定义的函数中。出于某种原因,我不断收到内存访问受限错误。有什么我不明白的事情会阻碍这个计划的实施吗?

Say I have class A and class B. B inherits from class A, and implements a few virtual functions. The only problem is that B is defined in a .dll. Right now, I have a function that returns an instance of class A, but it retrieves that from a static function in the .dll that returns an instance of class B. My plan is to call the created object, and hopefully, have the functions in the .dll executed instead of the functions defined in class A. For some reason, I keep getting restricted memory access errors. Is there something I don't understand that will keep this plan from working?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦里的微风 2024-09-03 11:47:35

C++ 类不能很好地跨越 DLL 边界。 DLL 和 EXE 需要使用完全相同的编译器和版本来构建——最好一起构建。这是因为类实现细节,例如 vtbl 布局/顺序以及某些标准库功能的实现(即 std::string 差异)是不可移植的。不同编译器的名称修改方案在编译器/版本之间也是不可使用的。唯一可以可靠地在 DLL 边界之外公开的接口是 C 接口。

因为我不知道这里的确切场景,所以我无法确定,但您可能正在跨 DLL 边界调用某种类型的未定义行为。

编辑:也有可能 DLL 在某个时刻被卸载,导致调用 B 中不存在的代码。

C++ classes do not cross DLL boundaries well. The DLL and the EXE need to be built with the exact same compiler and version -- preferably together. This is because class implementation specifics, like vtbl layout/order as well as implementations of some standard library features (i.e. std::string differences) are non portable. Different compilers' name-mangling schemes are also non potable between compilers/versions. The only interface you can reliably expose outside a DLL boundary is a C interface.

Because I don't know the exact scenario here I can't be sure, but you are probably invoking some type of undefined behavior across the DLL boundary.

EDIT: It's also possible that the DLL got unloaded at some point resulting to a call to nonexistent code in B.

违心° 2024-09-03 11:47:35

请参阅我关于此主题的其他广泛问题和解答 - 有帮助吗?
如何(可移植地)使用 C++ 类层次结构&动态链接库

See my other extensive question&answer on this subject - does it help?
How to work (portably) with C++ class hierarchies & dynamic linked libraries

心的憧憬 2024-09-03 11:47:35

您是否尝试使用 Visual Studio 调试器对其进行调试?

将调试器设置为捕获 win32 异常,方法是转到“调试”菜单 ->“异常”,然后选中 ThrownWin32 异常 旁边的复选框
现在使用 F5 激活您的 exe。崩溃应该提醒调试器,您应该能够看到访问冲突的确切位置。

Did you try debugging it with the Visual Studio debugger?

Set the debugger to catch win32 exceptions by going to Debug menu->Exceptions and mark the checkbox next to Win32 exceptions under Thrown
Now activate your exe using F5. The crash should alert the debugger and you should be able to see the exact location of the access violation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文