zoukankan      html  css  js  c++  java
  • Visual Studio 自动生成C#的向导开发

    1.      先暂且作成调用exe生成文件再用js进行拷贝的方式;

    ·后期再考虑移植的问题,即把exe 的界面移植到向导中,并且不再进行文件拷贝,而是js调用客户端activeX dll 中的方法来直接生成源码文件;

    2.      遇到DLL项目增加文件的问题

    a)        不能增加到client端;

    b)        需要更新文件名称;

    c)        需要更新内容;

    3.      制作向导时,default.js文件

    a)        取得本机的我的文档的地址并启动相关exe

    ·   var   net=new   ActiveXObject("WScript.Network");

             var temp = objFSO.GetDriveName(folderpath)+ "\\Documents and Settings\\"+net.UserName+ "\\My Documents\\";

             //var rootFilePath = "file:///C:\\Documents%20and%20Settings\\FreedomLive\\My%20Documents\\Visual%20Studio%202008\\Projects\\RDSWizardPro\\WizardFiles\\";

             var path = temp + "Visual Studio 2008\\Projects\\RDSWizardPro\\WizardFiles\\";

    1.          var rootFilePath = "file:///" + path.replace(/[ ]/g,"%20");

    ·  用wizard.AddSymbol('HEAD',ReadFile(HeadFilePath));来读取相应的文件到标签时,要确保源文件的保存源码格式为utf-8;

    4.      C# 开发ActiveX,并由html调用

    ·  用C# 开发ActiveX且把其嵌入到HTML中;

    n  新建一个类库

    n  修改项目的"属性",在“生成”选项中把“输出”中的“为com互操作注册”勾中,然后再到“应用程序”选项中找到“程序集信息”按钮,点击它,在弹出的界面中勾中“使程序集COM可见(M)”

    n  修改AssemblyInfo.cs,增加[assembly: AllowPartiallyTrustedCallers()]

    n  新建一个IObjectSafety接口文件IObjectSafety.cs

    n  向初始网站界面,增加代码#region IObjectSafety 成员 ... #endregion这一段的内容是固定的;

    n  <object id="x" classid="clsid:DE40899C-6DF8-47f2-A654-5B906BBE58EF"></object>

     <hr />

     <input type="button" value="调用ActiveX中的多线程方法" onclick="fnTest()" />

     <script type="text/javascript">

     var fnTest = function(){

         var x = document.getElementById("x");

          alert(x.Hello('zfffz'));

    }

     </script>

    5.       ActiveX与项目模板的通信与融合

    a)          


    1.       var strTextStream = InfFile.OpenAsTextStream(1, -2);    //打开指定的文件并返回一个TextStream 对象,此对象用于对文件进行读、写或追加操作。

    常数 值 描述

      ForReading 1 以只读模式打开文件。不能对此文件进行写操作。

      ForWriting 2 以可读写模式打开文件。如果已存在同名的文件,则覆盖旧的文件。

      ForAppending 8 打开文件并在文件末尾进行写操作。

      format 参数可为下列设置之一:

      常数 值 描述

      TristateUseDefault -2 以系统默认格式打开文件。

      TristateTrue -1 以 Unicode 格式打开文件。

      TristateFalse 0 以 ASCII 格式打开文件。


    1.    客户端函数调用类型 Test

    2.    生成接口类CTestRDSClient

    3.    生成服务器端类CTestRDSService

    4.    NOTICE

    a)      把资源申请放到构造函数中,当使用类调用时,或者把接口类作为全局变量,或者做为成员变量,前者需要在程序退出时析构,造成长时间对资源的占用;另一种方法就是作为调用方的成员变量,构造时申请,析构时释放;

    b)     Threadnum多线程的问题。


    1.    目标

    /**

     * 用户想要得到的结果,但想把Fun1与Fun2的实现都放到资源端

     */

    class CTest

    {

    public:

             CTest();

             ~CTest();

             Class_A  Fun1 (int a, char  b, struct_A &  c);

             double  Fun2 (double a, class_A &  b);

    };


    //自定义类                         //自定义结构体     

    Class  Class_A                          Struct struct_A        

    {                                             {       

             int a,                                     int a,

             int b                                      int b,

    }                                             }       


    2.    结果

    //需要用户手动做,即用户实际完成后的使用方式

    //实例化对象

    CTestRDSClient  RdsClient = new CTestRDSClient( 1203 );

    //调用函数 Fun1

    RdsClient.Fun1( … );

    //调用函数 Fun2

    RdsClient.Fun2( … );


    3.    客户端自动生成类

    ///////////////////////

    // 用户根据向导,简单模式,直接计算;自定义模式,生成调用类调用自动生成函数计算

    // 添写函数名,选择参数类别,对于自定义类则需要用户添写;

    /////////////////////

    /**                                                          

     * 由向导自动生成的用于RDS系统客户端的类                                                        

     */                                                          

    class CTestRDSClient                                                              

    {                                                               

    public:     

             //全局资源Id                                      

             int           globalId ;

    private:

             //申请线程数                                               

             int           threadNum;

             int*           pErrorCode;

    char*        pErrorInfo

    public:

             //默认构造函数                                                    

             CTestRDSClient();                                                  

            

             //自定义构造函数                                               

             CTestRDSClient(const int32  globalID,  const  int32  iThreadNum = 1)

             {

                       iGlobalId = globalID;

                       threadNum = iThreadNum;

                       //申请资源,捕捉错误并弹出提示

                       Int  iReturn = ApplyResource (iGlobalID,  iThreadNum,  pErrorCode,  pErrorInfo);

                       If(iReturn !=0)

                       {

                                MSgBox(“错误!”);

    }

    }

            

             //析构函数,释放资源,捕捉错误并弹出提示                   

             ~CTestRDSClient()           

    {

             int  ReleaseResource (  iGlobalID,     pErrorCode,     pErrorInfo );

    If(iReturn !=0)

                       {

                                MSgBox(“错误!”);

    }

    }

            

             //直接调用Com中Compute接口                 

             Class_A  Fun1(int a,  char  b, struct_A & c)

    {

             //把参数转换为结构体对象

             //把结构体对象转换为字节流pinArray

             int  Compute (FunType  funcName, pInArray, iInLength, pOutArray, pOutLength)

             //把返回的字节流转换为返回值对象

    }       

             //直接调用Com中Compute接口                                    

             double  Fun2(double a, class_A &  b);         

    };                                                              


    //函数枚举

    Enum  FunType

    {

             Fun1 = 0;

             Fun2 = 1;

    }

    //自动生成参数结构体,一来方便转换,二来需要与资源端统一共用

    //函数Fun1的参数结构体

    Struct  Struct_Fun1

    {

    int a,

    char* b,

    struct_A c

    }

    //函数Fun2的参数结构体

    Struct  Struct_Fun2

    {

    double a,

            class_A b

    }


    4.    计算资源端自动生成类

    //.H文件

    Class  CTestRDSService

    {

             Public:

    int run( char*  pInArray , int  iInLength,char*  pOutArray , int*  piOutLength, int  iFuncId);

    pirvate:

                       Class_A  Fun1(int a, char* b, struct_A c)

    double  Fun2(double a, class_A b);       

    }

    //.CPP文件

    Class  CTestRDSService

    {

    int run( char*  pInArray , int  iInLength,char*  pOutArray , int*  piOutLength, int  iFuncId)

    {

             //根据FuncId来判断调用哪个函数

             Switch( FunType  funName)

             {

                       Case FunType.Fun1:

                                //根据字节流生成参数结构体对象;进而得到每个参数值

                                Fun1(…);

    break;

                       Case FunType.Fun2:

                                Fun2(…);

                                break;

    }

    }

                       Class_A  Fun1(int a, char  b, struct_A &  c)

    {

             //实现

    }

    double  Fun2(double a, class_A &  b)

    {

             //实现

    }

    }

    世界是你们的,也是我们的,但归根结底是他们的。
  • 相关阅读:
    js中call,apply,bind方法的用法
    使用react脚手架初始化一个项目
    常用的CSS居中方式
    react组件之间的通信
    React脚手架less的安装
    js操作DOM的方法
    常用的ement语法
    本机系统通过SSH访问虚拟机中的Linux系统
    Java_amr格式转mp3
    linux/ubantu 安装 mysql 并且使其支持远程连接
  • 原文地址:https://www.cnblogs.com/mqgh/p/3063150.html
Copyright © 2011-2022 走看看