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

tutu08 2009-12-24 02:19:23
将问题抽象如下:
现在要设计一软件,对用户开放函数列表,允许用户自定义函数,但不开放源程序,
问如何设计此程序,用到哪些知识?

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

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

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

#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,问该如何做?先谢谢了!


//usersub.c

float usersub(int i,float a ,float b)
{
a=a+b*i;
return a;
}


...全文
326 点赞 收藏 43
写回复
43 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zeerd 2010-01-15
加挂一个开源的解释器,比如Lua什么的……
回复
forster 2010-01-15
动态库啊
com啊之类的
回复
j2meme 2010-01-15
需要用户先做成dll
回复
jackzhhuang 2010-01-13
[Quote=引用 40 楼 xixiaoliu 的回复:]
对于 LZ 的需求,可能使用 DLL 的形式比较好
规定用户的 DLL 必须实现并导出函数 float usersub(int, float ,float);
然后以某种方式“注册”到你的平台中就可以了
[/Quote]

以前我做过CAD二次开发,用的就是这个原理。
其实就是约定俗成一个导出接口,软件导入dll后,调用这个接口,然后你就可以做你想做的任何事情了。
回复
xixiaoliu 2010-01-13
对于 LZ 的需求,可能使用 DLL 的形式比较好
规定用户的 DLL 必须实现并导出函数 float usersub(int, float ,float);
然后以某种方式“注册”到你的平台中就可以了
回复
xixiaoliu 2010-01-13
1、提供 DLL 插件接口。使用已有的(如 COM)或者自定义的规范,让扩展者自己编写指定格式的函数。
2、提供二次开发接口,即实现一个脚本语言解释器。
回复
forcal 2010-01-13
用Forcal,与lua、python、matlab等比较一下,欢迎使用Forcal。
看看我刚发的帖子:http://topic.csdn.net/u/20100113/07/1bff0e7a-f8e1-4a48-9d59-ff5e8656b9ec.html?75794
过几天我给出算法,大家可转换成其他脚本比较一下。
Forcal与lua的速度相当,但扩展性比lua好。
我的bolg:http://blog.csdn.net/forcal
回复
FrankSun80 2010-01-13
我觉得楼主这个出发点可以再考虑下,你想支持用户写的c函数代码插入进来,你就得实现编译器的所有东西。
如果插入进来的是脚本,那你的程序也必须能解释这些脚本。
总之,你对用户要求的越高,你的程序要分析解释的东西也就越多。

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

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

如果要支持二次开发,那就用COM,毕竟你的客户能写C代码,那么写个插件应该不难
回复
ssdx 2010-01-13
不用DLL,现成可用的就是脚本了。

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


如果楼主只是想用户只给源代码,省去编译步骤。你主程序里面制定源代码目录/命名等规则,然后主程序调编译器连接器生成DLL再动态加载也行啊~~~
回复
DLevel 2010-01-13
楼主要求极度想C#里面的反射。
回复
gzstyxb 2010-01-13
采用COM实现。你定义好接口,别人实现你的接口。你按照定义好的接口对COM进行操作即可。也就是一种插件的处理方式,许多流行的软件都采用这样的方式实现插件的支持。
回复
ringphone 2010-01-04
js,vbs脚本,比较简单一点,网上也能搜到调用的相应源码
回复
tanmeining 2010-01-04
采用进程注入的方式:
1,自己写个DLL
2,Hook到要写入的程序
下面是例子:
http://www.99inf.net/SoftwareDev/VC/28896.htm
回复
lwykj 2010-01-04
脚本支持 最简单

还有就是插件
回复
tutu08 2009-12-29
继续顶
盼新方法
回复
tutu08 2009-12-28
看来只能用python等角本语言了
回复
forster 2009-12-25
所谓的sdk
回复
tutu08 2009-12-25
哦,谢谢老邓建议,这也是用角本编程的思想吧?

[Quote=引用 24 楼 loaden 的回复:]

不建议python,建议lua,更容易与C/C++无缝拼接。
建议看看:Code::Blocks的源码。
[/Quote]
回复
pur_e 2009-12-25
祝大家节日快乐,圣诞快乐,几天后元旦快乐
回复
老邓 2009-12-25
[Quote=引用 11 楼 do_fork 的回复:]
引用 10 楼 tutu08 的回复:
8楼兄弟是说
彻底放弃C
改用python开发软件?



你的程序还是用C/C++,用户那边可以用python扩展功能。
你需要在你的程序中,实现这么一个桥接的机制。
[/Quote]
不建议python,建议lua,更容易与C/C++无缝拼接。
建议看看:Code::Blocks的源码。
回复
加载更多回复
相关推荐
发帖
模式及实现
创建于2007-09-28

5528

社区成员

C/C++ 模式及实现
申请成为版主
帖子事件
创建了帖子
2009-12-24 02:19
社区公告
暂无公告