c – 使用gcc编译DLL

前端之家收集整理的这篇文章主要介绍了c – 使用gcc编译DLL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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调用函数吗?如果我创建一个类{…}对象;在DLL中,那么当DLL由程序加载时,程序会有对象可用吗?提前感谢,我真的需要知道如何使用C中的DLL,然后才能继续这个项目.

“你可以添加更多的细节,了解你为什么要让DLL在主程序中调用函数

我认为图解释了…程序使用DL​​L将一段代码传递给DLL,该DLL解析代码,如果在所述代码中找到函数调用,则DLL内的相应函数将被调用…例如,如果我通过“a = sqrt(100)”,则DLL解析器函数将找到对sqrt()的函数调用,并且在DLL内将是相应的sqrt()函数,它将计算参数的平方根传递给它,然后它将从该函数获取返回值,并将其放入变量a …就像任何其他程序一样,但如果在DLL中找不到sqrt()函数的相应处理程序(那里将是一个本地支持函数的列表),那么它将调用一个类似的函数,它将驻留在程序中使用DLL来查看是否有任何用户定义的函数.

因此,假设您将DLL加载到程序中,让程序能够解释这种特定语言的脚本,程序可以调用DLL来处理单行代码或者传递脚本的文件名来处理…但是如果你想要在脚本中添加一个符合程序目的的命令,您可以在DLL中设置一个布尔值,告诉您将其功能添加到其语言中,然后在代码中创建一个函数,该函数将列出您所执行的函数添加(DLL将使用它想要的函数名称调用它,如果该函数是您的代码中包含的用户定义的函数,该函数将使用DLL传递给它的参数调用相应的函数,返回将用户定义函数的返回值返回给DLL,如果不存在,则返回错误代码或NULL或某些东西).我开始看到,我将不得不找到另一种方式来使功能调用只有一种方式

解决方法

This link以基本的方式解释了如何做到这一点.

在大图片视图中,当您制作一个dll时,您正在制作一个在运行时加载的库.它包含导出的多个符号.这些符号通常是对方法函数的引用,以及编译器/链接器goo.

当您通常构建一个静态库时,至少有一个goo,并且链接器会将其所需的代码拉出来,然后在可执行文件中为您重新打包.

在一个dll里,你实际上得到两个最终产品(三个真的只是等待):一个dll和一个存根库.存根是一个静态库,它看起来像您的常规静态库,除了代替执行代码,每个存根通常是一个常用例程的跳转指令.常用的例程加载你的dll,获取你想要调用的例程的地址,然后修改原来的跳转指令去那里,所以当你再次调用它,你最终在你的dll.

第三个最终产品通常是一个头文件,它告诉你所有的库中的数据类型.

所以您的步骤是:创建头文件代码,构建一个dll,从头文件/代码/导出的函数列表构建存根库.结束代码链接到stub库,这将加载dll并修复跳转表.

编译器/链接器goo包括确保运行时库需要的地方,确保执行静态构造函数,确保静态析构函数注册以备以后执行等等.

现在关于你的主要问题:如何在dll中编写可扩展代码?有许多可能的方法 – 一种典型的方法是定义一个定义一个行为的纯抽象类(也称为接口),并将其传递给一个处理例程,或创建一个用于注册接口进行工作的例程,然后处理例行程序要求注册商处理一个对象的工作.

猜你在找的C&C++相关文章