Delphi 7调用接口API C++ DLL 带结构体的函数问题?

msony 2018-07-23 07:41:25
用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传入格式查看范例



...全文
495 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueStorm 2018-07-25
  • 打赏
  • 举报
回复

//更正: 把下面的语句
DllHandle := LoadLibrary(PChar('ODBC32.DLL'));
//改为
DllHandle := LoadLibrary(PChar('GRGOPENAPI.DLL'));
BlueStorm 2018-07-25
  • 打赏
  • 举报
回复

//这个试试看吧
unit Unit2;

interface

const
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;

implementation

uses 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.
msony 2018-07-25
  • 打赏
  • 举报
回复
小弟有些不解,现在这个函数能这样调用吗?
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;
浮生-若梦 2018-07-24
  • 打赏
  • 举报
回复

unit _8583

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 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.
  • 打赏
  • 举报
回复
他用的D7,不支持record with methods,可以使用object类型替换,这个从TP 5.5就支持了,相当于C++的class/struct,而且支持property。
msony 2018-07-24
  • 打赏
  • 举报
回复
接着讨论下,我把单元上面都写好了:
写了一个调用接口函数的代码,报错



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;
BlueStorm 2018-07-24
  • 打赏
  • 举报
回复

//没有实际运行测试过,你自己看看行不行。
//如果你的char是双字节的话,把AnsiChar改为Char, 把PAnsiChar改为PChar
unit u8583;

interface

const
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;

implementation

procedure 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.

msony 2018-07-24
  • 打赏
  • 举报
回复
大大,这个函数调用的时候,怎么传参数,能写个函数调用的示例吗?
  • 打赏
  • 举报
回复
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 ;
msony 2018-07-24
  • 打赏
  • 举报
回复
大哥你写的代码,在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.

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