用C语言编写的API DLL接口文件
这是头文件,在Delphi中如何改写和调用了这几个接口函数了?急求大牛帮助?#ifndef _OPENAPI_H_
#define _OPENAPI_H_
#include <iostream>typedef struct t8583
{
char m_acTermCode[16];  //终端号
char m_acTraceSerial[7];                 //终端流水号,定长6位,不足左补0且在同一天内不允许重复
char m_acAmount[13];                     //金额,单位分,定长12位,不足左补0
char m_acRespCode[4];  //响应码
char m_acNonceStr[20];                //检索参考号
char m_acPrivate[1000];  //报文私有数据域
char m_acAddition[1000];  //报文附加数据域
char m_acDetail[1000];  //报文数据明细域
t8583()
{
memset(m_acTermCode, 0, sizeof(m_acTermCode));
memset(m_acTraceSerial, 0, sizeof(m_acTraceSerial));
memset(m_acAmount, 0, sizeof(m_acAmount));
memset(m_acRespCode, 0, sizeof(m_acRespCode));
memset(m_acNonceStr, 0, sizeof(m_acNonceStr));
memset(m_acPrivate, 0, sizeof(m_acPrivate));
memset(m_acAddition, 0, sizeof(m_acAddition));
memset(m_acDetail, 0, sizeof(m_acDetail));
}
}t8583;//#define    GRGOPENAPI
#define GRGOPENAPI _declspec (dllexport)/*! \brief 这是签到调用的打解包接口函数
\param   data    入参 存放结构体数据
\param   msg     出参 存放转换后的8583报文
\param   msgLen  出参 存放转换后8583报文的长度
\return  布尔值
- true   成功
- false  失败,参数不正确或者数据有误
\note  data传入格式查看范例
*/
GRGOPENAPI bool bPackSignin8583(const t8583& data, unsigned char* msg, int& msgLen);
/*! \brief 这是签到调用的打解包接口函数
\param   data    出参 存放结构体数据
\param   msg     入参 存放网络接收的8583报文
\param   msgLen  入参 存放网络接收的8583报文长度
\return  布尔值
- true   成功
- false  失败,参数不正确或者数据有误
\note  data传入格式查看范例
*/
GRGOPENAPI bool bUnpackSignin8583(t8583& data, const unsigned char* msg, int& msgLen);
/*! \brief 这是签退调用的打包接口函数
\param   data    入参 存放结构体数据
\param   msg     出参 存放转换后的8583报文
\param   msgLen  出参 存放转换后8583报文的长度
\return  布尔值
- true   成功
- false  失败,参数不正确或者数据有误
\note  data传入格式查看范例
*/
GRGOPENAPI bool bPackSignout8583(const t8583& data, unsigned char* msg, int& msgLen);
/*! \brief 这是签退调用的解包接口函数
\param   data    出参 存放结构体数据
\param   msg     入参 存放网络接收的8583报文
\param   msgLen  入参 存放网络接收的8583报文长度
\return  布尔值
- true   成功
- false  失败,参数不正确或者数据有误
\note  data传入格式查看范例

解决方案 »

  1.   


    unit _8583interfaceconst DLLNAME = '你的dll名称'

    type 
    t8583 = record
    m_acTermCode = array[0..15] of char;
    m_acTraceSerial = array[0..6] of char;
    m_acAmount = array[0..12] of char;
    m_acRespCode = array[0..3] of char;
    m_acNonceStr = array[0..19] of char;
    m_acPrivate = array[0..999] of char;
    m_acAddition = array[0..999] of char;
    m_acDetail = array[0..999] of char;
    end;
    implementation
    function bPackSignin8583(const data: Pointer; msg:PAnsiChar; msgLen: PInteger):Boolean; cdecl; external DLLNAME name='bPackSignin8583';
    function bUnpackSignin8583(data: Pointer; const msg:PAnsiChar; msgLen: PInteger):Boolean;cdecl; external DLLNAME name='bUnpackSignin8583';
    function bPackSignout8583(const data: Pointer; msg:PAnsiChar; msgLen: PInteger):Boolean;cdecl; external DLLNAME name='bPackSignout8583';
    end.
      

  2.   

    大哥你写的代码,在delphi 7中不能执行,我改了下你的代码,你看对不对,在请教下,如果调用这几个函数时,这个结构体,怎么赋值传参进函数了?
    unit U8583;interface
     
    const
     
        DLLNAME = '你的dll名称'  ;
         
    type
        t8583 = record
            m_acTermCode :array[0..15] of char;
            m_acTraceSerial : array[0..6] of char;
            m_acAmount : array[0..12] of char;
            m_acRespCode : array[0..3] of char;
            m_acNonceStr : array[0..19] of char;
            m_acPrivate : array[0..999] of char;
            m_acAddition : array[0..999] of char;
            m_acDetail : array[0..999] of char;
        end;implementation
        function bPackSignin8583(const data: Pointer; msg:PAnsiChar; msgLen: PInteger):Boolean; cdecl; external DLLNAME ;
        function bUnpackSignin8583(data: Pointer; const msg:PAnsiChar; msgLen: PInteger):Boolean;cdecl; external DLLNAME ;
        function bPackSignout8583(const data: Pointer; msg:PAnsiChar; msgLen: PInteger):Boolean;cdecl; external DLLNAME ;
    end.
      

  3.   

    function bPackSignin8583(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME ;
    function bUnpackSignin8583(var data: t8583; const msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME ;
    function bPackSignout8583(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME ;
      

  4.   


    //没有实际运行测试过,你自己看看行不行。
    //如果你的char是双字节的话,把AnsiChar改为Char, 把PAnsiChar改为PChar
    unit u8583;interfaceconst
      DLLNAME = '你的dll名称';type
      t8583 = packed record
        m_acTermCode   : array[0..15 ] of AnsiChar;
        m_acTraceSerial: array[0..6  ] of AnsiChar;
        m_acAmount     : array[0..12 ] of AnsiChar;
        m_acRespCode   : array[0..3  ] of AnsiChar;
        m_acNonceStr   : array[0..19 ] of AnsiChar;
        m_acPrivate    : array[0..999] of AnsiChar;
        m_acAddition   : array[0..999] of AnsiChar;
        m_acDetail     : array[0..999] of AnsiChar;
        procedure t8583;
      end;  function bPackSignin8583  (const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME;
      function bUnpackSignin8583(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME;
      function bPackSignout8583 (const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl; external DLLNAME;implementationprocedure t8583.t8583;
    begin
      FillChar(m_acTermCode   , SizeOf(m_acTermCode   ), 0);
      FillChar(m_acTraceSerial, SizeOf(m_acTraceSerial), 0);
      FillChar(m_acAmount     , SizeOf(m_acAmount     ), 0);
      FillChar(m_acRespCode   , SizeOf(m_acRespCode   ), 0);
      FillChar(m_acNonceStr   , SizeOf(m_acNonceStr   ), 0);
      FillChar(m_acPrivate    , SizeOf(m_acPrivate    ), 0);
      FillChar(m_acAddition   , SizeOf(m_acAddition   ), 0);
      FillChar(m_acDetail     , SizeOf(m_acDetail     ), 0);
    end;end.
      

  5.   

    接着讨论下,我把单元上面都写好了:
    写了一个调用接口函数的代码,报错procedure TForm1.Button1Click(Sender: TObject);
    var
      Sdata:t8583 ;
      Smsg:PAnsiChar ;
      ImsgLen:Integer ;
    begin
      Sdata.m_acTermCode :='GA000001';
      Sdata.m_acTraceSerial :='000001';
      bPackSignin8583(Sdata,Smsg,ImsgLen);
    end;
      

  6.   

    他用的D7,不支持record with methods,可以使用object类型替换,这个从TP 5.5就支持了,相当于C++的class/struct,而且支持property。
      

  7.   

    小弟有些不解,现在这个函数能这样调用吗?
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Sdata:t8583 ;
      Smsg:PAnsiChar ;
      ImsgLen:Integer ;
    begin
      Sdata.m_acTermCode :='GA000001';
      Sdata.m_acTraceSerial :='000001';
      bPackSignin8583(Sdata,Smsg,ImsgLen);
    end;
      

  8.   


    //这个试试看吧
    unit Unit2;interfaceconst
      DLLNAME = 'GRGOPENAPI.DLL';type
      TInitProc = procedure(); cdecl;
      t8583 = record
        m_acTermCode   : array[0..15 ] of AnsiChar;
        m_acTraceSerial: array[0..6  ] of AnsiChar;
        m_acAmount     : array[0..12 ] of AnsiChar;
        m_acRespCode   : array[0..3  ] of AnsiChar;
        m_acNonceStr   : array[0..19 ] of AnsiChar;
        m_acPrivate    : array[0..999] of AnsiChar;
        m_acAddition   : array[0..999] of AnsiChar;
        m_acDetail     : array[0..999] of AnsiChar;
        t8583: TInitProc;
      end;  TbPackSignin8583   = function(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl;
      TbUnpackSignin8583 = function(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl;
      TbPackSignout8583  = function(const data: t8583; msg: PAnsiChar; var msgLen: Integer): Boolean; cdecl;var
      Data: t8583;
      DllHandle: THandle;
      bPackSignin8583  : TbPackSignin8583  ;
      bUnpackSignin8583: TbUnpackSignin8583;
      bPackSignout8583 : TbPackSignout8583 ;procedure InitProc(); cdecl;implementationuses Windows;procedure InitProc(); cdecl;
    begin
      with Data do
      begin
        FillChar(m_acTermCode   , SizeOf(m_acTermCode   ), 0);
        FillChar(m_acTraceSerial, SizeOf(m_acTraceSerial), 0);
        FillChar(m_acAmount     , SizeOf(m_acAmount     ), 0);
        FillChar(m_acRespCode   , SizeOf(m_acRespCode   ), 0);
        FillChar(m_acNonceStr   , SizeOf(m_acNonceStr   ), 0);
        FillChar(m_acPrivate    , SizeOf(m_acPrivate    ), 0);
        FillChar(m_acAddition   , SizeOf(m_acAddition   ), 0);
        FillChar(m_acDetail     , SizeOf(m_acDetail     ), 0);
      end;
    end;initialization
      Data.t8583 := InitProc;
      DllHandle := LoadLibrary(PChar('ODBC32.DLL'));
      @bPackSignin8583   := GetProcAddress(DllHandle, 'bPackSignin8583'  );
      @bUnpackSignin8583 := GetProcAddress(DllHandle, 'bUnpackSignin8583');
      @bPackSignout8583  := GetProcAddress(DllHandle, 'bPackSignout8583' );end.
      

  9.   


    //更正: 把下面的语句
      DllHandle := LoadLibrary(PChar('ODBC32.DLL'));
    //改为
      DllHandle := LoadLibrary(PChar('GRGOPENAPI.DLL'));