2012-10-09 64 views
3

我是新的德爾福,我的程序在德爾福開發與C++開發的DLL工作,我需要處理指針函數,拋出訪問衝突地址的例外,經過多次測試,我不知道如何解決它。德爾福:使用指針函數

這是在Delphi指針功能的確定指標,由於報頭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; 

這是調用指針功能

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

這是一個代碼轉換接口的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-一個線程功能作爲一種回調至WINAPI)。 –

+0

如果您顯示了C++接口的匹配部分 –

+1

,這將有所幫助有關類的隱式參數的[官方文檔](http://docwiki.embarcadero.com/RADStudio/XE3/en/Program_Control#Handling_Method_Calls)方法。 –

回答

4

您必須避免將Object作爲從/傳遞給DLL函數調用結果的參數。

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