第二周前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.报表>?