Unit 自己 怎么知道属于哪个bpl

iamduo 2010-04-02 02:57:53
我想在某个Unit中写一个方法,或者类方法。
得到 属于的bpl名字,如果是路径就最好了。
因为,某些配置文件是跟着bpl走的。而这些配置文件只用于这些bpl。


(不晓得,在bpl中取Instance是exe的,还是bpl的。)
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CACACACACA 2010-04-03
  • 打赏
  • 举报
回复
或者
GetModuleFileName( FindHInstance(pointer( HInstance)), Buf, 100);
CACACACACA 2010-04-03
  • 打赏
  • 举报
回复

若是exe程序,则HInstance是exe的实例句柄,由于bpl是和exe共享vcl包的,所以取到的会是exe的实例句柄。
若是dll,则HInstance是dll的句柄,而不是exe的,因为他们不共享vcl包

//--------------
如果是loadpackage的方法.是可以的,如果不是动态加载的话.可以用下面的方式.


GetModuleFileName(FindClassHInstance(TCPISForm), Buf, 100);
iamduo 2010-04-03
  • 打赏
  • 举报
回复

s:=GetModuleName(HInstance); // c:\...\MyTest.bpl
s:=GetModuleName(MainInstance); // d:\...\Project1.exe


GetModuleFileName 还没有试过,之后我试试看。
结贴了。
金卯刀 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jjwwang 的回复:]
引用 5 楼 avan_lau 的回复:

用GetModuleFileName,事先要記錄LoadPackage返回的bpl模塊句柄



有个全局的HInstance 变量.好像是在sysinit单元中.

直接GetModuleFileName(HInstance, buf, max_path)就行了.连文件名带路径全有了.
[/Quote]
若是exe程序,则HInstance是exe的实例句柄,由于bpl是和exe共享vcl包的,所以取到的会是exe的实例句柄。
若是dll,则HInstance是dll的句柄,而不是exe的,因为他们不共享vcl包
CACACACACA 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 avan_lau 的回复:]

用GetModuleFileName,事先要記錄LoadPackage返回的bpl模塊句柄
[/Quote]


有个全局的HInstance 变量.好像是在sysinit单元中.

直接GetModuleFileName(HInstance, buf, max_path)就行了.连文件名带路径全有了.
SQLDebug_Fan 2010-04-02
  • 打赏
  • 举报
回复
用LoadPackage再加载一下,就可以获得句柄
iamduo 2010-04-02
  • 打赏
  • 举报
回复
那不是很麻烦?
exe Load bpl后还要告诉bpl,你的句柄是多少?
那还直接把Load的文件给bpl,更直接。

SQLDebug_Fan 2010-04-02
  • 打赏
  • 举报
回复
Instance是在EXE和BPL共享的,也就是EXE的实例句柄,Avan_Lan的正解,需要获取LoadPackage返回的bpl模塊句柄
金卯刀 2010-04-02
  • 打赏
  • 举报
回复
用GetModuleFileName,事先要記錄LoadPackage返回的bpl模塊句柄
Harryfin 2010-04-02
  • 打赏
  • 举报
回复
GetModuleFileName
亮剑_ 2010-04-02
  • 打赏
  • 举报
回复
试试
1、Application.ExeName
2、GetModuleFileName
iamduo 2010-04-02
  • 打赏
  • 举报
回复
赞~!
帮顶也给分(就是少一点)
如果我能自己研究出来解决方案。
公布答案且散分。
3Q
亮剑_ 2010-04-02
  • 打赏
  • 举报
