Перевод с VB на Delphi

#delphi #vb6

#delphi #vb6

Вопрос:

Я перевожу код VB6 на Delphi 7)

Как я могу перевести следующее

Функция funcSetupCallBack определена во внешней in DLL

 Public Declare Function funcSetUpCallBackamp; Lib "BUICAP32.DLL" (ByVal nEventamp;, ByVal CallBackFunctionamp;)
  

Вот как вызывается функция funcSetupCallBack в основной форме

 if ( MICRCallBackYN = true ) //If MICR call back is turned on in setup screen and using 4120
    then
      begin
        if ( sScannerType = 'DCC BX7200' )
          then
            begin
              Ret := funcSetUpCallBack( TS200_CB_EVENT_MICR, MICRCallBack ); //Turn on MICR Callback
              Ret := BUICSetParam( CFG_SORT_MODE, 8 );
            end;
        if ( sScannerType = 'Teller Scanner Ts440' )
          then
            begin
              Ret := funcSetUpCallBack( TS200_CB_EVENT_VBMICR, MICRCallBack ); //Turn on MICR Callback VB
            end;
        //ibatchitemsCB = 0  '//Initialize Callback item counter to 0 When using the 'Sort Every Fouth Document Logic'
      end
    else
      begin
        Ret := funcSetUpCallBack( TS200_CB_EVENT_VBMICR, 0 ); //Turn off MICR Callback
        Ret := BUICSetParam( CFG_SORT_MODE, 6 );
      end;
  

И это определение функции обратного вызова MICRCallBack

 Public Function MICRCallBack(ByVal dwReasonamp;) As Long
    Dim Ret As Long, i As Long, iDocument As Long
    Dim j As Integer
    Dim iScannerType As Long
    Dim strMICR As String * 255, ltr As String, tst As String

iDocument = funcTS200GetMICR(strMICR, 100)

    '// Get the MICR
    'iScannerType = BUICGetParam(CFG_MISC_SCANNER_TYPE)

        'Every Fourth Document put in option pocket
'        If ibatchitemsCB > 0 And ibatchitemsCB Mod 4 = 0 Then Ret = funcSetPocketamp;(1) Else Ret = funcSetPocketamp;(0)
'        ibatchitemsCB = ibatchitemsCB   1

        'If Check Upside down put in option Pocket
        If iScannerType = 7200 Then
            Ret = BX7200SetPocket(iDoccument, 0)
            For i = 1 To 10
                ltr = Mid(strMICR, i, 1)
                If Asc(ltr) = 0 Then tst = tst amp; ltr
            Next i
            If Len(tst) > 5 Then Ret = BX7200SetPocket(iDocument, 1) Else Ret = BX7200SetPocket(iDocument, 0)
        Else
             For i = 1 To 10
                ltr = Mid(strMICR, i, 1)
                If Asc(ltr) = 0 Then tst = tst amp; ltr
            Next i
            If Len(tst) > 5 Then Ret = TS400SetPocket(1) Else Ret = TS400SetPocket(0)
        End If

    MICRCallBack = 1

End Function        
  

Итак, вопрос в том, как я могу объявить функцию Delphi в качестве параметра для другой функции, объявленной во внешней DLL?

Большое спасибо за вашу помощь и ваше время.

Комментарии:

1. Вы уже знаете какой-нибудь Delphi?

2. Да, но я не знаю, как объявить вызов функций этого типа

3. Итак, прочитайте документацию и приступайте.

Ответ №1:

Объявите тип функции для обратного вызова, а затем используйте этот тип в параметре, например:

 type
  SetUpCallBack = function(dwReason: DWORD): Integer; stdcall;

function funcSetUpCallBack(nEvent: Integer; CallBackFunction: SetUpCallBack): Integer; stdcall; external 'BUICAP32.DLL';
  

Затем вы можете передать свою функцию Delphi:

 function MICRCallBack(dwReason: DWORD): Integer; stdcall;
begin
  // do something...
  Result := 1;
end;

...

Ret := funcSetUpCallBack( TS200_CB_EVENT_MICR, @MICRCallBack ); //Turn on MICR Callback
...
Ret := funcSetUpCallBack( TS200_CB_EVENT_VBMICR, @MICRCallBack ); //Turn on MICR Callback VB
...
Ret := funcSetUpCallBack( TS200_CB_EVENT_VBMICR, nil ); //Turn off MICR Callback