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)

{

         //实现

}

}

posted @ 2013-05-06 17:14  政政糖  阅读(551)  评论(0编辑  收藏  举报