回复
友情帮顶
RX Library 2.75 with Delphi 2009 support (by FlexGraphics software) ====================================================================== The Set of Native Delphi Components for Borland Delphi versions 1, 2, 3, 4, 5, 6, 7, 2005, 2006, 2009 and Borland C++ Builder 1, 3, 4, 5, 6, 2006 & 2009. 100% Source Code. Last revision date Oct 12, 1999. PLEASE FOLLOW THE INSTRUCTIONS PROVIDED IN THE INSTALLATION SECTION! TABLE OF CONTENTS ----------------- Latest Changes Overview History License Agreement Installation Demonstration Programs Source Files Using GIF Images Copyright Notes NEW FOR VERSION 2.75 -------------------- Delphi 5.0 & C++Builder 4.0 Compatibility New components: TRxLoginDialog New properties, events: TFormPlacement.RegistryRoot TFormPlacement.Version TFontComboBox.UseFonts TRxDBGrid.OnTopLeftChanged TRxDBLookupCombo.DisplayValues TStrHolder.Macros, TStrHolder.OnExpandMacros RxSpin.TValueType.vtHex New routines, methods, constants: SaveClipboardToStream, LoadClipboardFromStream (clipmon.pas) AppFileName, AppVerInfo (rxverinf.pas) XorString, XorEncode, XorDecode (strutils.pas) BUG FIXES. Overview -------- This version is the result of long unactivity of RX Library authors and some imperfections and bugs of other RX adaptations to Delphi 6. The authors of this version disclaim all warranties as to this software, whether express or implied, including without limitation any implied warranties of merchantability or fitness for a particular purpose. Use under your own responsibility, but comments (even critique) in English (or in Russian) are welcome. RX Library contains a large number of components, objects and routines for Borland Delphi with full source code. This library is compatible with Borland Delphi 1, 2, 3, 4, 5, 6 and Borland C++ Builder 1, 3, 4. This collection includes over 60 native Delphi components. RX Library is a freeware product. Feel free to distribute the library as long as all files are unmodified and kep
在淘宝花50大米买的源码 └─电子巡更系统 Delphi源码 ├─安装包 │ │ hdxgxt.ini │ │ XXCL.HLP │ │ SystemInfo.ini │ │ Background.bmp │ │ PatrolmanMng.exe │ │ │ ├─BDE │ │ BANTAM.DLL │ │ BDEADMIN.CPL │ │ BDEADMIN.EXE │ │ BDEADMIN.HLP │ │ BLW32.DLL │ │ ceeurope.btl │ │ charset.cvb │ │ datapump.cnt │ │ DATAPUMP.EXE │ │ DATAPUMP.HLP │ │ europe.btl │ │ fareast.btl │ │ IDAPI32.CFG │ │ IDAPI32.DLL │ │ IDASCI32.DLL │ │ IDBAT32.DLL │ │ IDDA3532.DLL │ │ IDDAO32.DLL │ │ IDDBAS32.DLL │ │ IDDR32.DLL │ │ IDODBC32.DLL │ │ IDPDX32.DLL │ │ IDQBE32.DLL │ │ IDR20009.DLL │ │ IDSQL32.DLL │ │ japan.btl │ │ other.btl │ │ SQL_DB2.CNF │ │ SQL_INF.CNF │ │ SQL_INF9.CNF │ │ SQL_INT.CNF │ │ SQL_MSS.CNF │ │ SQL_ORA.CNF │ │ SQL_ORA8.CNF │ │ SQL_SSC.CNF │ │ SQL_SYB.CNF │ │ usa.btl │ │ │ └─dbf │ DBDWORK.INI │ FPXL.DB │ FPXL.PX │ patrolrec.DB │ patrolrec.PX │ POINT.DB │ POINT.PX │ shiftrule.DB │ shiftrule.PX │ TEMP.DB │ TEMP.PX │ USERS.DB │ USERS.PX │ WORKER.DB │ WORKER.PX │ YXXX.DB │ YXXX.PX │ YXXX_FL.DB │ YXXX_FL.PX │ ├─安装控件 │ ├─RXLIB275 │ │ FILE_ID.DIZ │ │ help.TXT │ │ README.TXT │ │ RXINST.EXE │ │ RXNEWS.TXT │ │ │ └─Comm2 │ Async32-e.pas │ Async32.dcr │ Async32.dcu │ Async32.doc │ Async32.pas │ Async32.~pa │ Async32.~pas │ Comm.bpl │ Comm.cfg │ Comm.dcp │ Comm.dcu │ Comm.dof │ Comm.dpl │ Comm.res │ comports.ini │ Demo.dof │ Demo.dpr │ Demo.dsk │ Demo.exe │ Demo.res │ Demo.~dp │ Main.$$$ │ Main.dcu │ Main.dfm │ Main.pas │ Main.~df │ Readme.txt │ Whatsnew.txt │ └─源程序 menu.~dfm menu.~pas ABOUT.dcu fpxl_pas.dfm ql_data.dfm menu.pas menu.dfm pass_pas.pas aboutqz.dfm about_pas.dcu add_pen_unit.dfm about_pas.~dfm aboutqz.pas about_pas.~pas add_class_pas.dcu add_class_pas.dfm add_class_pas.pas PatrolmanMng.dpr add_pen_unit.pas add_pencode_unit.dcu add_pencode_unit.dfm add_pencode_unit.pas add_pencode_unit.~dfm add_pencode_unit.~pas add_pen_unit.dcu add_pen_unit.~dfm add_pen_unit.~pas add_user_pas.dfm aboutqz.~pas HELPXXN.dfm add_point_pas.dcu add_point_pas.~dfm add_point_pas.~pas choose_day_pas.pas add_point_pas.dfm add_user_pas.dcu add_user_pas.pas add_user_pas.~dfm class_print_pas.dfm about_pas.dfm HELPXXN.PAS add_worker_pas.dcu add_worker_pas.dfm add_worker_pas.pas fpxl_pas.pas add_worker_pas.~pas fpxl_pas.~dfm Async32.dcu Async32.pas pentime.pas pentime.~pas choose_day_pas.~dfm choose_day_pas.~pas choose_pas.dcu choose_pas.~pas click_time_pas.dfm choose_pas.dfm choose_pas.pas class_print_pas.dcu class_print_pas.pas class_print_pas.~dfm dlsxx_pas.pas about.pas point_pas.pas ql_data.pas click_time_pas.dcu click_time_pas.pas click_time_pas.~dfm click_time_pas.~pas clsss_pas.~pas clsss_pas.dcu clsss_pas.~dfm PatrolmanMng.dof lssjll.pas datamodal.dcu datamodal.dfm datamodal.dti datamodal.pas datamodal.~dfm datamodal.~dti datamodal.~pas DLSXX.DPR DLSXX.RES fpxl_pas.~pas dlsxx_pas.dfm dm_class_pas.dcu dm_class_pas.dfm dm_class_pas.dti dm_class_pas.pas dm_class_pas.~dfm dm_class_pas.~dti dm_class_pas.~pas dm_fpxl_pas.dcu dm_fpxl_pas.dfm dm_fpxl_pas.dti dm_fpxl_pas.pas dm_fpxl_pas.~dfm dm_fpxl_pas.~pas dm_pen_unit.dcu dm_pen_unit.dfm dm_pen_unit.dti dm_pen_unit.pas dm_pen_unit.~dfm dm_pen_unit.~dti dm_pen_unit.~pas dm_point_pas.dcu dm_point_pas.dfm dm_point_pas.pas dm_sjbf_pas.dcu dm_sjbf_pas.dfm dm_sjbf_pas.dti dm_sjbf_pas.pas dm_sjbf_pas.~dfm dm_sjbf_pas.~dti dm_sjbf_pas.~pas dm_user_pas.dcu dm_user_pas.dfm dm_user_pas.pas dm_worker_pas.dcu dm_worker_pas.dfm dm_worker_pas.dti dm_worker_pas.pas dm_worker_pas.~dfm dm_worker_pas.~dti dm_worker_pas.~pas dm_xjysxx_view_pas.dcu dm_xjysxx_view_pas.dfm dm_xjysxx_view_pas.dti dm_xjysxx_view_pas.pas dm_xjysxx_view_pas.~dfm dm_xjysxx_view_pas.~dti dm_xjysxx_view_pas.~pas dm_yxxx_pas.dcu dm_yxxx_pas.dfm dm_yxxx_pas.pas dm_yxxx_view_pas.dcu dm_yxxx_view_pas.dfm dm_yxxx_view_pas.dti dm_yxxx_view_pas.pas dm_yxxx_view_pas.~dfm dm_yxxx_view_pas.~dti dm_yxxx_view_pas.~pas edit_pen_unit.dcu edit_pen_unit.~dfm edit_pen_unit.~pas lsxx_pas.dfm Gvas.pas edit_pen_unit.dfm fpxl_pas.dcu setmode.pas fullreport.~dfm lssjll.dfm lsxx_pas.pas fullreport.dcu fullreport.~pas class_print_pas.~pas Gvas.dcu about.~pas about.~dfm hdxgxt.ini hdxgxt.~ini ql_data.~pas about.dfm pentime.dfm hdzdhxt.cfg hdzdhxt.dof HDZDHXT.RES hdzdhxt.~dpr HELPXXN.~PAS information.dcu password_unit.dfm information.pas add_user_pas.~pas information.dfm initframe.dcu setmode.~pas initframe.dfm initframe.~dfm initframe.~pas ldxx_report.pas PatrolmanMng.cfg ldxx_report_pas.dcu lssjll.~pas pass_pas.dfm ldxx_report_pas.dfm ldxx_report.~pas ldxx_report_pas.~dfm ldxx_report_pas2.~dfm ldxx_report_pas2.~pas lssjll.dcu lssjll.~dfm lsxx_pas.~pas lsxx_pas.~dfm lsxx_pas.dcu xjyhsd.pas lxxx_report_pas.~pas lxxx_report_pas.dcu lxxx_report_pas.pas lxxx_report_pas.~dfm lxxx_report_pas2.pas pass_pas.~pas settest.pas lxxx_report_pas2.~dfm lxxx_report_pas2.~pas menu.dcu setmod.pas ql_data.~dfm user_pas.dfm MSG.DFM MYPROCE.PAS PASSWORD.DFM PASSWORD.PAS password_pas.dcu password_pas.dfm password_pas.pas password_pas.~dfm password_pas.~pas password_unit.dcu pentime.~dfm about_pas.pas add_class_pas.~pas TestPen.pas user_pas.pas pass_pas.dcu pass_pas.~dfm penmode_pas.dfm settest.dfm PatrolmanMng.~dpr MYCOMP.ICO add_class_pas.~dfm PatrolmanMng.res xjyhsd.dfm PEN.RES penmode_pas.dcu point_pas.dfm penmode_pas.pas ReceFormM.dfm PEN.PAS penmode_pas.~pas pentime.dcu xjyhsd.~pas xjyhsd.~dfm point_pas.dcu Recethr.pas PEN.~PAS Gvas.~pas point_pas.~pas point_print_pas.dcu aboutqz.~dfm point_print_pas.~pas PROCESS.DFM PROCESS.PAS ql_data.dcu password_unit.~dfm ReceFormM.dcu ldxx_report_pas.pas Recethr.dcu Recethr.~pas clsss_pas.dfm regedit_pas.dcu regedit_pas.~pas reports_DEL.~dfm REPORTS2.dcu reports_DEL.dcu SerrRep.dcu settest.~pas SerrRep.dfm SETCOMM.dcu setcomm.dfm setcomm.pas setcomm.~dfm setcomm.~pas SETMOD.dcu setmod.dfm setmod.~dfm setmod.~pas SETMODE.dcu setmode.dfm setmode.~dfm TestPen.~dfm settest.dcu ldxx_report.dfm worker_pas.~pas show_thread.dcu show_thread.pas sjyc_report_pas.dcu sjyc_report_pas.~pas Splash.~dfm yxxx_pas.pas sjyc_report_pas2.~dfm sjyc_report_pas2.~pas Splash.dcu StatuSFM.dcu StatuSFM.dfm StatuSFM.pas StatuSFM.~dfm StatuSFM.~pas SystemInfo.ini TerrRep.dcu TerrRep.~dfm TerrRep.~pas TestPen.dcu point_pas.~dfm initframe.pas TestPen1.dfm TestPen1.pas thread_yxxx_view.dcu add_point_pas.pas Unit1.~dfm Unit1.~pas Unit2.dfm Unit2.pas Unit2.~dfm Unit2.~dti Unit2.~pas user_pas.dcu worker_pas.dcu thread_yxxx_view.pas worker_pas.pas worker_pas1.~dfm worker_pas1.~pas worker_print_pas.dcu worker_print_pas.dfm worker_print_pas.pas wzxx_report_pas.dcu wzxx_report_pas2.~dfm wzxx_report_pas2.~pas XJYHSD.dcu xjysxx_pas.dcu information.~dfm xjysxx_pas.~pas thread_yxxx_view.~pas xjysxx_pas.dfm xjysxx_report_pas.dcu xjysxx_report_pas.pas xjysxx_report_pas.~dfm xjysxx_report_pas2.~dfm xjysxx_report_pas2.~pas XXCL.HLP YXXX_PAS.dcu yxxx_report_pas.dcu yxxx_view_pas.~pas yxxx_report_pas.dfm yxxx_report_pas2.~dfm yxxx_report_pas2.~pas yxxx_view_pas.dcu add_worker_pas.~dfm _QSQ10.DB _QSQ2.DB _QSQ31.DB _QSQ33.DB _QSQ4.DB _QSQ5.DB _QSQ8.DB _QSQ9.DB clsss_pas.pas earth.ico dlsxx_pas.~pas dlsxx_pas.~dfm edit_pen_unit.pas fullreport.pas information.~pas point_print_pas.~dfm ldxx_report_pas2.pas ldxx_report_pas.~pas ldxx_report_pas2.dfm lxxx_report_pas.dfm lxxx_report_pas2.dfm penmode_pas.~dfm point_print_pas.pas point_print_pas.dfm SerrRep.pas ReceFormM.~pas ReceFormM.pas ReceFormM.~dfm reports_DEL.pas reports_DEL.dfm settest.~dfm reports_DEL.~pas REPORTS1.PAS REPORTS1.~PAS REPORTS1.dfm REPORTS1.~dfm REPORTS2.PAS REPORTS2.~PAS REPORTS2.dfm REPORTS2.~dfm SerrRep.~pas SerrRep.~dfm sjyc_report_pas.dfm sjyc_report_pas.~dfm sjyc_report_pas.pas Splash.pas yxxx_pas.dfm sjyc_report_pas2.pas sjyc_report_pas2.dfm choose_day_pas.dfm TerrRep.pas TerrRep.dfm TestPen.dfm user_pas.~pas Unit1.pas Unit1.dfm user_pas.~dfm HELPXXN.~dfm worker_pas.~dfm worker_print_pas.~dfm worker_pas1.pas worker_pas1.dfm worker_pas2.~pas worker_pas2.~dfm worker_pas2.pas worker_pas2.dfm wzxx_report_pas.dfm worker_print_pas.~pas xjysxx_pas.~dfm wzxx_report_pas.~pas wzxx_report_pas.~dfm wzxx_report_pas.pas wzxx_report_pas2.pas wzxx_report_pas2.dfm xjysxx_pas.pas xjysxx_report_pas.~pas xjysxx_report_pas.dfm yxxx_pas.~dfm xjysxx_report_pas2.pas xjysxx_report_pas2.dfm yxxx_pas.~pas yxxx_report_pas.pas yxxx_report_pas.~pas yxxx_report_pas.~dfm yxxx_view_pas.pas yxxx_view_pas.~dfm yxxx_view_pas.dfm password_unit.pas yxxx_report_pas2.pas yxxx_report_pas2.dfm choose_pas.~dfm ldxx_report.~dfm fullreport.dfm regedit_pas.pas Splash.dfm TestPen.~pas Splash.~pas worker_pas.dfm password_unit.~pas
不是由BORLAND提供的组件叫第三方组件安装方法:
1 只有一个DCU文件的组件。DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布。一般来说,作者必须说明此组件适合Delphi的

