用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傳入格式查看范例
uj5u.com熱心網友回復:
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.
uj5u.com熱心網友回復:
大哥你寫的代碼,在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.
uj5u.com熱心網友回復:
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 ;
uj5u.com熱心網友回復:
大大,這個函式呼叫的時候,怎么傳引數,能寫個函式呼叫的示例嗎?uj5u.com熱心網友回復:
//沒有實際運行測驗過,你自己看看行不行。
//如果你的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.
uj5u.com熱心網友回復:
接著討論下,我把單元上面都寫好了:寫了一個呼叫介面函式的代碼,報錯

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;
uj5u.com熱心網友回復:
他用的D7,不支持record with methods,可以使用object型別替換,這個從TP 5.5就支持了,相當于C++的class/struct,而且支持property。uj5u.com熱心網友回復:
小弟有些不解,現在這個函式能這樣呼叫嗎?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;
uj5u.com熱心網友回復:
//這個試試看吧
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.
uj5u.com熱心網友回復:
//更正: 把下面的陳述句
DllHandle := LoadLibrary(PChar('ODBC32.DLL'));
//改為
DllHandle := LoadLibrary(PChar('GRGOPENAPI.DLL'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39557.html
上一篇:C++注入新手遇到問題
下一篇:cGRID 在 Editing = False 的時候 怎么 才能在復制的時候 只 復制 單元格的 內容 在不改 列的 properties的情況下 有什么辦法
