Sooooo我正在写一个脚本解释器。基本上,我希望将一些类和函数存储在 DLL 中,但我希望 DLL 在链接到它的程序中查找函数,例如,
program dll
----------------------------------------------------
send code to dll-----> parse code
|
v
code contains a function,
that isn't contained in the DLL
|
list of functions in <------/
program
|
v
corresponding function,
user-defined in the
program--process the
passed argument here
|
\--------------> return value sent back
to the parsing function
我基本上想知道,如何使用 gcc 编译 DLL?嗯,我正在使用 gcc 的 Windows 端口。编译包含类和函数的 .dll 后,如何将其与我的程序链接到?如何使用DLL中的类和函数? DLL 可以从链接到它的程序中调用函数吗?如果我创建一个 class { ... } 对象;在DLL中,那么当程序加载DLL时,对象是否可供程序使用?提前致谢,我确实需要知道如何在 C++ 中使用 DLL,然后才能继续这个项目。
“您能否添加更多细节来说明为什么希望 DLL 调用主程序中的函数?”
我认为该图有点解释了...使用 DLL 的程序将一段代码传递给 DLL,DLL 解析代码,如果在所述代码中找到函数调用,则调用 DLL 中的相应函数...例如,如果我传递“a = sqrt(100)”,那么 DLL 解析器函数将找到对 sqrt() 的函数调用,并且在 DLL 中将有一个相应的 sqrt() 函数,该函数将计算参数的平方根传递给它,然后它会从该函数获取返回值并将其放入变量 a... 就像任何其他程序一样,但是如果在 DLL 中找不到 sqrt() 函数的相应处理程序(有将是本机支持的函数的列表),然后它将调用一个类似的函数,该函数将驻留在程序中,使用 DLL 来查看是否存在任何具有该名称的用户定义函数。
因此,假设您将 DLL 加载到程序中,使您的程序能够解释这种特定语言的脚本,程序可以调用 DLL 来处理单行代码或将脚本的文件名交给它来处理...但是如果您想要要在脚本中添加适合程序用途的命令,您可以在 DLL 中设置一个布尔值,告诉它您正在向其语言添加函数,然后在代码中创建一个函数,该函数将列出您正在使用的函数添加(DLL 会使用它想要的函数名称来调用它,如果该函数是代码中包含的用户定义函数,则该函数将使用 DLL 传递给它的参数调用相应的函数,返回将用户定义函数的返回值返回给 DLL,如果它不存在,则会返回错误代码或 NULL 等)。我开始发现我必须找到另一种方法来解决这个问题,以使函数调用仅以一种方式进行
这个链接 http://www.cygwin.com/cygwin-ug-net/dll.html解释了如何以基本方式进行操作。
从大的角度来看,当您创建 dll 时,您正在创建一个在运行时加载的库。它包含许多导出的符号。这些符号通常是对方法或函数以及编译器/链接器 goo 的引用。
当您通常构建静态库时,会有最少的 goo,链接器会拉入所需的代码并将其重新打包到可执行文件中。
在 dll 中,您实际上获得了两个最终产品(实际上是三个 - 只需等待):一个 dll 和一个存根库。存根是一个静态库,看起来与常规静态库完全相同,只不过每个存根不是执行代码,而是通常是到公共例程的跳转指令。通用例程加载您的 dll,获取您要调用的例程的地址,然后修补原始跳转指令以到达那里,这样当您再次调用它时,您最终会进入您的 dll。
第三个最终产品通常是一个头文件,它告诉您有关库中数据类型的所有信息。
因此,您的步骤是:创建标头和代码、构建 dll、从标头/代码/导出函数的一些列表构建存根库。结束代码将链接到存根库,该存根库将加载 dll 并修复跳转表。
编译器/链接器 goo 包括确保运行时库位于需要的位置、确保执行静态构造函数、确保注册静态析构函数以供以后执行等。
现在关于您的主要问题:如何在 dll 中编写可扩展代码?有多种可能的方法 - 典型的方法是定义一个纯抽象类(也称为接口),它定义一种行为,并将其传递给处理例程,或者创建一个例程来注册接口以执行工作,然后处理例程向注册器请求一个对象来为其处理一项工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)