哪种版本,如果版本不对,在安装时就会出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦Delphi版本升级,此组件就不能

再使用了,当然有的作者给出了几种版本的DCU文件,用户根据需要选择使用。这样的组件的安装方法是:在Component菜单中,选择install

component,在对话框 "into existing package"页中,单击“Unit file name”后的“Browse”按扭,在打开的文件对话框中,将“文件类型

”设定为*.dcu,找到要安装的DCU文件,按OK按钮返回"into existing package"页后再按OK按钮就可以安装了。注意,此时Delphi会提示

dclusr40.dpk将被重建,是否继续,OK就可以了。这里是将组件安装到dclusr40.dpk包中,此包从文件名上可以看出是用户自定义组件包,先

安装到这个包中吧,下面再讲有关注意事项。安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到组件面板上看

看,一般会出现一个新的组件页,其中有刚安装的组件。
2 只有PAS文件或既有PAS又有DCU文件的组件。这种组件因为有PAS文件,也就是说作者提供了源码,这就好办多了。安装的方法和上面是一样

的,在文件类型中可以设定为DCU也可以设定为PAS,建议设定为PAS,这样可用你的Delphi重新编译一下,看是否会出现问题。Delphi升级后只

能选择PAS文件安装,这样才能重新编译,使得组件能适应新Delphi版本。这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好

