接口函数调用顺序
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]服务器返回异常,请检查网络连接状况!