PB pbni

sjflsfjsdklf 2011-01-03 06:51:58
以下n_c1对象里有一个of_get函数,string of_get(string pp,long ii)但一直调用失败
这一段代码是什么意思ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x))
我就是想传入参数,但一直错误..

#include "stdafx.h"
#include "pbdllteset.h"
#include "pbext.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);

LPCTSTR PASCAL pbdll( char* x )
{
PBCallInfo ci;
IPB_Session* session;
IPB_VM* pbvm = NULL;
HINSTANCE hinst;
P_PB_GetVM getvm;
pbgroup group;
pbclass cls;
pbmethodID mid ;
pbobject pbobj;
LPCTSTR ret;
pbstring lpbs;
hinst = LoadLibrary("pbvm105.dll");
if ( hinst== NULL) return 0;

getvm = (P_PB_GetVM)GetProcAddress(hinst,"PB_GetVM");
if (getvm == NULL) return 0;

getvm(&pbvm);
if (pbvm == NULL) return 0;

LPCTSTR LibList[] = {"pb91.pbl"};
if ( pbvm->CreateSession("pb91", LibList, 1, &session) != PBX_OK )
{
return 0 ;
}

PBSessionOwner sessionower(session);

group = session->FindGroup("n_c1",pbgroup_userobject);
if (group == NULL) return 0;

cls = session->FindClass(group,"n_c1");
if (cls == NULL) return 0 ;

mid = session->GetMethodID(cls, "of_get", PBRT_FUNCTION, "SS");

pbobj = session->NewObject(cls);

session->InitCallInfo(cls, mid, &ci);

ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x));

session->InvokeObjectFunction(pbobj, mid, &ci);
lpbs = ci.returnValue->GetString();
ret = session->GetString(lpbs);
return ret;
}
...全文
455 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovemoreh 2011-01-04
  • 打赏
  • 举报
回复
“ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x));”是为of_get函数的第一个参数赋值。
至少有一个错误是:没有为of_get的第二个参数赋值。
184270428 2011-01-04
  • 打赏
  • 举报
回复
184270458
sjflsfjsdklf 2011-01-04
  • 打赏
  • 举报
回复
楼主184270428有qq吗?我想和你谈谈,可以付费,我的qq:563827361
184270428 2011-01-04
  • 打赏
  • 举报
回复

我再去掉你一些多余的代码

#include "stdafx.h"
#include "pbdllteset.h"
#include "pbext.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);

LPCTSTR PASCAL pbdll( char* x )
{
PBCallInfo ci;//执行代码输入输出去结构
IPB_Session* session;//与PB会话接口
IPB_VM* pbvm = NULL;//虚似机接口
HINSTANCE hinst;
P_PB_GetVM getvm;//虚似机
pbgroup group;//组ID
pbclass cls;//类ID
pbmethodID mid ;//方法ID
//pbobject pbobj;//对象句柄
LPCTSTR ret;
pbstring lpbs;
hinst = LoadLibrary("pbvm105.dll");//载入虚似机
if ( hinst== NULL) return 0;

getvm = (P_PB_GetVM)GetProcAddress(hinst,"PB_GetVM");//得到返回虚似机的函数地址
if (getvm == NULL) return 0;

getvm(&pbvm);//得到虚似机
if (pbvm == NULL) return 0;

LPCTSTR LibList[] = {"pb91.pbl"};
if ( pbvm->CreateSession("pb91", LibList, 1, &session) != PBX_OK )//创建会话,选入的应用名为:pb91
{
return 0 ;
}

//PBSessionOwner sessionower(session);//建立会话管理类
group = session->FindGroup("n_c1",pbgroup_userobject);//得到用户对象的分组,当然于组ID(注:按理说,用户对象也是一个类,但PB习惯叫它为对象)
if (group == NULL) return 0;
cls = session->FindClass(group,"n_c1");//得到类ID
if (cls == NULL) return 0 ;
mid = session->GetMethodID(cls, "of_get", PBRT_FUNCTION, "SSL");//得到方法ID,方法结构为: function string of_get(string,long).检查这里是不是正确的。
//pbobj = session->NewObject(cls);//该类的对象实例.实事上如果只是要调用,可以直接使用cls
session->InitCallInfo(cls, mid, &ci);//初使化输入输出结构
ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x));//设定第一个入参. ci.pArgs-> GetAt(0)->SetLong(0);//设定第二个入参
//session->InvokeObjectFunction(pbobj, mid, &ci);
session->InvokeClassFunction(cls,mid, &ci);//也可以这样调用,这样就不需要pbobj了。
lpbs = ci.returnValue->GetString();//得返回值pbstring
ret = session->GetString(lpbs);//转成LPCTSTR
return ret;
}

184270428 2011-01-04
  • 打赏
  • 举报
回复

