• <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  評論-2670  文章-0  trackbacks-0
                今天做好了Vczh Free Script 2.0的一個新插件,這個插件可以直接插入class并接管成員調用、構造函數和析構函數等調用。

                一、在C++中插入一個類VczhClass和函數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 };

                二、書寫測試用的腳本代碼:
            1 func()
            2 {
            3     a=VczhClass.new();
            4     a.MethodA();
            5     a.MethodB();
            6     a.MethodC();
            7 }();
            8 collect();
                這里構造了一個VczhClass并調用了三個成員函數。結束之后,這種寫法保證a再也不可被訪問到,于是調用collect進行垃圾收集(垃圾收集是自動的,但是要觸發條件很難,所以給了個函數進行強制收集)的時候就可以把a手機掉。

                三、運行結果:
            1 VczhClass is creating.
            2 VczhClass::MethodA is invoking.
            3 VczhClass::MethodB is invoking.
            4 VczhClass::MethodC is invoking.
            5 VczhClass is destroying.

                四、如果a的成員被保存起來了怎么辦呢?
             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();

                五、結果是因為b還能繼續使用,所以a就不會銷毀(垃圾收集器解決了這個問題):
            1 VczhClass is creating.
            2 VczhClass::MethodA is invoking.
            3 VczhClass::MethodB is invoking.
            4 VczhClass::MethodC is invoking.

                到了這里,一個直接往腳本中插入類的演示就結束了。接下來就是對這個插件進行測試,并且在相應的.NET接口上添加這樣的支持。
            posted on 2008-05-28 22:50 陳梓瀚(vczh) 閱讀(1637) 評論(0)  編輯 收藏 引用 所屬分類: Vczh Free Script
            久久精品国产亚洲AV无码娇色 | 久久综合偷偷噜噜噜色| 欧美激情精品久久久久久久九九九| 狠狠久久亚洲欧美专区| 久久国产福利免费| 久久久精品久久久久影院| 潮喷大喷水系列无码久久精品| 久久国产精品99精品国产| 91秦先生久久久久久久| 欧美久久亚洲精品| 久久综合亚洲色一区二区三区| AV无码久久久久不卡蜜桃| 久久人人爽人人爽人人片AV东京热 | 国产高潮久久免费观看| 国产精品久久久香蕉| 久久99国产精品一区二区| 中文国产成人精品久久亚洲精品AⅤ无码精品| 亚洲午夜无码AV毛片久久| 久久91亚洲人成电影网站| 2021最新久久久视精品爱| 精品久久久无码人妻中文字幕豆芽| 久久精品二区| 日本久久久久久中文字幕| 伊人久久综合精品无码AV专区| 国产精品久久成人影院| 亚洲第一极品精品无码久久 | 人妻精品久久无码区| 免费一级欧美大片久久网| 91久久国产视频| 久久超乳爆乳中文字幕| 久久婷婷五月综合国产尤物app| 欧美久久一级内射wwwwww.| 久久国产综合精品五月天| 国产成人无码久久久精品一| 无码AV中文字幕久久专区| 日本久久久久久久久久| 亚洲国产精品成人久久蜜臀| 色欲综合久久躁天天躁| 久久久久亚洲爆乳少妇无| 蜜臀久久99精品久久久久久| 色综合久久88色综合天天 |