有关Delphi的DLL调用问题, 主程序如何在不知道Dll中函数定型义的情况下进行调用。

时间:2021-04-19 20:15:29
我现在有这样的一个软件设计方案。应用系统分主系统以及应用系统扩展。应用系统扩展可以由次开发时进行扩展。其提供一些主程序调用的函数。函数名以及参数都由扩展函数库进行解决。
  问题就是扩展函数库的函数怎么向主程序进行注册。当然函数个数以及函数名可以容易知道。但主程序对DLL的中函数调用是要知道DLL中的函数原型,但我的系统主系统是不知道其函数原型的。
  这个问题确实比较复杂,有没有Windows程序设计方面的高手能帮忙解决?

27 个解决方案

#1


几乎是不可能

#2


我知道有一个DLL函数导出程序,可以导出DLL文件的所有函数原型
你可以到华军上SEARCH看看
GOOD LUCK

#3


没有看见过
gz

#4


那你可以让rundll32来调用,将危险送给他,

#5


不要浪费时间,向原厂商请求技术邦助,提供函数原型吧。

#6


反编译

#7


不要浪费时间,向原厂商请求技术邦助,提供函数原型吧。最好的途径了;

#8


该回复于2016-06-17 16:56:56被管理员删除

#9


DELPHI自带的那个东西可以知道函数名

#10


主程序是我开发的,主要提供应用程序框架处理。先于扩展库发布/
而护展程序主要是对主程序的业务逻辑进行补充。可以是我开发,也可以是用户开发。扩展库的开发格式可以由我来定。可以在扩展程序中申明函数的一些详细信息,以及定义相应的接口信息。但关键是怎么来定义及引用。/
    主程序不需要再重新编译。

    这个问题对我很急需,有没有能解决的办法?
    

#11


mark

#12


好办,扩展程序做成ExtXXX.DLL;要有命名规则,入口函数原型全部相同。
主程序用动态菜单,从ini文件读取扩展程序代号然后按命名规则找Ext???.DLL,
然后调用扩展程序入口函数。For Exsample:
  Function fShowAppForm(hMainApp:THandle;pControlor:OleVariant;pCallBackFunction:TCallBackFunction):integer;SafeCall;Extend;

#13


是个好办法

#14


为什么不用com来实现?

#15


TO: zhangqiufk(真言)
    我想我的应用还没有那么复杂,主要是一些业务处理函数,我想通过扩展库的形式来完成扩展业务。用户选择执行函数,并传入参数。就可以计算结果。
    所以,对于这样的计算函数
    Function 入库金额(帐套:Integer; 会计月: Integer; 库房:String): Double;
    Function 销售总额(帐套:Integer; 会计月: Integer): Double;
对于不同的业务系统可以扩展不同的函数。
    这些业务函数再注册到主系统中,从而主系统可提供给用户进行录入。能返回其值。
你说的怎么进行参数传递呢?


#16


原来你是定规则的人!!!
这不就简单了吗?
你就把接口定义好,让用户的DLL导出一个统一的过程/函数不就行了?!!!!

#17


我想COM或许也是办法之一,但没有用过,不知道怎么处理/
他能达到上面的要求的吗?

#18


对,我就是定规则的,可以要求用户的扩展DLL按要求来写/ 导出统一的过程与函数?
但参数是不定的/ 这就是关键/

#19


没弄明白,对于用户选择这个函数
Function 入库金额(帐套:Integer; 会计月: Integer; 库房:String): Double;

你的某个业务系统的函数原型是怎样的呢?你可否举个例子

#20


上面的解决办法我看到有些公司用过,不过现在那间公司放弃了这种方法,他们现在用Delphi的运行包bpl,我对这个挺有兴趣,但是就是具体的不懂,有高人能出来说说吗?

#21


关注!!!!

#22


其实,这与电子表函数有点类似;电子表处理程序可以由主程序进行处理/
但其中的业务处理主要是根据扩展库函数来进行。
在计算单元格时,用户就可以选择函数并计算。

#23


要获得这些扩展函数的原型不难,可以在注册函数的时候同时以一定的格式把函数的参数信息
也注册,或者干脆把这些函数定义为published函数,然后利用RTTI来获得他们的原型。但问题是,你的主程序怎样去理解这些参数应该传递什么值。

我建议你反过来,由你的主程序提供一个Provider对象给扩展函数,由扩展函数去从这个Provider取得自己执行所必需的数据和上下文,然后再返回。这样也许要好做一点。

只是个人看法

#24


更正一下:

要获得这些扩展函数的原型不难,可以在注册函数的时候同时以一定的格式把函数的参数信息
也注册,或者干脆把这些函数定义为某一个特定类的published函数,然后利用RTTI来获得他们的原型。但问题是,你的主程序怎样去理解这些参数应该传递什么值。

我建议你反过来,由你的主程序提供一个Provider对象给扩展函数,由扩展函数去从这个Provider取得自己执行所必需的数据和上下文,然后再返回。这样也许要好做一点。

只是个人看法

#25


你自己定好接口,让别人开发时都用你的接口

#26


up

