2012-10-09 1 views
3

저는 델파이에서 새로 왔습니다. C++로 개발 된 dll로 델파이로 개발 된 프로그램으로, 액세스 위반 주소의 예외를 throw하는 포인터 함수로 작업해야합니다. 그것을 해결하는 방법을 알아라.델파이 : 포인터 함수로 작업하기

이이 포인터 기능

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

이것은입니다 전화 코드가

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; 

헤더 C++ 이후 번역 델파이에서 포인터 기능 (고화질)입니다 인터페이스의 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);   
+4

만 ("암시 적 자기 매개 변수"를 검색 (안 "개체의") 콜백으로 일반 기능을 사용할 수, 예를 들어 http://stackoverflow.com/questions/7706637/how-to-pass-the-address -of-a-thread-function-as-a-callback-to-winapi)를 사용합니다. –

+0

C++ 인터페이스의 일치하는 부분을 보여 주면 도움이 될 것입니다 –

+1

클래스의 암시 적 매개 변수에 대한 [공식 문서] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Program_Control#Handling_Method_Calls)는 다음과 같습니다 방법. –

답변

4

DLL 함수 호출 결과에서 /로 매개 변수를 전달하는 것으로 Object을 피해야합니다.

TMICRCallback = function: Integer; stdcall; 
TStatusCallback = function(dwParam: Cardinal): Integer; stdcall;