• <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并接管成員調用、構造函數(shù)和析構函數(shù)等調用。

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

                二、書寫測試用的腳本代碼:
            1 func()
            2 {
            3     a=VczhClass.new();
            4     a.MethodA();
            5     a.MethodB();
            6     a.MethodC();
            7 }();
            8 collect();
                這里構造了一個VczhClass并調用了三個成員函數(shù)。結束之后,這種寫法保證a再也不可被訪問到,于是調用collect進行垃圾收集(垃圾收集是自動的,但是要觸發(fā)條件很難,所以給了個函數(shù)進行強制收集)的時候就可以把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還能繼續(xù)使用,所以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
            久久激情五月丁香伊人| 久久精品无码午夜福利理论片| 久久精品国产一区二区| 色妞色综合久久夜夜| 久久久无码一区二区三区 | 久久乐国产精品亚洲综合 | 国产精品久久久久久久久| 久久国产成人亚洲精品影院| 久久天天躁狠狠躁夜夜躁2014| 欧美久久综合性欧美| 香蕉久久久久久狠狠色| 久久99毛片免费观看不卡| 一本久久免费视频| 人人狠狠综合久久亚洲婷婷| 久久无码AV中文出轨人妻| 国产女人aaa级久久久级| 国产精品久久久久AV福利动漫| 亚洲国产成人精品无码久久久久久综合 | 亚洲精品国产成人99久久| 国产精品久久久久久| 亚洲精品乱码久久久久久按摩| 久久精品国产清自在天天线| www.久久热| 97精品伊人久久大香线蕉app| 久久久久亚洲av综合波多野结衣| 国产亚洲色婷婷久久99精品91| 久久久久久无码Av成人影院| 国内高清久久久久久| 最新久久免费视频| 日本欧美国产精品第一页久久| 国产—久久香蕉国产线看观看| 久久er热视频在这里精品| 狠狠久久亚洲欧美专区| 国产精品女同久久久久电影院| 国内精品久久国产| 国产精品成人久久久| 免费久久人人爽人人爽av| 久久久久久久波多野结衣高潮 | 久久乐国产综合亚洲精品| 亚洲精品无码专区久久同性男| 久久久久一本毛久久久|