#27


楼上的大侠们想得太复杂了,小弟有二个简单的办法:
一是:把参数规定 var 数组,在传递的时候是传递数组的地址的,DLL中可得到这个数组的全部数据
二是:加入ASM语句
    把DLL的参数声明为空,然后根据有几个参数,执行几个push 参数,
     最后来个call [pFun] 应该就可以了。

#1


几乎是不可能

#2


我知道有一个DLL函数导出程序,可以导出DLL文件的所有函数原型
你可以到华军上SEARCH看看
GOOD LUCK

#3


没有看见过
gz

#4


那你可以让rundll32来调用,将危险送给他,

#5


不要浪费时间,向原厂商请求技术邦助,提供函数原型吧。

#6


反编译

#7


不要浪费时间,向原厂商请求技术邦助,提供函数原型吧。最好的途径了;

#8


该回复于2016-06-17 16:56:56被管理员删除

#9


DELPHI自带的那个东西可以知道函数名

#10


主程序是我开发的,主要提供应用程序框架处理。先于扩展库发布/
而护展程序主要是对主程序的业务逻辑进行补充。可以是我开发,也可以是用户开发。扩展库的开发格式可以由我来定。可以在扩展程序中申明函数的一些详细信息,以及定义相应的接口信息。但关键是怎么来定义及引用。/
    主程序不需要再重新编译。

    这个问题对我很急需,有没有能解决的办法?
    

#11


mark

#12


好办,扩展程序做成ExtXXX.DLL;要有命名规则,入口函数原型全部相同。
主程序用动态菜单,从ini文件读取扩展程序代号然后按命名规则找Ext???.DLL,
然后调用扩展程序入口函数。For Exsample:
  Function fShowAppForm(hMainApp:THandle;pControlor:OleVariant;pCallBackFunction:TCallBackFunction):integer;SafeCall;Extend;

#13


是个好办法

#14


为什么不用com来实现?

#15


TO: zhangqiufk(真言)
    我想我的应用还没有那么复杂,主要是一些业务处理函数,我想通过扩展库的形式来完成扩展业务。用户选择执行函数,并传入参数。就可以计算结果。
    所以,对于这样的计算函数
    Function 入库金额(帐套:Integer; 会计月: Integer; 库房:String): Double;
    Function 销售总额(帐套:Integer; 会计月: Integer): Double;
对于不同的业务系统可以扩展不同的函数。
    这些业务函数再注册到主系统中,从而主系统可提供给用户进行录入。能返回其值。
你说的怎么进行参数传递呢?


#16


原来你是定规则的人!!!
这不就简单了吗?
你就把接口定义好,让用户的DLL导出一个统一的过程/函数不就行了?!!!!

#17


我想COM或许也是办法之一,但没有用过,不知道怎么处理/
他能达到上面的要求的吗?

#18


对,我就是定规则的,可以要求用户的扩展DLL按要求来写/ 导出统一的过程与函数?
但参数是不定的/ 这就是关键/

#19


没弄明白,对于用户选择这个函数
Function 入库金额(帐套:Integer; 会计月: Integer; 库房:String): Double;

你的某个业务系统的函数原型是怎样的呢?你可否举个例子

#20


上面的解决办法我看到有些公司用过,不过现在那间公司放弃了这种方法,他们现在用Delphi的运行包bpl,我对这个挺有兴趣,但是就是具体的不懂,有高人能出来说说吗?

#21


关注!!!!

#22


其实,这与电子表函数有点类似;电子表处理程序可以由主程序进行处理/
但其中的业务处理主要是根据扩展库函数来进行。
在计算单元格时,用户就可以选择函数并计算。

#23


要获得这些扩展函数的原型不难,可以在注册函数的时候同时以一定的格式把函数的参数信息
也注册,或者干脆把这些函数定义为published函数,然后利用RTTI来获得他们的原型。但问题是,你的主程序怎样去理解这些参数应该传递什么值。

我建议你反过来,由你的主程序提供一个Provider对象给扩展函数,由扩展函数去从这个Provider取得自己执行所必需的数据和上下文,然后再返回。这样也许要好做一点。

只是个人看法

#24


更正一下:

要获得这些扩展函数的原型不难,可以在注册函数的时候同时以一定的格式把函数的参数信息
也注册,或者干脆把这些函数定义为某一个特定类的published函数,然后利用RTTI来获得他们的原型。但问题是,你的主程序怎样去理解这些参数应该传递什么值。

我建议你反过来,由你的主程序提供一个Provider对象给扩展函数,由扩展函数去从这个Provider取得自己执行所必需的数据和上下文,然后再返回。这样也许要好做一点。

只是个人看法

#25


你自己定好接口,让别人开发时都用你的接口

#26


up

#27


楼上的大侠们想得太复杂了,小弟有二个简单的办法:
一是:把参数规定 var 数组,在传递的时候是传递数组的地址的,DLL中可得到这个数组的全部数据
二是:加入ASM语句
    把DLL的参数声明为空,然后根据有几个参数,执行几个push 参数,
     最后来个call [pFun] 应该就可以了。