如何使用方法 ID 从 Powerbuilder 调用 PBNI 方法

How do I call PBNI methods from Powerbuilder, using method ID

我正在创建一个 c++ PBNI non-visual 扩展,像这样从 powerbuilder 调用它:

 textbox1.text = string (cpp_add.f_add(integer(textbox2.text), integer(textbox3.text)))

PBX_GetDescription() 有一个 class 和两个这样描述的函数:

"class pbadd from nonvisualobject \n" \
"function int f_add(int a, int b)\n" \
"function int f_add2(int a, int b)\n" \
"end class \n"

Header:

#include "pbext.h"
class pbadd : public IPBX_NonVisualObject
{
public:
    pbadd();
    virtual ~pbadd();
    PBXRESULT Invoke(
        IPB_Session   *session,
        pbobject      obj,
        pbmethodID    mid,
        PBCallInfo    *ci);

    int f_add(IPB_Session*, pbint, pbint);
    int f_add2(IPB_Session*, pbint, pbint);
    enum MethodIDs
    {
        mAdd = 1,
        mAdd2 = 2

    };

private:
    virtual void Destroy();
};

以及所需的调用方法:

PBXRESULT pbadd::Invoke(IPB_Session *Session,
    pbobject obj, pbmethodID mid, PBCallInfo *ci)
{   
    if (mid == mAdd)
    {
        int sum = f_add(Session, ci->pArgs->GetAt(0)->
            GetInt(), ci->pArgs->GetAt(1)->GetInt());
        ci->returnValue->SetInt(sum);
    }
    if (mid == mAdd2)
    {
        int sum = f_add2(Session, ci->pArgs->GetAt(0)->
            GetInt(), ci->pArgs->GetAt(1)->GetInt());
        ci->returnValue->SetInt(sum+1);
    }
    return PBX_OK;
}

现在的问题是:我不知道如何调用这两个方法中的第二个。我假设我可以以某种方式更改 pbmethod mid,但我不知道如何从 powerbuilder 进行更改。

您是否在 PowerBuilder 中右击库并选择 'Import PB Extension'?这样做会创建一个您在 PB 脚本中使用的 'shell' 对象,它会自动调用传递方法 ID 的 Invoke 方法。

显然问题出在这里:

enum MethodIDs
    {
        mAdd = 1,
        mAdd2 = 2

    };

ID从0开始计算正确:

enum MethodIDs
    {
        mAdd = 0,
        mAdd2 = 1
    };