第二周前3天.
1.登陆画面,和主窗体画面都封装了
2。tuexdo
3.控件使用(均封装在EF里面,实际上只是在原有控件基础上加EF*,然后有添加了一些属性而已)
(1)EFForm---Text对应窗体名称,EFCName类似内容页的表头,EFMsgInfo类似状态栏的信息.包含一个EFButtonBar->对应有F1 - F12,点击出发异常????
(2)EFLabelText是一个lable + textbox ;EFCname对应label的text,EFEnterText对应textbox的text
(3)EFGroupbox对应groupbox
(4)EFGrid
可以在设计窗体列编辑器中绑定列,并定义列标题,类型等.可以通过efGrid1.DataSource=dt设置数据源.也可通过 outBlock.GetBlockVal(efGrid1);
-----------------------------
//压入Block
outBlock = EI.EITuxedo.CallService("ymbw01_f2_inq",inBlock);
outBlock.GetBlockVal(efGrid1);
efGrid1.Cols["stock_type_code"].DataMap = this.stock_status_inq();
efGrid1.AutoSizeCols();
EI.EIInfo.eiinfo_sys syscls=outBlock.GetSys(); //检查返回是否正确
(5)EFPager 分页,
this.efPager3.RecordCountPerPage = 10; //每页显示条数
this.efPager3.TotalRecordCount =32; //共多少条记录
this.efPager3.CurrPageNo =0; //当前第几页
是从第0页开始的,暂时疑问double ppTest = Math.Ceiling(((double) 32) / 10); 这样做对,可为什么显示的总页数总是小1呢?--
答案::::要先设置每页显示的条数,然后设置总记录数时,自动计算总页数,此时没有每页显示的条数,则默认每页显示20条