看到我上面跟你说的,你知道你的代码问题出在哪里了吗?下面我跟你修改一下:


#include "stdafx.h"
#include "pbdllteset.h"
#include "pbext.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);

LPCTSTR PASCAL pbdll( char* x )
{
PBCallInfo ci;//执行代码输入输出去结构
IPB_Session* session;//与PB会话接口
IPB_VM* pbvm = NULL;//虚似机接口
HINSTANCE hinst;
P_PB_GetVM getvm;//虚似机
pbgroup group;//组ID
pbclass cls;//类ID
pbmethodID mid ;//方法ID
//pbobject pbobj;//对象句柄
LPCTSTR ret;
pbstring lpbs;
hinst = LoadLibrary("pbvm105.dll");//载入虚似机
if ( hinst== NULL) return 0;

getvm = (P_PB_GetVM)GetProcAddress(hinst,"PB_GetVM");//得到返回虚似机的函数地址
if (getvm == NULL) return 0;

getvm(&pbvm);//得到虚似机
if (pbvm == NULL) return 0;

LPCTSTR LibList[] = {"pb91.pbl"};
if ( pbvm->CreateSession("pb91", LibList, 1, &session) != PBX_OK )//创建应用,应用名为:pb91
{
return 0 ;
}

PBSessionOwner sessionower(session);//建立会话类
group = session->FindGroup("n_c1",pbgroup_userobject);//得到用户对象的分组,当然于组ID(注:按理说,用户对象也是一个类,但PB习惯叫它为对象)
if (group == NULL) return 0;
cls = session->FindClass(group,"n_c1");//得到类ID
if (cls == NULL) return 0 ;
mid = session->GetMethodID(cls, "of_get", PBRT_FUNCTION, "SSL");//得到方法ID,方法结构为: function string of_get(string s).检查这里是不是正确的。
//pbobj = session->NewObject(cls);//该类的对象实例.实事上如果只是要调用,可以直接使用cls
session->InitCallInfo(cls, mid, &ci);//初使化输入输出结构
ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x));//设定第一个入参.这里只有一个入参,所以设一个就行了.
ci.pArgs-> GetAt(0)->SetLong(0);
//session->InvokeObjectFunction(pbobj, mid, &ci);
session->InvokeClassFunction(cls,mid, &ci);也可以这样调用,这样就不需要pbobj了。
lpbs = ci.returnValue->GetString()//得返回值pbstring
ret = session->GetString(lpbs);//转成LPCTSTR
return ret;
}
184270428 2011-01-04
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include "pbdllteset.h"
#include "pbext.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);

LPCTSTR PASCAL pbdll( char* x )
{
PBCallInfo ci;//执行代码输入输出去结构
IPB_Session* session;//与PB会话接口
IPB_VM* pbvm = NULL;//虚似机接口
HINSTANCE hinst;
P_PB_GetVM getvm;//虚似机
pbgroup group;//组ID
pbclass cls;//类ID
pbmethodID mid ;//方法ID
pbobject pbobj;//对象句柄
LPCTSTR ret;
pbstring lpbs;
hinst = LoadLibrary("pbvm105.dll");//载入虚似机
if ( hinst== NULL) return 0;

getvm = (P_PB_GetVM)GetProcAddress(hinst,"PB_GetVM");//得到返回虚似机的函数地址
if (getvm == NULL) return 0;

getvm(&pbvm);//得到虚似机
if (pbvm == NULL) return 0;

LPCTSTR LibList[] = {"pb91.pbl"};
if ( pbvm->CreateSession("pb91", LibList, 1, &session) != PBX_OK )//创建应用,应用名为:pb91
{
return 0 ;
}

PBSessionOwner sessionower(session);//建立会话类
group = session->FindGroup("n_c1",pbgroup_userobject);//得到用户对象的分组,当然于组ID(注:按理说,用户对象也是一个类,但PB习惯叫它为对象)
if (group == NULL) return 0;
cls = session->FindClass(group,"n_c1");//得到类ID
if (cls == NULL) return 0 ;
mid = session->GetMethodID(cls, "of_get", PBRT_FUNCTION, "SS");//得到方法ID,方法结构为: function string of_get(string s).检查这里是不是正确的。
pbobj = session->NewObject(cls);//该类的对象实例.实事上如果只是要调用,可以直接使用cls
session->InitCallInfo(cls, mid, &ci);//初使化输入输出结构
ci.pArgs-> GetAt(0)->SetPBString(session->NewString(x));//设定第一个入参.这里只有一个入参,所以设一个就行了.
session->InvokeObjectFunction(pbobj, mid, &ci);
//session->InvokeClassFunction(cls,mid, &ci);也可以这样调用,这样就不需要pbobj了。
lpbs = ci.returnValue->GetString()//得返回值pbstring
ret = session->GetString(lpbs);//转成LPCTSTR
return ret;
}

1,077

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