首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么实现已编软件(无源代码)的扩展功能,求高手帮忙

2012-02-21 
如何实现已编软件(无源代码)的扩展功能,求高手帮忙[size12px][/size]将问题抽象如下:现在要设计一软件,对

如何实现已编软件(无源代码)的扩展功能,求高手帮忙
[size=12px][/size]将问题抽象如下:
现在要设计一软件,对用户开放函数列表,允许用户自定义函数,但不开放源程序,
问如何设计此程序,用到哪些知识?

问题说述:
1、VC开发环境,主程序一旦开发完成,编译成EXE后,就不再修改源代码
2、主程序能实现完全功能,但是有一个用户子程序usersub(i,a,b)的算法执行流程可能需要修改
3、在对话框里加载自定义函数的源代码 usersub(i,a,b).c
4、主程序执行中调用加载进来的新函数而抛弃原始的代码

搜到一些其它方法,比如做成dll动态加载,但需要用户先做成dll,目前不想做成这种方法,只想让用户编出函数源代码,
提交给主程序用。

程序示例,有含如下的代码的主程序,编译生成A.exe

C/C++ code
#include <stdio.h>#include <stdlib.h>float usersub(int, float ,float);int main(int argc, char *argv[]){  int i;  float a=1.0, b=2.0, c;  for(i=0;i < 10;i++)  {      c=usersub(i,a,b);                        }    printf( "c is %f now\n",c );    system("PAUSE");        return 0;}float usersub(int i,float a ,float b){      a=a+b+i;      return a;      }



现在需要重写usersub,但是不允许在A里面直接改,而是让A.exe加载usrbub.c,问该如何做?先谢谢了!

C/C++ code
//usersub.cfloat usersub(int i,float a ,float b){      a=a+b*i;      return a;      }




[解决办法]
写一个脚本编辑器, 用户子程序的编写语言用脚本

或者做好一整套模板, 当源程序来了, 直接能生成dll, 最终调的是dll
[解决办法]
可以支持用户编写脚本,如python脚本,
在程序中支持py相对比较简单,可以看看开源的工具qterm是怎么实现的,
vim不仅支持python还支持perl和ruby脚本,也可以参考一下

二进制插件形式,一般要求用户按照一定形式打包插件,
如果光提供一个源码,做起来会困难一些
[解决办法]
这个不用dll肯定不行吧,编译完就把代码加入可执行文件了。你的程序能在运行时编译一个文件的函数,并加载到内存中的话,就能执行了。
python是解释性的语言吧,应该可以,想matlab也是解释性的语言,也有这个功能。
[解决办法]
内嵌脚本
[解决办法]
python不错的选择
boost提供了C++ python
[解决办法]
探讨
引用:
8楼兄弟是说
彻底放弃C
改用python开发软件?



你的程序还是用C/C++,用户那边可以用python扩展功能。
你需要在你的程序中,实现这么一个桥接的机制。

[解决办法]
采用进程注入的方式:
1,自己写个DLL
2,Hook到要写入的程序
下面是例子:
http://www.99inf.net/SoftwareDev/VC/28896.htm
[解决办法]
采用COM实现。你定义好接口,别人实现你的接口。你按照定义好的接口对COM进行操作即可。也就是一种插件的处理方式,许多流行的软件都采用这样的方式实现插件的支持。
[解决办法]
楼主要求极度想C#里面的反射。
[解决办法]
不用DLL,现成可用的就是脚本了。

要不自己实现类似反射这样的东西了。


如果楼主只是想用户只给源代码,省去编译步骤。你主程序里面制定源代码目录/命名等规则,然后主程序调编译器连接器生成DLL再动态加载也行啊~~~
[解决办法]
我觉得楼主这个出发点可以再考虑下,你想支持用户写的c函数代码插入进来,你就得实现编译器的所有东西。
如果插入进来的是脚本,那你的程序也必须能解释这些脚本。
总之,你对用户要求的越高,你的程序要分析解释的东西也就越多。

你确定你要做的是这么功能复杂的程序吗,有客户能用你的程序吗?

只能说这么做要求很高,代价很大~

如果要支持二次开发,那就用COM,毕竟你的客户能写C代码,那么写个插件应该不难

热点排行
Bad Request.