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\\";
- 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中的多线程方法" οnclick="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)
{
//实现
}
}