不要使用,一是存在Delphi版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否是组件中存在BUG。
3 有dpk文件的组件包。带有dpk文件的组件包一般是有多个组件构成的,也就是说安装后会有多个组件供使用,如果只有一个组件作者一般

不会制成DPK文件,使用上面的方式发布就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的RXLIB,由于组件复

杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没有安装说明文件,那么用下面的方法安装:在File菜单下,选择

”OPEN…”打开dpk文件(文件类型列表框中选*.dpk),在出现的Package窗口中,工具栏上有Install按钮,按此按钮即可进行安装。如果

Install按钮处于无效状态,那么先按Compile按钮编译,一般来说编译之后Install按钮就会处于有效状态,此时再按Install按钮就可以了。
4 带有Bpl文件的组件包。一般来说这也是由多种组件构成的组件包,它其实是一个动态连接库文件(DLL)。对于这种组件包的安装方法是

:在component菜单下选择“install packages”,然后单击Add按钮,在打开的文件对话框中找到相应的bpl文件打开返回后,再单击Ok按钮就

可以了。
5 ActiveX控件的安装。要安装这类控件,需要先用regsvr32.exe注册,然后选择Component菜单中Import ActiveX Control项。在Import

ActiveX Control打开的窗口中,只有已经注册的ActiveX控件才出现在列表中,选中一个然后按Install按钮就可以安装了。如果事先没有用

