返回信息流☆─────────────────────────────────────☆
wks (cloverprince) 于 (Thu Sep 24 22:45:08 2009) 提到:
======== 第一组 ========
1. 现有一个主程序用C语言写成。现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称的函数(如foo(),bar(),baz())。如果要求第三方的模块必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载并使用,应如何实现?
2. 现有一个主程序用C++语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个继承自某个已知类(如class FooPlugin)的子类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用,应如何实现?
3. 现有一个主程序用Java语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个实现了某个已知接口(如interface IFooPlugin)的类,名称不限。如果要求第三方的类必须与主程序的bytecode分开发布,把.class放在classpath相应位置,或把jar丢在某个文件夹内即可被动态装载使用,应如何实现?
4. 现有一个主程序用C#语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个实现了某个已知接口(如interface IFooPlugin)的类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll丢在某个文件夹内即可被动态装载使用,应如何实现?
5. 现有一个主程序用Python语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个继承自某个已知类(如class FooPlugin)的子类,名称不限。如果要求第三方的类必须与主程序的py脚本或pyc字节码分开发布,把py或pyc丢在某个文件夹内即可被动态装载使用,应如何实现?
6. 现有一个主程序用C语言写成。现在要允许第三方开发人员编写扩展的类(试试GLib,你可以用C语言写面向对象的程序),约定第三方开发的类必须包含一个实现了某个已知接口(如interface IFooPlugin)的类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用,应如何实现?
======== 第二组 ========
6.1. 现有一个主程序用C语言写成。现在要允许第三方开发人员用C++语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
6.2. 现有一个主程序用C++语言写成。现在要允许第三方开发人员用C语言编写扩展的模块,如何设计主程序,以及如何规定扩展模块应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
7.1. 现有一个主程序用C语言写成。现在要允许第三方开发人员用Java语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把jar丢在某个文件夹内即可被动态装载使用?
7.2. 现有一个主程序用Java语言写成。现在要允许第三方开发人员用C语言编写扩展的模块,如何设计主程序,以及如何规定扩展模块应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
8.1. 现有一个主程序用C语言写成。现在要允许第三方开发人员用C#语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll丢在某个文件夹内即可被动态装载使用?
8.2. 现有一个主程序用C#语言写成。现在要允许第三方开发人员用C语言编写扩展的模块,如何设计主程序,以及如何规定扩展模块应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
9.1. 现有一个主程序用C语言写成。现在要允许第三方开发人员用Python语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把py或pyc丢在某个文件夹内即可被动态装载使用?
9.2. 现有一个主程序用Python语言写成。现在要允许第三方开发人员用C语言编写扩展的模块,如何设计主程序,以及如何规定扩展模块应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
10.1. 现有一个主程序用C++语言写成。现在要允许第三方开发人员用Python语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把py或pyc丢在某个文件夹内即可被动态装载使用?
10.2. 现有一个主程序用Python语言写成。现在要允许第三方开发人员用C++语言编写扩展的类,如何设计主程序,以及如何规定扩展类(及其所在模块)应满足的条件,才能使得如果要求第三方的类能够与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用?
11.1. 主程序用Java或C#,模块用C++。
11.2. 主程序用C++,模块用Java或C#。
12.1. 主程序用Java,模块用C#。
12.2. 主程序用C#,模块用Java。
13.1. 主程序用Java或C#,模块用Python。
13.2. 主程序用Python,模块用Java或C#。
14.1. 主程序是用C写的面向对象程序,模块用C++,Java,C#或Python。
14.2. 主程序是C++,Java,C#或Python,模块用C,面向对象。
======== 第三组 ========
15. 现有一个主程序用$LANGUAGE1语言写成,运行于$PLATFORM平台。现在要允许第三方开发人员用$LANGUAGE2语言编写独立的程序,独立于主程序发布,但与主程序在同一主机上运行。如何设计主、副程序,才能做到:
15.1. 只要一个程序先运行,另一个程序即可在运行时感知对方的存在?
15.2. 互相发送字节流?
15.3. 调用对方程序中的函数?
15.4. 创建对方程序中已知接口的类的实例,并调用其方法,在适当时机销毁该类?
其中LANGUAGE1,LANGUAGE2,PLATFORM=
C,C,Windows
C,C,Unix
C++,C++,Windows
C++,C++,Unix
C,C++,Windows
C,C++,Unix
C,Java,??
C++,Java,??
C,C#,Windows/Unix+Mono
C++,C#,Windows/Unix+Mono
C,Python,??
C++,Python,??
Java,C#,??
Other,Other,??
☆─────────────────────────────────────☆
flyingkisser (齐天大猫) 于 (Thu Sep 24 23:56:26 2009) 提到:
这需求,确实够雷
【 在 wks (cloverprince) 的大作中提到: 】
: ======== 第一组 ========
: 1. 现有一个主程序用C语言写成。现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称的函数(如foo(),bar(),baz())。如果要求第三方的模块必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载并使用,应如何
: 2. 现有一个主程序用C++语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个继承自某个已知类(如class FooPlugin)的子类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用
: ...................
☆─────────────────────────────────────☆
SuK (木有~) 于 (Fri Sep 25 09:33:39 2009) 提到:
各种接口哇~
☆─────────────────────────────────────☆
dragon2000 (龙之梦工作室) 于 (Fri Sep 25 09:36:17 2009) 提到:
假如要用第三方,而且有这么复杂的兼容问题,我宁可搞成SOA。什么编程平台都不管了,还可以跨主机。
☆─────────────────────────────────────☆
AFX (AFX) 于 (Fri Sep 25 11:37:52 2009) 提到:
【 在 wks 的大作中提到: 】
: ======== 第一组 ========
: 1. 现有一个主程序用C语言写成。现在要允许第三方开
: ..................
其实M$在过去的OLE COM dotNET等一系列技术上的努力和思考已经回答了你的大部分问题
要彻底整合成一个无边界无障碍的平台,是许多技术人员和商业公司所努力的方向,但一方面主要受制于计算机的有限计算能力,另一方面要做这件事情也是要消耗许多资源的
☆─────────────────────────────────────☆
Neverwinter (nez@Atlantis) 于 (Fri Sep 25 13:06:02 2009) 提到:
: 3. 现有一个主程序用Java语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个实现了某个已知接口(如interface IFooPlugin)的类,名称不限。如果要求第三方的类必须与主程序的bytecode分开发布,把.class放在classpath相应位置,或把jar丢在某个文件夹内即可被动态装载使用,应如何实现?
Java虚拟机本身支持动态加载,所以这个从技术上来说不成问题
至于具体的实现,如果你懒的话,可以找OSGi框架,如Equinox
至于第2组,当主程序是java时,只要模块能通过jni封起来,就都没问题
☆─────────────────────────────────────☆
kissme (kissme) 于 (Fri Sep 25 15:18:18 2009) 提到:
任一项捉摸一下还是大部可实现的。
但万能的程序比较影响效率。
实际开发也会根据资源和现状来选择。
有时往往不是最佳的选择。
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Fri Sep 25 15:45:19 2009) 提到:
可能我表达的方式不对。
每项都是单独考虑的,不需要一个程序用所有的语言实现。
其实,很多项并不是那么明显,比如C++主程序用C++类扩展。
【 在 kissme 的大作中提到: 】
: 任一项捉摸一下还是大部可实现的。
: 但万能的程序比较影响效率。
: 实际开发也会根据资源和现状来选择。
: ...................
☆─────────────────────────────────────☆
Django (贱狗) 于 (Fri Sep 25 17:09:23 2009) 提到:
<------本来不脑残,看了问题脑残了
☆─────────────────────────────────────☆
jmpesp (我是垃圾) 于 (Fri Sep 25 18:14:18 2009) 提到:
这个。。。
☆─────────────────────────────────────☆
Jarod (3线操作失败男 | 天天被雷劈) 于 (Sat Sep 26 14:39:10 2009) 提到:
此需求充分显示了wks的NB
☆─────────────────────────────────────☆
FadeToBlack (gfw nmb) 于 (Sat Sep 26 17:36:36 2009) 提到:
关于第二个,你可以看一下暗黑的外挂redvex
它是通过dll对外挂进行扩展,dll导出以下几个函数。
void __stdcall FreePlugin(PluginInfo* Info)
{
//Cleanup Stuff
}
IModule* __stdcall CreateModule(IProxy* proxy, ModuleKind Kind)
{
if( bLoaded == false )
{
manager = new Manager();
bLoaded = true;
}
switch(Kind)
{
//case RealmModule: return new Realm(proxy,manager); break;
//case ChatModule: return new Chat(proxy,manager); break;
case GameModule: return new Game(proxy,manager); break;
}
return 0;
}
extern "C"
{
__declspec(dllexport) PluginInfo* __stdcall InitPlugin(RedVexInfo* Funcs)
{
Info.Name = "IWantKC_BUPT 0.1"; //Change this to your plugin name
Info.Author = "Fade@BUPT"; //Change this to your name
Info.SDKVersion = 3;
Info.Destroy = (DestroyPlugin)&FreePlugin;
Info.Create = &CreateModule;
return &Info;
}
}
IProxy接口如下:
class IProxy
{
public:
// 这两个函数处理到服务器和客户端的数据包,外挂功能实现主要是在这两个函数里
// 对数据包进行处理
virtual void __stdcall RelayDataToServer(const IPacket* packet, const IModule* owner) = 0;
virtual void __stdcall RelayDataToClient(const IPacket* packet, const IModule* owner) = 0;
virtual int __stdcall GetClientSocket() = 0;
virtual int __stdcall GetServerSocket() = 0;
virtual IPacket* __stdcall CreatePacket(const void* data, int size) const = 0;
virtual IProxy* __stdcall GetPeer() = 0;
virtual ~IProxy() {}
};
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Sat Sep 26 18:30:51 2009) 提到:
嗯。一个入口注册其他函数,一个工厂产生类实例,(还有个清理用的),就可以完成类的插件。
另外,主程序把工厂得到的实例的指针,强制转换成接口类的类型,可以正常工作吗?(比如类成员的内存格局,方法函数的地址,不是一起编译的,可以兼容吗)
【 在 FadeToBlack 的大作中提到: 】
: 关于第二个,你可以看一下暗黑的外挂redvex
: 它是通过dll对外挂进行扩展,dll导出以下几个函数。
: void __stdcall FreePlugin(PluginInfo* Info)
: ...................
☆─────────────────────────────────────☆
MozartKV107 (Concerto in D, KV 107 No. 1) 于 (Sat Sep 26 18:34:51 2009) 提到:
能正常工作,不过我用的是vs2k8,宿主好像用的是vs2k3。
没有试过其他的编译器生成的dll文件能不能正常工作,不过应该可以吧。
vs的编译器返回的类第一个成员是vptr,对于纯虚函数来说应该就是vptr+offset就能取
到函数的入口了。不过这块没深入研究过,不太清楚。
【 在 wks (cloverprince) 的大作中提到: 】
: 嗯。一个入口注册其他函数,一个工厂产生类实例,(还有个清理用的),就可以完成类的插件。
: 另外,主程序把工厂得到的实例的指针,强制转换成接口类的类型,可以正常工作吗?(比如类成员的内存格局,方法函数的地址,不是一起编译的,可以兼容吗)
☆─────────────────────────────────────☆
Jarod (3线操作失败男 | 天天被雷劈) 于 (Sun Sep 27 13:11:14 2009) 提到:
用相同的编译器应该还是能工作的。。。
【 在 wks 的大作中提到: 】
: 嗯。一个入口注册其他函数,一个工厂产生类实例,(还有个清理用的),就可以完成类的插件。
: 另外,主程序把工厂得到的实例的指针,强制转换成接口类的类型,可以正常工作吗?(比如类成员的内存格局,方法函数的地址,不是一起编译的,可以兼容吗)
☆─────────────────────────────────────☆
Grape (葡萄) 于 (Sun Sep 27 13:18:53 2009) 提到:
应该是要保证以后不会更改IProxy这个纯抽象类的虚函数表。而且查找虚函数的规则也要一致(这应该就是要求相同的编译器吧)
这是一条镜像帖。来源:北邮人论坛 / soft-design / #37341同步于 2010/1/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[合集] [讨论]最近脑残,在考虑以下编程问题
FadeToBlack
2010/1/10镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
说白了就是 异种语言+异构操作系统+异构网络+进程间通信 的支持。
从理论上说,大部分分布式计算环境都可以坐到。
而实际上,能够满足要求的,目前只有 CORBA。 CORBA标准从诞生到现在已经10年了,比Java的历史还久。市售或者开源的CORBA产品有几十种,在维基百科中的CORBA条目有详细的产品介绍。目前可以支持绝大多数编程语言,包括perl和python等脚本语言。现今最常用的corba产品有两个,一是IONA公司的orbix,占有corba市场份额的50%强,另一个是华盛顿州立大学的一套开源corba产品 TAO。 此外,Java内嵌对corba的支持。
基本上以上需求都看见实现,第一组接口请参考网景的NPAPI接口规范,纯C接口,现在被用在各种浏览器的插件。第二组跨语言的平台请参考Openoffice.org的idl和ure实现方法,idl定义类似于CORBA一样的接口定义,使用工具可以转为各种语言的接口(C/C++的头文件,JAVA的接口等)。firefox中的接口定义也是用类似的idl定义,接口定义的实现与语言无关