接口函数调用顺序
1.接口初始化调用newinterface()或者newinterfacewithinit,这二个函数的区别在于,前者仅进行接口初始化,而后者还要建立与服务器的连接。要注意另一个与初始化有关的函数init,它的作用是建立与服务器的连接,它在二种情况下用,一个是用newinterface()初始化时,调用它建立与服务器连接,而另一个是程序将要与二个服务器连接时,使用它,而不必调destoryinterface后,重新初始化接口。
2.所有功能号的调用都必须送入以下三个参数oper_centerid, oper_hospitalid,oper_staffid,分别表示操作的中心编号,操作的医院编号(不同的医保中心,医院编号可能不同),操作的员工号,可以封装start函数,每次start的时候默认put上面三个参数。
3.调用功能号0登录到前置服务器,不同的定点医疗机构使用不同的登陆工号。
4.执行其他功能。
5.每个功能的执行顺序如下:
1)调start启动接口(需要put操作中心号,操作医院号,操作员工号)。
2)多次调put或者putcol将参数传入接口。
3)如果有记录集,调setresultset设置记录集名,多次调put或者putcol将记录集的各域值传入接口。在Delphi中定义函数程序
FUNCTION newinterface ( ):pointer; stdcall;external 'InterfaceHN.dll';
FUNCTION newinterfacewithinit (Addr:char *; port:integer; Servlet:char * ):Pointer; stdcall;external 'InterfaceHN.dll';
FUNCTION init(pint:Pointer;Addr:char *; port:integer; Servlet:char * ):integer; stdcall;external 'InterfaceHN.dll';
Procedure destoryinterface ( pint:Pointer ); stdcall;external 'InterfaceHN.dll';
FUNCTION start ( pint:Pointer; func_id:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION put ( pint:Pointer; row:integer; pname:char *; pvalue:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION putcol ( pint:Pointer; pname:char *; pvalue:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION run ( pint:Pointer ):integer; stdcall;external 'InterfaceHN.dll';2.4.2 在Delphi中调用接口函数程序
1.创建和初始化接口示例:
procedure test_dll();
var
ll_pinterface: Pointer;
ll_port: Pointer;
ls_server:pchar;
ls_servle:pchar;
ll_ret: int;
ls_p:pchar;begin
ls_server: =” 127.0.0.1”;
ll_port: = 7001;
ls_servlet: =” Insur/ProcessAll”;
il_pinterface :=newinterfacewithinit(ls_server, ll_port, ls_servlet);
//必须每次调用getbyname函数前分配足够大的内存
if (start(il_pinterface,”BIZC131101”)<0) then exit;
ls_p:=StrAlloc(1024);
if (run(ll_pinterface)<0) then
begin
getmessage(ll_pinterface, ls_p);
howmessage(ls_p);
exit;
end;
if (getbyname(ll_pinterface, “indi_id”, ls_p)>0) then exit;
nextrow(ll_pinterface);
if (getbyname(ll_pinterface, “indi_id”, ls_p)>0) then exit;
StrDispose(ls_p);
end;我的部分代码如下:
//初始化
function Initialize():Boolean;
var
s_IP : PChar;
s_Servlet : PChar;
AFunc:function(Addr:PChar;Port:Integer;Servlet:PChar):Pointer;stdcall;
begin
//初始化
Result:=False;
GetMem(s_IP,1024);
StrPCopy(s_IP,i_IP);
GetMem(s_Servlet,1024);
StrPCopy(s_Servlet,i_Servlet);
vDatafurr := i_IP+'|'+ IntToStr(i_Port)+'|'+ i_Servlet+'|';
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Input',vDatafurr);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'newinterfacewithinit');
if @AFunc <> nil then
try
FHandle := AFunc(s_IP,i_Port,s_Servlet);
Result := True;
except
Result := False;
end;
end;
finally
if Result then
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Output',Format('成功[%D]',[Integer(FHandle)]))
else
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Output','失败');
FreeMem(S_IP);
FreeMem(s_Servlet);
end;
end;//start
function Start(pFUNC_ID:String):Boolean;
var
vFUNC_ID:PChar;
vRet:Integer;
AFunc:function(aInterface:Pointer;aFUNC_ID:Pchar):Integer;stdcall;
begin
Result := False;
vRet := -1;
GetMem(vFUNC_ID,1024);
StrPCopy(vFUNC_ID,pFUNC_ID);
vRZFile.WriteString(vTimeStr,'Start',pFUNC_ID);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'start');
if @AFunc <> nil then
vRet := AFunc(FHandle,vFUNC_ID);
Result := (vRet=1);
end;
finally
FreeMem(vFUNC_ID);
end;
end;
//传入参
function SetParam(Param:TInData):Boolean;
var
i,vRet:Integer;
AFunc:function(pDataHandle:Pointer;paramName,paramValue:PChar):integer;stdcall;
begin
Result := False;
Try
if LoadLib then
begin
Result := True;
for i:=0 to Length(Param)-1 do
begin
vRet := -1;
vRZFile.WriteString(vTimeStr,Format('Param%D',[i+1]),Format('Name[%S],Value[%S]',[StrPas(Param[i].Name),StrPas(Param[i].Value)]));
@AFunc := GetProcAddress(YBHandle, 'putcol');
if @AFunc <> nil then
vRet := AFunc(FHandle,Param[i].Name,Param[i].Value);
Result := (vRet>=0);
if not Result then
begin
GetSysMessage(vErrMsg);
Break;
end;
end;
end;
except
end;
end;//run
Function Run():Boolean;
var
vRet:Integer;
AFunc:function(pDataHandle:Pointer):Integer;stdcall;
begin
vRet := -1;
vDatafurr := '';
vRZFile.WriteString(vTimeStr,'RunInstance Input',vDatafurr);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'run');
if @AFunc <> nil then
vRet := AFunc(FHandle);
end;
finally
Result := (vRet>=0);
if Result then
begin
vRZFile.WriteString(vTimeStr,'RunInstance Output','成功');
end else
begin
GetSysMessage(vErrMsg);
vErrMsg := '运行实例失败,医保返回信息:['+IntToStr(vRet)+']'+vErrMsg;
vRZFile.WriteString(vTimeStr,'RunInstance Output',vErrMsg);
end;
end;
end;---为什么总是报:[-1]服务器返回异常,请检查网络连接状况!
[2008年01月05日17时26分41秒356]
SetParam Input=FuncNo:1001 datefurr:43020121027|43020121027|
FUNCNO=1001
Addtion=430201|43020121027|999|
newinterfacewithinit Input=10.137.67.247|7001|Insur_XT/ProcessALL|
newinterfacewithinit Output=成功[1][67051992]
Start=0
Param1=Name[oper_centerid],Value[430201]
Param2=Name[oper_hospitalid],Value[43020121027]
Param3=Name[oper_staffid],Value[999]
Param4=Name[login_id],Value[43020121027]
Param5=Name[login_password],Value[43020121027]
RunInstance Input=
RunInstance Output=运行实例失败,医保返回信息:[-1]服务器返回异常,请检查网络连接状况!
Output=FuncNo:1001 失败datefurr:运行失败运行实例失败,医保返回信息:[-1]服务器返回异常,请检查网络连接状况!
1.接口初始化调用newinterface()或者newinterfacewithinit,这二个函数的区别在于,前者仅进行接口初始化,而后者还要建立与服务器的连接。要注意另一个与初始化有关的函数init,它的作用是建立与服务器的连接,它在二种情况下用,一个是用newinterface()初始化时,调用它建立与服务器连接,而另一个是程序将要与二个服务器连接时,使用它,而不必调destoryinterface后,重新初始化接口。
2.所有功能号的调用都必须送入以下三个参数oper_centerid, oper_hospitalid,oper_staffid,分别表示操作的中心编号,操作的医院编号(不同的医保中心,医院编号可能不同),操作的员工号,可以封装start函数,每次start的时候默认put上面三个参数。
3.调用功能号0登录到前置服务器,不同的定点医疗机构使用不同的登陆工号。
4.执行其他功能。
5.每个功能的执行顺序如下:
1)调start启动接口(需要put操作中心号,操作医院号,操作员工号)。
2)多次调put或者putcol将参数传入接口。
3)如果有记录集,调setresultset设置记录集名,多次调put或者putcol将记录集的各域值传入接口。在Delphi中定义函数程序
FUNCTION newinterface ( ):pointer; stdcall;external 'InterfaceHN.dll';
FUNCTION newinterfacewithinit (Addr:char *; port:integer; Servlet:char * ):Pointer; stdcall;external 'InterfaceHN.dll';
FUNCTION init(pint:Pointer;Addr:char *; port:integer; Servlet:char * ):integer; stdcall;external 'InterfaceHN.dll';
Procedure destoryinterface ( pint:Pointer ); stdcall;external 'InterfaceHN.dll';
FUNCTION start ( pint:Pointer; func_id:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION put ( pint:Pointer; row:integer; pname:char *; pvalue:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION putcol ( pint:Pointer; pname:char *; pvalue:char * ):integer; stdcall;external 'InterfaceHN.dll';
FUNCTION run ( pint:Pointer ):integer; stdcall;external 'InterfaceHN.dll';2.4.2 在Delphi中调用接口函数程序
1.创建和初始化接口示例:
procedure test_dll();
var
ll_pinterface: Pointer;
ll_port: Pointer;
ls_server:pchar;
ls_servle:pchar;
ll_ret: int;
ls_p:pchar;begin
ls_server: =” 127.0.0.1”;
ll_port: = 7001;
ls_servlet: =” Insur/ProcessAll”;
il_pinterface :=newinterfacewithinit(ls_server, ll_port, ls_servlet);
//必须每次调用getbyname函数前分配足够大的内存
if (start(il_pinterface,”BIZC131101”)<0) then exit;
ls_p:=StrAlloc(1024);
if (run(ll_pinterface)<0) then
begin
getmessage(ll_pinterface, ls_p);
howmessage(ls_p);
exit;
end;
if (getbyname(ll_pinterface, “indi_id”, ls_p)>0) then exit;
nextrow(ll_pinterface);
if (getbyname(ll_pinterface, “indi_id”, ls_p)>0) then exit;
StrDispose(ls_p);
end;我的部分代码如下:
//初始化
function Initialize():Boolean;
var
s_IP : PChar;
s_Servlet : PChar;
AFunc:function(Addr:PChar;Port:Integer;Servlet:PChar):Pointer;stdcall;
begin
//初始化
Result:=False;
GetMem(s_IP,1024);
StrPCopy(s_IP,i_IP);
GetMem(s_Servlet,1024);
StrPCopy(s_Servlet,i_Servlet);
vDatafurr := i_IP+'|'+ IntToStr(i_Port)+'|'+ i_Servlet+'|';
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Input',vDatafurr);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'newinterfacewithinit');
if @AFunc <> nil then
try
FHandle := AFunc(s_IP,i_Port,s_Servlet);
Result := True;
except
Result := False;
end;
end;
finally
if Result then
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Output',Format('成功[%D]',[Integer(FHandle)]))
else
vRZFile.WriteString(vTimeStr,'newinterfacewithinit Output','失败');
FreeMem(S_IP);
FreeMem(s_Servlet);
end;
end;//start
function Start(pFUNC_ID:String):Boolean;
var
vFUNC_ID:PChar;
vRet:Integer;
AFunc:function(aInterface:Pointer;aFUNC_ID:Pchar):Integer;stdcall;
begin
Result := False;
vRet := -1;
GetMem(vFUNC_ID,1024);
StrPCopy(vFUNC_ID,pFUNC_ID);
vRZFile.WriteString(vTimeStr,'Start',pFUNC_ID);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'start');
if @AFunc <> nil then
vRet := AFunc(FHandle,vFUNC_ID);
Result := (vRet=1);
end;
finally
FreeMem(vFUNC_ID);
end;
end;
//传入参
function SetParam(Param:TInData):Boolean;
var
i,vRet:Integer;
AFunc:function(pDataHandle:Pointer;paramName,paramValue:PChar):integer;stdcall;
begin
Result := False;
Try
if LoadLib then
begin
Result := True;
for i:=0 to Length(Param)-1 do
begin
vRet := -1;
vRZFile.WriteString(vTimeStr,Format('Param%D',[i+1]),Format('Name[%S],Value[%S]',[StrPas(Param[i].Name),StrPas(Param[i].Value)]));
@AFunc := GetProcAddress(YBHandle, 'putcol');
if @AFunc <> nil then
vRet := AFunc(FHandle,Param[i].Name,Param[i].Value);
Result := (vRet>=0);
if not Result then
begin
GetSysMessage(vErrMsg);
Break;
end;
end;
end;
except
end;
end;//run
Function Run():Boolean;
var
vRet:Integer;
AFunc:function(pDataHandle:Pointer):Integer;stdcall;
begin
vRet := -1;
vDatafurr := '';
vRZFile.WriteString(vTimeStr,'RunInstance Input',vDatafurr);
Try
if LoadLib then
begin
@AFunc := GetProcAddress(YBHandle, 'run');
if @AFunc <> nil then
vRet := AFunc(FHandle);
end;
finally
Result := (vRet>=0);
if Result then
begin
vRZFile.WriteString(vTimeStr,'RunInstance Output','成功');
end else
begin
GetSysMessage(vErrMsg);
vErrMsg := '运行实例失败,医保返回信息:['+IntToStr(vRet)+']'+vErrMsg;
vRZFile.WriteString(vTimeStr,'RunInstance Output',vErrMsg);
end;
end;
end;---为什么总是报:[-1]服务器返回异常,请检查网络连接状况!
[2008年01月05日17时26分41秒356]
SetParam Input=FuncNo:1001 datefurr:43020121027|43020121027|
FUNCNO=1001
Addtion=430201|43020121027|999|
newinterfacewithinit Input=10.137.67.247|7001|Insur_XT/ProcessALL|
newinterfacewithinit Output=成功[1][67051992]
Start=0
Param1=Name[oper_centerid],Value[430201]
Param2=Name[oper_hospitalid],Value[43020121027]
Param3=Name[oper_staffid],Value[999]
Param4=Name[login_id],Value[43020121027]
Param5=Name[login_password],Value[43020121027]
RunInstance Input=
RunInstance Output=运行实例失败,医保返回信息:[-1]服务器返回异常,请检查网络连接状况!
Output=FuncNo:1001 失败datefurr:运行失败运行实例失败,医保返回信息:[-1]服务器返回异常,请检查网络连接状况!
解决方案 »
- 我公司招聘软件工程师(济南)
- 大家来帮我看看吧,都急死了!Delphi在设计期间打开数据库连接就会报一个BDE连接错
- 如何在Treeview中往前添加节点(在线等)
- 大家肯定有碰到這樣的情況,財務相關軟體是繁體版的,打支票的功能要求受款人輸出的是簡體字,怎麼辦呢?
- 我用Database作数据库链接为什么链不上去呀???
- 有难题了:CHART中做一条折线,如何做到:某点之前是实线,该点之后是虚线
- 谁用过ExpressQuantumGrid For Delphi6
- 高手千万别错过,进来看一看,很怪的保存图像问题?来者给分。
- <The Tomes of Delphi:Algorithms and Date Struchures>中文版海淀图书城有卖吗?
- 拼了!加69分好了!家底给你了!
- HHControlInstance := LoadLibrary( P ) 出错
- 我想在程序中连接远程服务器,并且用select语句将数据复制到本地数据库的表中,请问如何做?请高手指点
LoadLib的代码是什么?没看见呀