regsvr32.exe注册也可以按ADD按钮找到OCX文件即时注册,注册后再进行安装。
几点说明:
1 在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的指导,有些还会有组件的属性、事件、方法的使用说明,这些在

使用时是非常重要的。
2 在上面的组件(包)安装操作之前,最好将 *.bpl拷贝到你的System目录中,将*.pas、*.dcu、*.dcr、*.dp?拷贝到Delphi的Lib目录中再

进行。
3 前面我们提到安装DCU组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安装到一个新的包中,如果选择新包,需要先取一个名

字比如DEMO,事实上安装完毕后用户可以找到的是Demo.bpl,而找不到DEMO.DPK。假如你已经将一个组件安装到dclusr40.dpk中了,还想再安

装一个组件,如果再安装到dclusr40.dpk中,安装后你得到提示,原来安装的那个组件已经被取消注册,你将无法使用了。这样不就成了只能

安装一个组件了吗?除非你再安装到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的BPL文件也未偿不可,但BPL

件就增加许多。能否在dclusr40.dpk中多安装几个组件呢?当然是可以的。方法如下:用File菜单下的OPEN打开dclusr40.dpk文件,单击ADD按

钮,在打开的对话框中选择ADD UNIT页面,按Unit file name后的“Browse”按钮打开组件单元文件,OK即可,用此种方法这样可添加多个组

件的单元文件,添加完毕,按一下编译按钮,然后再按Install按钮即可,如果单元文件是编译好的(DCU)可以直接按安装按钮。
4 组件的删除。光会安装可不行,还要会删除呀。很简单,在component菜单下,选择install packages,在列表中找到安装所在的Bpl

按Remove按钮,ok!再把Bpl文件删掉就彻底了,如果不删除BPL文件,下次可以按安装BPL组件的方法再安装使用

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