在C ++中,有没有一种方法可以实现适用于多个级别的函数调用的协程?

问题描述

我正在用C ++编写一个在另一个可执行文件之上运行的DLL。对于所有密集目的,可以考虑将DLL 成为应用程序。调用DLL的主应用程序中包含大量库,这些库对于在DLL中使用很有用(超过1000个功能!)。如果我不使用这些库,那么拥有这种架构的理由将有0个,因此能够将它们称为 很大

这里的独特之处在于主应用程序不是C ++,并且不允许获取函数指针-实际上,您无法在挖掘原始内存中获取它们(这不是一个好主意) 。因此,DLL无法以任何传统方式调用这些函数。只有主可执行文件才能访问该库。我希望能够在DLL中调用它们,或者至少执行通过某种回调系统在DLL中可调用它们的难以区分的幻想。

问题是,如果我想使用立即需要返回值的函数。我需要一种以某种方式从DLL函数返回到主应用程序调用者的方法,然后再跳回到应用程序所在的位置,以使DLL“调用”该函数将无法辨别它是否只是调用一个函数并获得一个返回值。我希望它是一种可以快速应用于许多函数并且不需要任何函数指针“挖掘”的方法。可以使用具有不同功能指针的不同版本来构建主应用程序,如果将来的开发人员希望迁移到较新的编译器,我希望DLL能够相互兼容。我不在乎DLL编译器是否已锁定到特定的编译器版本。

为了做到这一点,我希望从最初的dll函数进入一直到从该函数调用到所有的函数都被视为一个巨型协程。我希望能够从一个函数中“屈服”并立即退出dll函数,但是某种程度上我还可以留下一些东西,以便以后通过另一个专门用于恢复该函数调用堆栈的DLL函数调用返回。

如果根本不重要,我将使用“ GNU GCC COMPILER”使用code :: blocks 10.05。虽然我通常会选择 不是 “特定于编译器”的好的代码,但是如果这是我唯一的选择,我愿意接受仅适用于我的特定编译器的答案设置。

解决方法

鉴于我们正在处理DLL,可以肯定地说我们正在处理Windows。 Windows没有将DLL“返回”到可执行文件的真正概念。 Windows确实知道标准函数调用是如何工作的(WINAPI),但甚至不要求GetProcAddress中的函数是WINAPI调用。这就是外部接口上的功能,inline函数不需要遵守GetProcAddress的规则。实际上,Windows根本不需要完全从函数构建代码。有限状态编译器可能会发出使用跳转而不是调用的代码。

因此,这里的挑战是您的可执行文件具有任意的ABI,GCC具有其自己的ABI,并且两者完全不兼容。当您实现自己的“队列”机制时,您会发现很多。没有通用的机制。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...