2017-10-12 36 views
0

我在服務模塊中使用回調。我想作爲過程參數傳遞的回調函數的指針。如何在RPGLE中使用指針調用過程

我該如何在服務模塊中調用我的回調函數?

psevdocode:

主代碼:

dcl-pr Proc2; 
    ptr pointer;  
end-pr; 

dcl-s ptr inz(%Addr(Proc1)) 

Proc2(ptr); 

dcl-proc Proc1; 
dcl-pi *n; 
    parm1 char(123); 
end-pi; 
    ...  
end-proc Proc1; 

服務PROGRAMM

dcl-proc Proc2; 
dcl-pi *n; 
    ptr pointer; 
end-pi; 

     dcl-s param char(123) inz('xxxaaaqqq') 

    *ptr(param); // call callback 

end-proc Proc2; 

回答

2

%PADDR()(獲得程序地址)內置函數
PROCPTR關鍵字(在固定格式d - 規格)
POINTER(* PROC)(自由格式d規格)

dcl-pr Proc2; 
    ptr pointer(*PROC); 
end-pr; 

Proc2(%paddr(Proc1)); 

dcl-proc Proc1; 
dcl-pi *n *IND; 
    parm1 char(123); 
    parm2 int(10); 
end-pi; 
    ...  
end-proc Proc1; 

* SRVPGM

dcl-proc Proc2; 
dcl-pi *n; 
    ptr pointer(*PROC) 
end-pi; 

//defined prototype for callback 
// as EXTernal PROCedure pointed to by ptr 
dcl-pr callback extproc(ptr) *IND; 
    cbParm char(123); 
    cbParm2 int(10); 
end-pr; 

    dcl-s param char(123) inz('xxxaaaqqq') 
    dcl-s myInt int(10); 
    dcl-s success ind; 

    success = callback(param:myInt); // call callback 

end-proc Proc2; 
+0

告訴我們如何添加parms,我會留下深刻的印象。您已經成功地通過地址將程序名稱傳遞給過程。 – danny117

+0

@ danny117,添加一個parm?只需添加parm,回調已經有一個Proc2 ... – Charles

+0

parm是回調的地址。如果它有一些數據使其有用,它會令人印象深刻。例如,成功失敗parm回調(param:success); – danny117