问题描述
我是delphi的新手,我的delphi开发的程序与C ++开发的dll一起使用,我需要使用抛出Access Violation地址异常的指针函数,并且经过多次测试,我不知道如何解决它。 / p>
这是在delphi中定义的指针函数,该函数自标头c ++以来就进行转换
type
TMICRCallback =函数:对象的整数; stdcall;
TStatusCallback = function(dwParam:Cardinal):对象的整数; stdcall;
类型
TBiMICRSetReadBackFunction =
函数(const nHande:Integer;
pMicrCB:TMICRCallback;
var pReadBuffSize:Byte;
var readCharBuff:字节;
var pStatus:字节;
var pDetail:字节
):整数; stdcall;
var
BiMICRSetReadBackFunction:TBiMICRSetReadBackFunction;
类型
TBiMICRSetReadBackFunction =
函数(const nHande:Integer;
pMicrCB:TMICRCallback;
var pReadBuffSize:Byte;
var readCharBuff:字节;
var pStatus:字节;
var pDetail:字节
):整数; stdcall;
var
BiMICRSetReadBackFunction:TBiMICRSetReadBackFunction;
这是调用指针函数的代码
type
函数CBMICRRead:整数; stdcall;
函数CBMICRStatus(dwStatus:LongWord):整数; stdcall;
Respuesta:TMICRCallback;
Estado:TStatusCallback;
BiSetStatusBackFunction(m_hApi,Estado);
BiMICRSetReadBackFunction(m_hApi,
Respuesta,
m_MICRReadBuffSize,
m_MICRReadBuff [0],
m_MICRReadStatus,
m_MICRReadStDetail);
这是接口的C ++一侧:
typedef int(CALLBACK * MICRCallback)(void);
typedef int(CALLBACK * StatusCallback)(DWORD);
int WINAPI BiSetStatusBackFunction(int nHandle,
int(CALLBACK * pStatusCB)(DWORD dwStatus));
int WINAPI BiMICRSetReadBackFunction(int nHandle,
int(CALLBACK * pMicrCB)(void),
LPBYTE pReadBuffSize,
LPBYTE readCharBuff,
LPBYTE pStatus,
LPBYTE pDetail);
您必须避免 Object
作为DLL函数调用结果的传递参数。
TMICRCallback = function:Integer; stdcall;
TStatusCallback = function(dwParam:Cardinal):整数; stdcall;
I'm new in delphi, my program developed in delphi working with a dll developed in C++, I need working with pointer functions that throw exceptions of Access Violation address and after many test I don't know how resolve It.
this is defintion of the pointer function in delphi that translate since header c++
type
TMICRCallback = function: Integer of Object; stdcall;
TStatusCallback = function(dwParam: Cardinal): Integer of Object; stdcall;
type
TBiMICRSetReadBackFunction =
function(const nHande: Integer;
pMicrCB: TMICRCallback;
var pReadBuffSize: Byte;
var readCharBuff: Byte;
var pStatus: Byte;
var pDetail: Byte
): Integer; stdcall;
var
BiMICRSetReadBackFunction: TBiMICRSetReadBackFunction;
type
TBiMICRSetReadBackFunction =
function(const nHande: Integer;
pMicrCB: TMICRCallback;
var pReadBuffSize: Byte;
var readCharBuff: Byte;
var pStatus: Byte;
var pDetail: Byte
): Integer; stdcall;
var
BiMICRSetReadBackFunction: TBiMICRSetReadBackFunction;
this is a code that call the pointer functions
type
function CBMICRRead : Integer; stdcall;
function CBMICRStatus(dwStatus: LongWord) : Integer; stdcall;
Respuesta : TMICRCallback;
Estado : TStatusCallback;
BiSetStatusBackFunction(m_hApi, Estado);
BiMICRSetReadBackFunction (m_hApi,
Respuesta,
m_MICRReadBuffSize,
m_MICRReadBuff[0],
m_MICRReadStatus,
m_MICRReadStDetail);
This is the C++ side of the interface:
typedef int (CALLBACK* MICRCallback)(void);
typedef int (CALLBACK* StatusCallback)(DWORD);
int WINAPI BiSetStatusBackFunction(int nHandle,
int (CALLBACK *pStatusCB)(DWORD dwStatus));
int WINAPI BiMICRSetReadBackFunction(int nHandle,
int (CALLBACK *pMicrCB)(void),
LPBYTE pReadBuffSize,
LPBYTE readCharBuff,
LPBYTE pStatus,
LPBYTE pDetail);
You must avoid Object
as passing parameters from/to DLL function call result.
TMICRCallback = function: Integer; stdcall;
TStatusCallback = function(dwParam: Cardinal): Integer; stdcall;
这篇关于Delphi:使用Pointer函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!