/* **************************************************************************************
* Copyright (c) Corporation 2010 . All Rights Reserved.
* *******系统
*****************************************************************************************
* 程序名称 : Form4
* 程序描述 : 测试控件的使用
* 备注说明 :
* 修改历史 :
* 日期 作者 描述
* ---------- -------- ----------------------------------------
* 2010/607/01 9421 (created)
* ***************************************************************************************** */
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using C1.Win.C1FlexGrid;
namespace TESTFORM
{
public class Form4 : EF.EFForm
{
#region 参数定义
private EF.EFGrid efGrid1;
private EF.EFLabel efLabel1;
private EF.EFPager efPager3;
private EF.EFButton efButton1; //分页
private System.ComponentModel.IContainer components = null;
#endregion
#region 构造函数
public Form4()
{
// 该调用是 Windows 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitializeComponent 调用后添加任何初始化
System.Data.DataTable dt = this.getTable();
// this.dataGrid1.DataSource =dt;
EI.EIInfo outInfo = this.getEIInfo();
//绑定efgrid1
//this.efGrid1.DataSource = dt; //方法一
outInfo.GetBlockVal(this.efGrid1);
//设置性别的datamap(使1显示男,0显示女)
efGrid1.Cols["sex"].DataMap = this.getHashTable();
//固定前1行,前2列
efGrid1.Cols.Frozen=2;
efGrid1.Rows.Frozen=1;
//设置efgrid1的公司单元格,单击时显示列表
efGrid1.Cols["company"].ComboList="|...";
//汇总信息,汇总年龄,显示在数据下方,汇总字样显示在第一列
efGrid1.Subtotal(AggregateEnum.Clear);
efGrid1.Tree.Column = 2;
efGrid1.SubtotalPosition =SubtotalPositionEnum.BelowData ;//.AboveData;
//int totalOn = efGrid1.Cols["sex"].Index;
int totalOn = efGrid1.Cols["name"].Index;
int groupon = efGrid1.Cols["age"].Index;
efGrid1.Subtotal(AggregateEnum.Sum,0,-1,totalOn,"合计");
efGrid1.Subtotal(AggregateEnum.Sum,0,-1,groupon);
//分页(必须先设置每页显示的条数,默认20)
this.efPager3.RecordCountPerPage = 10; //每页显示条数
this.efPager3.TotalRecordCount =42; //共多少条记录
//this.efPager3.CurrPageNo = 0; //当前第几页(默认0,第一页
// double ppTest = Math.Ceiling(((double) 42) / 10); //Ceiling大于或等于指定数的最小整数
// MessageBox.Show(ppTest + "0"+this.efPager3.TotalPageCount);
}
#endregion
#region 清理所有正在使用的资源。
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#endregion
#region 设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form4));
this.efGrid1 = new EF.EFGrid(this.components);
this.efLabel1 = new EF.EFLabel();
this.efPager3 = new EF.EFPager();
this.efButton1 = new EF.EFButton();
((System.ComponentModel.ISupportInitialize)(this.efGrid1)).BeginInit();
this.SuspendLayout();
//
// efGrid1
//
this.efGrid1.BackColor = System.Drawing.SystemColors.Window;
this.efGrid1.ColumnInfo = @"11,1,0,0,0,125,Columns:0{Width:29;AllowSorting:False;Name:""grid_head"";DataType:System.Int32;TextAlign:RightCenter;} 1{Width:57;AllowSorting:False;Name:""check_option"";Caption:""选择"";AllowDragging:False;DataType:System.Boolean;TextAlignFixed:CenterCenter;ImageAlign:CenterCenter;} 2{Name:""name"";Caption:""姓名"";} 3{Name:""sex"";Caption:""性别"";} 4{Name:""age"";Caption:""年龄"";DataType:System.Int32;TextAlign:RightCenter;ImageAlign:CenterCenter;} 5{Name:""depart"";Caption:""部门"";ComboList:""|a|v|x|x|e|"";} 6{Name:""company"";Caption:""公司"";ComboList:""|..."";} ";
this.efGrid1.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw;
this.efGrid1.EFAllowMenu = true;
this.efGrid1.EFAllowMenuChoice = true;
this.efGrid1.EFAllowMenuChoiceAll = true;
this.efGrid1.EFAllowMenuNew = true;
this.efGrid1.EFAllowMenuSaveAs = true;
this.efGrid1.EFChoiceCount = 0;
this.efGrid1.EFCols = 11;
this.efGrid1.EFRows = 2;
this.efGrid1.EFUserCols = 10;
this.efGrid1.EFUserRows = 1;
this.efGrid1.ForeColor = System.Drawing.SystemColors.WindowText;
this.efGrid1.Location = new System.Drawing.Point(112, 64);
this.efGrid1.Name = "efGrid1";
this.efGrid1.Rows.Count = 2;
this.efGrid1.ShowCursor = true;
this.efGrid1.Size = new System.Drawing.Size(592, 248);
this.efGrid1.Styles = new C1.Win.C1FlexGrid.CellStyleCollection(@"Fixed{BackColor:Control;ForeColor:ControlText;Border:Flat,1,ControlDark,Both;} Highlight{BackColor:Highlight;ForeColor:HighlightText;} Search{BackColor:Highlight;ForeColor:HighlightText;} Frozen{BackColor:Beige;} EmptyArea{BackColor:AppWorkspace;Border:Flat,1,ControlDarkDark,Both;} GrandTotal{BackColor:Black;ForeColor:White;} Subtotal0{BackColor:ControlDarkDark;ForeColor:White;} Subtotal1{BackColor:ControlDarkDark;ForeColor:White;} Subtotal2{BackColor:ControlDarkDark;ForeColor:White;} Subtotal3{BackColor:ControlDarkDark;ForeColor:White;} Subtotal4{BackColor:ControlDarkDark;ForeColor:White;} Subtotal5{BackColor:ControlDarkDark;ForeColor:White;} ");
this.efGrid1.TabIndex = 3;
this.efGrid1.CellButtonClick += new C1.Win.C1FlexGrid.RowColEventHandler(this.efGrid1_CellButtonClick);
//
// efLabel1
//
this.efLabel1.BackColor = System.Drawing.Color.Transparent;
this.efLabel1.Location = new System.Drawing.Point(296, 384);
this.efLabel1.Name = "efLabel1";
this.efLabel1.TabIndex = 5;
this.efLabel1.Text = "efLabel1";
//
// efPager3
//
this.efPager3.CurrPageNo = 1;
this.efPager3.Location = new System.Drawing.Point(432, 320);
this.efPager3.Name = "efPager3";
this.efPager3.RecordCountPerPage = 20;
this.efPager3.Size = new System.Drawing.Size(376, 24);
this.efPager3.TabIndex = 6;
this.efPager3.TotalRecordCount = 50;
this.efPager3.PageUpClicked += new System.EventHandler(this.efPager3_PageUpClicked);
this.efPager3.PageBottomClicked += new System.EventHandler(this.efPager3_PageBottomClicked);
this.efPager3.DragEnter += new System.Windows.Forms.DragEventHandler(this.efPager3_DragEnter);
this.efPager3.PageTopClicked += new System.EventHandler(this.efPager3_PageTopClicked);
this.efPager3.PageDownClicked += new System.EventHandler(this.efPager3_PageDownClicked);
//
// efButton1
//
this.efButton1.DialogResult = System.Windows.Forms.DialogResult.None;
this.efButton1.EnabledEx = false;
this.efButton1.FnNo = 0;
this.efButton1.Font = new System.Drawing.Font("宋体", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel);
this.efButton1.Hint = "";
this.efButton1.Image = ((System.Drawing.Image)(resources.GetObject("efButton1.Image")));
this.efButton1.Location = new System.Drawing.Point(632, 376);
this.efButton1.Name = "efButton1";
this.efButton1.Size = new System.Drawing.Size(128, 40);
this.efButton1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.efButton1.TabIndex = 7;
this.efButton1.TabStop = false;
this.efButton1.Text = "efButton1";
this.efButton1.Click += new System.EventHandler(this.efButton1_Click);
//
// Form4
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(1016, 734);
this.Controls.Add(this.efButton1);
this.Controls.Add(this.efPager3);
this.Controls.Add(this.efLabel1);
this.Controls.Add(this.efGrid1);
this.Location = new System.Drawing.Point(0, 0);
this.Name = "Form4";
this.Controls.SetChildIndex(this.efGrid1, 0);
this.Controls.SetChildIndex(this.efLabel1, 0);
this.Controls.SetChildIndex(this.efPager3, 0);
this.Controls.SetChildIndex(this.efButton1, 0);
((System.ComponentModel.ISupportInitialize)(this.efGrid1)).EndInit();
this.ResumeLayout(false);
}
#endregion
#region 获取dataTable
public System.Data.DataTable getTable()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataColumn dc1 = new System.Data.DataColumn("name",typeof(string));
System.Data.DataColumn dc2 = new System.Data.DataColumn("age",typeof(string));
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
for(int i=1;i<6;i++)
{
System.Data.DataRow dr = dt.NewRow();
dr[0]="pp";
dr[1] ="22";
dt.Rows.Add(dr);
}
return dt;
}
#endregion
#region 获取EIInfo
public EI.EIInfo getEIInfo()
{
EI.EIInfo outInfo = new EI.EIInfo();
outInfo.SetColName(1,"name");
outInfo.SetColName(2,"sex");
outInfo.SetColName(3,"age");
outInfo.SetColName(4,"depart");
outInfo.SetColName(5,"company");
for(int i = 1;i<6;i++)
{
outInfo.SetColVal(i,"name","sun"+i);
outInfo.SetColVal(i,"sex",i%2==0?1:0);
outInfo.SetColVal(i,"age",""+i*3);
outInfo.SetColVal(i,"depart","depart"+i);
outInfo.SetColVal(i,"company","company"+i);
}
return outInfo;
}
#endregion
#region 获取HashTable
public System.Collections.Hashtable getHashTable()
{
System.Collections.Hashtable ht = new Hashtable();
ht.Add("1","男");
ht.Add("0","女");
return ht;
}
#endregion
#region 当单击efGrid一个单元格时
private void efGrid1_CellButtonClick(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
if(this.efGrid1.Cols[e.Col].Name =="company")
{
EI.EIInfo outBlock = this.getEIInfo();
int choice = outBlock.GetDropDownChoice(EF.EFFunction.EFGetRectangle(efGrid1,e.Row,e.Col),30);
if(choice !=-1)
{
this.efGrid1[e.Row,"company"] = outBlock.GetColVal(choice,"company");
}
}
}
#endregion
#region 分页控件事件
private void efPager3_PageBottomClicked(object sender, System.EventArgs e)
{
this.efPager3.CurrPageNo = this.efPager3.TotalPageCount -1;
}
private void efPager3_PageDownClicked(object sender, System.EventArgs e)
{
this.efPager3.CurrPageNo = this.efPager3.CurrPageNo + 1;
}
private void efPager3_PageTopClicked(object sender, System.EventArgs e)
{
this.efPager3.CurrPageNo =0;
}
private void efPager3_PageUpClicked(object sender, System.EventArgs e)
{
this.efPager3.CurrPageNo = this.efPager3.CurrPageNo - 1;
}
#endregion
#region efbutton按钮事件
private void efButton1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("pageCount:"+this.efPager3.RecordCountPerPage);
}
#endregion
}
}
--------------------------------------------------------------------------------------------------
4.数据分发
(1)配置画面ED00 ---
配置前确定所配置的函数已在后台编译通过
新增(功能名,序号,函数名,关键码1必输)->F7生产文件-->系统将生成2个配置文件(edcall_func_map_data.h,edcall_func_map_declare.h)
(*data.h是数据分发中心配置信息映射数据, *declare.h是通过数据分发调用的函数声明文件)
-----完成了前台的配置后,需到后台的ed的目录下编译函数及service--生成的配置问件将在后台编译Ed的函数和service将作为头文件引用
(2)前台调用
EI.EIInfo.eiinfo_ed ed = new EI.EIInfo.eiinfo_ed();
ed.func_name[0] = "PSRS_SELECT_PLANMAT";
ed.pk_name[0] = "WHOLE_BACKLOG_CODE";
ed.pk_val[0] = efComboBox2.Text;
inBlock.SetED(ed);
outBlock = EI.EITuxedo.EDCall(inBlock);
5.字段显示配置
(1)配置画面EDA2----
需要在后台的函数或service事先声明功能的标识.
如:有一个查询service,查询的是表tpsrsd0的所有字段,且该service使用了名功能标示"PSRS01DO_INQ",如果前台使用了对他自定义显示配置,则前台只能看到配置画面左边的字段
(2)使用
要事先把TTA的数据导入TEDA2,TEDA5中.在右边输入查询条件按查询,则显示所有查询出的字段,选中要修改的点击对应的加入,删除修改等
6。报表
-----------------------------------------------------------------------------------------------
7。了解下tuxedo的使用,如何在前台调用后台;
(1).基本操作(调用后台程序)
//定义参数(类似parameter或Dictory)
EI.EIInfo inBlock = new EI.EIInfo();
EI.EIInfo outBlock ; //设置参数值 inBlock.SetColName(1,"whole_block_code");
inBlock.SetColVal(1,1,"Test");
//调用后台方法类wowo_view
outBlock = EI.EITuxedo.CallService("wowo_view",inBlock);
if(outBlock.sys_info.flag != 0)
{//失败;}
str = outBlock.GetColVal(choice,"whole_backlog_code");
(2)a....中间件定义::::中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。
中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。
相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。
执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或 OS 环境。
b....中间件特点::::: 满足大量应用的需要运行于多种硬件和OS平台支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互支持标准的协议支持标准的接口。
由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。
对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。
c...人们一般把Tuxedo作为第一个严格意义上的中间件产品。
8。Pro*C
// C 的标准头文件部分
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdarg.h>
//EI头文件
#include "EI_TUXClass.h"
int f_ymbw01_rk(EIClass * bcls_rec, EIClass * bcls_ret)
{
/*定义函数名*/
char FunctionEname[31]=""; //定义函数英文名称
char FunctionCname[201]=""; //定义函数中文名称
char ProcessName[201]=""; //定义进程名称
strcpy(FunctionEname,"f_ymbw01_rk"); //赋值函数英文名称-------要修改为对应的
strcpy(FunctionCname,"材料新增"); //赋值函数中文名称-------要修改为对应的
/*记录日志*/
EDLog(1, 1, " **************%s begin*****************",FunctionEname);
/*程序用变量*/
char rtnmsg[20]=" "; // -------要修改为对应的
/*Pro*c 标准头文件部分*/
EXEC SQL INCLUDE SQLCA;
/*使用的表结构变量*/
EXEC SQL INCLUDE tmmem01.h; // -------要修改为对应的
/*在SQL语句中使用的变量*/
EXEC SQL BEGIN DECLARE SECTION;
int v_count_num = 0; // -------要修改为对应的
EXEC SQL END DECLARE SECTION;
/*设置出错处理*/
EXEC SQL WHENEVER SQLERROR GOTO l_sqlerror;
/*设置块名*/
blkNum = bcls_rec->AtBlkName("MMBWEM99"); // -------要修改为对应的
if (blkNum<=0)
{
blkNum = bcls_rec->AddBlock();
bcls_rec->SetBlkName(blkNum, "MMBWEM99");
}
/*获得传入参数*/ // -------要修改为对应的
bcls_rec->GetSYS(&s);
s.flag=0;
strcpy(v_ueser,s.userid);
gettime(datetime);
/* ------------------ 读取前台 ---------------------------*/
EDLog(1, 1,"读取前台"); // -------要修改为对应的
bcls_rec->GetColVal("YMBWRK", 1, "mat_no", v_mat_no); //材料号
bcls_rec->GetColVal("YMBWRK", 1, "mat_kind", v_mat_kind); //材料类型
EDLog(1, 1, "材料号= [%s],材料类型= [%s]",v_mat_no,v_mat_kind);
/*----------------逻辑处理----------------*/// -------要修改为对应的
exec sql
select count(*)
into :v_count
from tymbw33
where stock_no=:v_stock_code and stock_place_no=:v_pile_no;
if(v_count==0)
{
sprintf(s.msg,"库区%s垛位%s不存在,入库失败",v_stock_code,v_pile_no);
s.flag = -1;
goto l_apperror;
}
/*--------------------处理结果跳转到--------------------*/// -------要修改为对应的
l_sqlerror:
/*设置系统返回参数*/
s.flag = -1;
s.sqlcode = sqlca.sqlcode; //返回SQLCODE
strcpy(s.sqlmes,sqlca.sqlerrm.sqlerrmc); //返回SQLMSG
EDLog(1,1,"sqlca.sqlcode=[%d]",s.sqlcode);
if( sqlca.sqlcode == 1403 )
strcpy(s.msg,"找不到数据!");
else if( sqlca.sqlcode == -1405 )
strcpy(s.msg,"当前表找不到数据!");
else if( sqlca.sqlcode == -1 )
strcpy(s.msg,"主键重复!");
else if( sqlca.sqlcode == -1438 )
strcpy(s.msg,"数据类型或长度错误!");
else if( sqlca.sqlcode == -1722 )
strcpy(s.msg,"无效的数据");
else if( sqlca.sqlcode == -1480 )
strcpy(s.msg,"字符串超长!");
else
strcpy(s.msg,"数据库操作错误!");
goto l_return;
l_apperror:
/*设置用户返回参数*/
s.flag = -1;
strcpy(s.msg," 操作失败! "); //返回信息
goto l_return;
l_suberror:
/*设置系统返回参数*/
EDLog(1,1,"进入了1_suberror,");
s.flag = -1;
bcls_ret->GetSYS(&s);
strcpy(ProcessName,"");
goto l_return;
l_return:
doFlag =s.flag ;
bcls_ret->SetSYS(s);
EDLog(1, 1, "doFlag=[%d]",doFlag);
EDLog(1, 1, "S.MSG=[%s]",s.msg);
EDLog(1, 1, "S.SQLCODE=[%d]",s.sqlcode);
EDLog(1, 1, "S.SQLMES=[%s]",s.sqlmes);
EDLog(1,1,"--------调用f_ymbw01_rk结束-------");
return doFlag;
}
(2)说明整体结构是c语言(或说C++),加入了sql语句EXEC开头,sql中用到的参数要在EXEC SQL BEGIN DECLARE SECTION; 下定义;
对于直接和数据库交互的表结构,将由辅助工具自动生成,以EXEC SQL INCLUDE tmmem01.h;引入.
9.
String不可变,每次赋值都会产生新的对象,浪费内存.如:String a="String"会为a分配一个内存区域存放字符串"String"
而a=a+“String2”这时候不是在原有的那个内存区域上改变,而是会产生一块新的内存区域,赋值给a。这才是改变的本质。
StringBuffer为可变,每次改变对象内容不会产生新的对象,不浪费内存
10。
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。 DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。
(1) 应用如:(用 DllImport 属性修饰的方法必须具有 extern 修饰符|||需要在程序声明中使用System.Runtime.InteropServices命名空)
[DllImport("libwsc", SetLastError=true)]
public static extern int tpacall([MarshalAs(UnmanagedType.LPStr)] string svc, IntPtr idata, int ilen, int flags);
(2)DllImport会按照顺序自动去寻找的地方: 1、exe所在目录 2、System32目录 3、环境变量目录所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了 .
(3)一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。
C#对于托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下...对于非托管的dll,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后
在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了. 需要使用DllImport
11.
public static extern int tpacall([MarshalAs(UnmanagedType.LPStr)] string svc, IntPtr idata, int ilen, int flags);
a.MarshalAs:MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。当 MarshalAsAttribute.Value 设置为 ByValArray 时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组元素的 UnmanagedType。此 UnmanagedType 只可用于作为结构中的字段的数组。而SizeConst则是指数组中的元素个数。
b.UnmanagedType::::MarshalAsAttribute 属性提供了若干个 UnmanagedType 枚举值,以便将字符串封送到 COM 接口。
UnmanagedType.BStr(默认)
具有预设长度和 Unicode 字符的 COM 样式的 BSTR。
UnmanagedType.LPStr
指向 ANSI 字符的空终止数组的指针。
UnmanagedType.LPWStr
指向 Unicode 字符的空终止数组的指针。
12..
ATMI,Application-to-Transaction Monitor Interface,即“应用事务监视接口”,是TUXEDO系统的编程接口。他实现了X/Open组织定义的分布式事务处理(DTP)模型,为应用程序提供命名、通信、队列、事务和缓冲区管理等基础服务。
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=zxc)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcalDB)))
13..C# 修改注册表,,调用其他语言的dll
14.报表>?