Delphi:使用Pointer函数 [英] Delphi: working with Pointer functions

查看:544
本文介绍了Delphi:使用Pointer函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是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函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