• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
                今天做好了Vczh Free Script 2.0的一個(gè)新插件,這個(gè)插件可以直接插入class并接管成員調(diào)用、構(gòu)造函數(shù)和析構(gòu)函數(shù)等調(diào)用。

                一、在C++中插入一個(gè)類VczhClass和函數(shù)write、writeln、read和collect:
              1 class VczhClass : public FsClass
              2 {
              3 protected:
              4 public:
              5     VczhClass(FsPlugin* Plugin):FsClass(Plugin,L"interpreter_debug")
              6     {
              7     }
              8 
              9     FsePluginInvoke CallConstructor(int ClassID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
             10     {
             11         GetConsole()->Write(L"VczhClass is creating.\r\n");
             12         AddExternalMember(ClassID,L"MethodA",0);
             13         AddExternalMember(ClassID,L"MethodB",1);
             14         AddExternalMember(ClassID,L"MethodC",2);
             15         return fsSuccess;
             16     }
             17 
             18     FsePluginInvoke CallMember(int ClassID , int ExternalMemberID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
             19     {
             20         switch(GetMemberID(ExternalMemberID))
             21         {
             22         case 0:
             23             GetConsole()->Write(L"VczhClass::MethodA is invoking.\r\n");
             24             break;
             25         case 1:
             26             GetConsole()->Write(L"VczhClass::MethodB is invoking.\r\n");
             27             break;
             28         case 2:
             29             GetConsole()->Write(L"VczhClass::MethodC is invoking.\r\n");
             30             break;
             31         }
             32         return fsSuccess;
             33     }
             34 
             35     void CallDestructor(int ClassID)
             36     {
             37         GetConsole()->Write(L"VczhClass is destroying.\r\n");
             38     }
             39 };
             40 
             41 class VczhConsole : public FsPlugin
             42 {
             43 protected:
             44     FsObject            FWrite;
             45     FsObject            FWriteLine;
             46     FsObject            FRead;
             47     FsObject            FCollect;
             48     VczhClass*            FVczhClass;
             49 
             50     VUnicodeString Transform(const FsObject& Value)
             51     {
             52         return Value.GetReadableString().w_str();
             53     }
             54 public:
             55     VczhConsole(FsEngine* Engine , VUnicodeString CodePath):FsPlugin(Engine,L"interpreter")
             56     {
             57         FWrite        =Engine->CreateExternalResource();
             58         FWriteLine    =Engine->CreateExternalResource();
             59         FRead        =Engine->CreateExternalResource();
             60         FCollect    =Engine->CreateExternalResource();
             61 
             62         GetEnvironment().SetFixedVariable(L"write",FWrite);
             63         GetEnvironment().SetFixedVariable(L"writeln",FWriteLine);
             64         GetEnvironment().SetFixedVariable(L"read",FRead);
             65         GetEnvironment().SetFixedVariable(L"collect",FCollect);
             66         GetEnvironment().SetVariable(L"apppath",Engine->CreateString(CodePath.Buffer()));
             67         GetEnvironment().SetFixedVariable(L"vmpath",Engine->CreateString(GetConsole()->GetAppPath().Buffer()));
             68 
             69 #ifdef _DEBUG
             70         FVczhClass=new VczhClass(this);
             71         GetEnvironment().SetFixedVariable(L"VczhClass",FVczhClass->GetCtor());
             72 #else
             73         FVczhClass=0;
             74 #endif
             75     }
             76 
             77     ~VczhConsole()
             78     {
             79         if(FVczhClass)
             80         {
             81             delete FVczhClass;
             82         }
             83     }
             84 
             85     FsePluginInvoke Invoke(int ExternalID , FsObject* Parameters , int ParamCount , FsObject& ErrorMessage , FsObject& Result)
             86     {
             87         if(ExternalID==FWrite.GetExternalID())
             88         {
             89             for(VInt i=0;i<ParamCount;i++)
             90             {
             91                 GetConsole()->Write(Transform(Parameters[i]));
             92             }
             93             return fsSuccess;
             94         }
             95         else if(ExternalID==FWriteLine.GetExternalID())
             96         {
             97             for(VInt i=0;i<ParamCount;i++)
             98             {
             99                 GetConsole()->Write(Transform(Parameters[i]));
            100             }
            101             GetConsole()->Write(L"\r\n");
            102             return fsSuccess;
            103         }
            104         else if(ExternalID==FRead.GetExternalID())
            105         {
            106             for(VInt i=0;i<ParamCount;i++)
            107             {
            108                 GetConsole()->Write(Transform(Parameters[i]));
            109             }
            110             VUnicodeString Read;
            111             GetConsole()->Read(Read);
            112             Result=GetOwnedEngine()->CreateString(Read.Buffer());
            113             return fsSuccess;
            114         }
            115         else if(ExternalID==FCollect.GetExternalID())
            116         {
            117             int* Buffer=0;
            118             int Count=GetOwnedEngine()->CollectGarbage(Buffer);
            119             FsReleaseBuffer(Buffer);
            120             return fsSuccess;
            121         }
            122         else
            123         {
            124             return fsGiveUp;
            125         }
            126     }
            127 };

                二、書寫測(cè)試用的腳本代碼:
            1 func()
            2 {
            3     a=VczhClass.new();
            4     a.MethodA();
            5     a.MethodB();
            6     a.MethodC();
            7 }();
            8 collect();
                這里構(gòu)造了一個(gè)VczhClass并調(diào)用了三個(gè)成員函數(shù)。結(jié)束之后,這種寫法保證a再也不可被訪問(wèn)到,于是調(diào)用collect進(jìn)行垃圾收集(垃圾收集是自動(dòng)的,但是要觸發(fā)條件很難,所以給了個(gè)函數(shù)進(jìn)行強(qiáng)制收集)的時(shí)候就可以把a(bǔ)手機(jī)掉。

                三、運(yùn)行結(jié)果:
            1 VczhClass is creating.
            2 VczhClass::MethodA is invoking.
            3 VczhClass::MethodB is invoking.
            4 VczhClass::MethodC is invoking.
            5 VczhClass is destroying.

                四、如果a的成員被保存起來(lái)了怎么辦呢?
             1 b=null;
             2 func()
             3 {
             4     a=VczhClass.new();
             5     a.MethodA();
             6     a.MethodB();
             7     a.MethodC();
             8     b=a.constructor;
             9 }();
            10 collect();

                五、結(jié)果是因?yàn)閎還能繼續(xù)使用,所以a就不會(huì)銷毀(垃圾收集器解決了這個(gè)問(wèn)題):
            1 VczhClass is creating.
            2 VczhClass::MethodA is invoking.
            3 VczhClass::MethodB is invoking.
            4 VczhClass::MethodC is invoking.

                到了這里,一個(gè)直接往腳本中插入類的演示就結(jié)束了。接下來(lái)就是對(duì)這個(gè)插件進(jìn)行測(cè)試,并且在相應(yīng)的.NET接口上添加這樣的支持。
            posted on 2008-05-28 22:50 陳梓瀚(vczh) 閱讀(1629) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Vczh Free Script
            色综合久久综合网观看| 亚洲&#228;v永久无码精品天堂久久 | 亚洲伊人久久大香线蕉综合图片| 人妻无码αv中文字幕久久琪琪布| 2020最新久久久视精品爱| 色99久久久久高潮综合影院 | 国产麻豆精品久久一二三| 国产无套内射久久久国产| 亚洲精品无码久久千人斩| 久久久久久久久久久免费精品| 久久综合国产乱子伦精品免费| 色婷婷狠狠久久综合五月| 国产91色综合久久免费| 亚洲乱码精品久久久久..| 亚洲人成网站999久久久综合| 国产成人综合久久综合| 久久婷婷五月综合色奶水99啪| 欧美久久久久久精选9999| 69国产成人综合久久精品| 色综合久久中文字幕无码| 久久免费视频6| 久久www免费人成看国产片| 久久成人影院精品777| 久久精品人人做人人爽97| 无码人妻精品一区二区三区久久 | 中文字幕精品久久| 久久久久久一区国产精品| 久久国产免费直播| 久久久久久久综合日本| 韩国三级中文字幕hd久久精品| 欧美精品一区二区精品久久| 久久亚洲AV成人无码电影| 午夜精品久久久久久99热| 日本强好片久久久久久AAA | 色婷婷噜噜久久国产精品12p| 国産精品久久久久久久| 久久久久国色AV免费看图片| 久久久久国产日韩精品网站| 久久久久亚洲爆乳少妇无| 青青草原综合久久大伊人导航| 亚洲国产成人乱码精品女人久久久不卡|