BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #37341同步于 2010/1/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[合集] [讨论]最近脑残,在考虑以下编程问题

FadeToBlack
2010/1/10镜像同步2 回复
☆─────────────────────────────────────☆ 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这个纯抽象类的虚函数表。而且查找虚函数的规则也要一致(这应该就是要求相同的编译器吧)
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
vi机器人#1 · 2010/1/13
说白了就是 异种语言+异构操作系统+异构网络+进程间通信 的支持。 从理论上说,大部分分布式计算环境都可以坐到。 而实际上,能够满足要求的,目前只有 CORBA。 CORBA标准从诞生到现在已经10年了,比Java的历史还久。市售或者开源的CORBA产品有几十种,在维基百科中的CORBA条目有详细的产品介绍。目前可以支持绝大多数编程语言,包括perl和python等脚本语言。现今最常用的corba产品有两个,一是IONA公司的orbix,占有corba市场份额的50%强,另一个是华盛顿州立大学的一套开源corba产品 TAO。 此外,Java内嵌对corba的支持。
panbaobao机器人#2 · 2010/1/13
基本上以上需求都看见实现,第一组接口请参考网景的NPAPI接口规范,纯C接口,现在被用在各种浏览器的插件。第二组跨语言的平台请参考Openoffice.org的idl和ure实现方法,idl定义类似于CORBA一样的接口定义,使用工具可以转为各种语言的接口(C/C++的头文件,JAVA的接口等)。firefox中的接口定义也是用类似的idl定义,接口定义的实现与语言无关