付録  動的に関数呼出しする?
RPGプログラマーの為のC言語講座

以下のコードは、決してお薦めするものではありません。

バインドしていない関数のアドレスを取得して、動的に実行するコードです

MIを使用して、サービスプログラムの活動化し、そのなかにある関数のアドレスを取得し、呼出しをかけています。

OS/400のバージョンなどによっては正常に動作しないかもしれません。

まちがっても、こんなやり方で、アプリケーションは作成しないで下さいね。

あくまで、自分自身の理解を深める(本来のハッキング)としてください。
当然、何かあっても、メーカーサポートなどは受けれません。念の為

活動化され、実行されるテスト用のサービスプログラム

#include <stdio.h>
int plus(){
printf("I am PLUSSRV PGM\n");
return(0);
}

動的に関数呼出しするプログラム

#include <QSYSINC/MIH/RSLVSP>
#include <QSYSINC/MIH/MATPTR>
#include <QSYSINC/H/QLEAWI>
#include <stdio.h>
#include <stdlib.h>

_SYSPTR        srvpgm_ptr;
Qle_ABP_Info_t  *actinfo;
Qus_EC_t        *err_code;

int expid=1,explen,expex;
char *expname = "plus";
void *expptr, *rc_expptr;
int rc,*actmark,*len, rc_actmark;

int (*pl)();

int main(void) {
srvpgm_ptr = rslvsp(WLI_SRVPGM,"PLUSSRV","*LIBL", _AUTH_OBJ_MGMT);

rc_actmark = QleActBndPgm (&srvpgm_ptr,
                   actmark,    /* Activation mark            */
                   actinfo,    /* Activation information     */
                   len,        /* Length of Activation Info. */
                    err_code); /* Error code                 */
explen = 5;
expptr = malloc(128);
rc_expptr = QleGetExp (&rc_actmark,
                 &expid,
                 &explen,          /* Export name length           */
                 expname,          /* Export name                  */
                 &expptr,          /* Pointer to Pointer to export */
                 &expex,           /* type, see QLE_EX_* defn's    */
                 err_code);        /* Error code                   */

printf("PLUSACT : plus ptr = %p\n",rc_expptr);
pl = rc_expptr;
rc = (*pl)();
printf("PLUSACT : END PGM");
}