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在主程序中调用函数?
我认为图解释了…程序使用DLL将一段代码传递给DLL,该DLL解析代码,如果在所述代码中找到函数调用,则DLL内的相应函数将被调用…例如,如果我通过“a = sqrt(100)”,则DLL解析器函数将找到对sqrt()的函数调用,并且在DLL内将是相应的sqrt()函数,它将计算参数的平方根传递给它,然后它将从该函数中获取返回值,并将其放入变量a …就像任何其他程序一样,但如果在DLL中找不到sqrt()函数的相应处理程序(那里将是一个本地支持的函数的列表),那么它将调用一个类似的函数,它将驻留在程序中使用DLL来查看是否有任何用户定义的函数.
因此,假设您将DLL加载到程序中,让程序能够解释这种特定语言的脚本,程序可以调用DLL来处理单行代码或者传递脚本的文件名来处理…但是如果你想要在脚本中添加一个符合程序目的的命令,您可以在DLL中设置一个布尔值,告诉您将其功能添加到其语言中,然后在代码中创建一个函数,该函数将列出您所执行的函数添加(DLL将使用它想要的函数的名称来调用它,如果该函数是您的代码中包含的用户定义的函数,该函数将使用DLL传递给它的参数调用相应的函数,返回将用户定义函数的返回值返回给DLL,如果不存在,则返回错误代码或NULL或某些东西).我开始看到,我将不得不找到另一种方式来使功能调用只有一种方式
解决方法
在大图片视图中,当您制作一个dll时,您正在制作一个在运行时加载的库.它包含导出的多个符号.这些符号通常是对方法或函数的引用,以及编译器/链接器goo.
当您通常构建一个静态库时,至少有一个goo,并且链接器会将其所需的代码拉出来,然后在可执行文件中为您重新打包.
在一个dll里,你实际上得到两个最终产品(三个真的只是等待):一个dll和一个存根库.存根是一个静态库,它看起来像您的常规静态库,除了代替执行代码,每个存根通常是一个常用例程的跳转指令.常用的例程加载你的dll,获取你想要调用的例程的地址,然后修改原来的跳转指令去那里,所以当你再次调用它,你最终在你的dll.
第三个最终产品通常是一个头文件,它告诉你所有的库中的数据类型.
所以您的步骤是:创建头文件和代码,构建一个dll,从头文件/代码/导出的函数列表构建存根库.结束代码将链接到stub库,这将加载dll并修复跳转表.
编译器/链接器goo包括确保运行时库需要的地方,确保执行静态构造函数,确保静态析构函数被注册以备以后执行等等.
现在关于你的主要问题:如何在dll中编写可扩展代码?有许多可能的方法 – 一种典型的方法是定义一个定义一个行为的纯抽象类(也称为接口),并将其传递给一个处理例程,或创建一个用于注册接口进行工作的例程,然后处理例行程序要求注册商处理一个对象的工作.