VB到Delphi的翻译

时间:2016-10-05 14:41:46

标签: delphi vb6

我正在将VB6代码翻译成Delphi 7)

如何翻译以下内容

函数funcSetupCallBack在DLL的外部定义

Public Declare Function funcSetUpCallBack& Lib "BUICAP32.DLL" (ByVal nEvent&, ByVal CallBackFunction&)

这是在主窗体中调用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 dwReason&) 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 = funcSetPocket&(1) Else Ret = funcSetPocket&(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 & 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 & ltr
            Next i
            If Len(tst) > 5 Then Ret = TS400SetPocket(1) Else Ret = TS400SetPocket(0)
        End If

    MICRCallBack = 1

End Function        

所以问题是如何将Delphi函数声明为外部DLL中声明的另一个函数的参数?

非常感谢您的帮助和时间。

1 个答案:

答案 0 :(得分:0)

声明回调的函数类型,然后在参数中使用该类型,例如:

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
相关问题