请问如何在pb中开发一个com组件,又如何在其他编程环境中调用?

albert_qingdao 2006-02-05 03:45:32
如题。
希望各位能说得详细点,我比较苯。
...全文
619 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qpeg 2006-07-01
  • 打赏
  • 举报
回复
对,成员函数就是组件中包含的函数
//PB90.n_p_recordset_com组件名
//gf_test() 组件中的函数
PB中调用:
oleobject ooo
long l1
ooo=create oleobject

l1=ooo.connecttonewobject('PB90.n_p_recordset_com')

ooo.gf_test()
destroy ooo


VB中调用
Private Sub Command1_Click()
Dim obj As Object
Set obj = CreateObject("PB90.n_p_recordset_com")
Call obj.gf_test()

End Sub

szlmliang 2006-06-22
  • 打赏
  • 举报
回复
不好意思,何谓成员函数?是object里的函数吗?如何新建
ruky9988 2006-06-04
  • 打赏
  • 举报
回复
up
workhand 2006-05-12
  • 打赏
  • 举报
回复
学习一下
lywei 2006-05-11
  • 打赏
  • 举报
回复
学习
bpy_r 2006-05-10
  • 打赏
  • 举报
回复
gz
msgtogcra 2006-02-10
  • 打赏
  • 举报
回复
[转贴]PB 开发 COM 存在的问题

安装了 PB gernerate 的朋友可以使用 PB 开发 COM 组件,但是目前还只能开发进程中 COM 。PB

开发 COM 有几个问题需要注意一下。
1. 使用 PB 的 Project 画笔编译好了 COM 组件后还不能使用,还要将对应的 PBL 编译成 PBD 或

则 DLL,具体是 PBD 还是 DLL 要看在编译 COM 时如何设定的。一般默认情况是 PBD 。编译好了 PBD

或 DLL后,才能正常使用 COM 组件。当然使用前 COM组件还应注册。如果你要发行你的 COM 组件,还必

须要 PB 的 DDDK 中的 DLL,就发行应用程序一样,还需要 PB 的 DLL 支持。

2. 不支持函数覆盖(OverWrite)
PB 制作 COM 时是将不可视用户自定义对象(不妨命名为 n_cst_object)编译成 COM 组件的接口。

它将 n_cst_object 所有共有属性、函数、事件都编译成 COM

组件的一个结构。但是如果这个n_cst_object 还有一个父类,并且 n_cst_object还覆盖了父类中的函数

,那么此时编译 COM 操作将无法通过。原因是 PB 在制作 COM 组件时会将 n_cst_object 的父类中的所

有属性、函数、事件也编译进去。所以,此时 PB 发现两个一模一样的函数,编译也自然通不过了。解决

办法很简单,将原来需要覆盖的函数申明成保护类型。这样函数就可以最随意覆盖了。但是申明成保护类

型后外界也就无法访问该函数了。那么我们再在 n_cst_object的父类中申明一个共有类型的函数,该函

数只是简简单单的调用原来南各函数。至此一切问题都解决,函数可以覆盖了。下面是关于这个问题的伪

代码。

问题代码:
Class n_cst_parent
{
public :
int a() { //do something }
int b() {//hello! }
};
class n_cst_object : n_cst_parent
{
Public :
int a() {//OverWrite Parent script }
}
此时将 n_cst_object 编译成 COM 组件的接口,那么这个接口具备的函数将会是
int a() // 来自n_cst_parent
int b() // 来自n_cst_parent
int a() // 来自 n_cst_object
显然这种 COM 接口不可能出现,因此编译失败了。将上面的问题代码改为如下形式:
Class n_cst_parent
{
protected:
visual int a1() {//完成原来 n_cst_parent.a() 要完成的工作 }
public:
int a() { return a1(); }
int b (){ //hello }
}
Class n_cst_object : n_cst_parent
{
protected:
int a1() {//完成原来 n_cst_object.a() 要完成的工作 }
}
此时再将 n_cst_object 编译成 COM 的接口,那么这个接口具备的函数将会是
int a() // 来自n_cst_parent
int b() // 来自n_cst_parent
而且 int a() 函数调用的将是 n_cst_object 中的 a1() 。因为 a1() 被申明成虚函数。
所有问题全部解决!!!
以上代码只是伪代码,PB 中的对象继承根本不是这样。还有在 PB 中函数已经申明就已经是虚函数。直

接具备多态特性。
xb8254 2006-02-08
  • 打赏
  • 举报
回复
guanzhu
handi 2006-02-08
  • 打赏
  • 举报
回复
我记得我在csdn emag里面写过一篇文章。可以去看看
msgtogcra 2006-02-07
  • 打赏
  • 举报
回复
pb6.5 以下参见:
http://community.csdn.net/Expert/topic/4494/4494991.xml?temp=.9391748

[转贴]如何在pb中创建COM组件,并在asp中调用并返回结果集?
日期:2005年5月5日 作者:清风网络学院

启动pb7.0,创建一个不可视的用户对象"uo_customer",新建"object",选择"custom class"
类型,点击"ok"。
在新创建的用户对象中编写如下程序:
1.声明实例变量"instance variables",对于com中不支持的类型,请声明为protected类型。protected:
datastore ds_datastore
2.新建三个成员函数:
int uf_connect()//用于连结数据库与创建datastore对象。
代码:
sqlca.dbms="odbc"
sqlca.database="webdw"
sqlca.autocommit=false
sqlca.dbparm="connectstring=''dsn=webdw;uid=dba;pwd=sql''"
connect using sqlca;
ds_datastore =create datastore
if sqlca.sqlcode=0 then
return 1
else
return -1
end if

void uf_disconnect()//用于断开数据库连结和释放datastore对象。
if isvalid(ds_datastore) then destroy ds_datastore
disconnect using sqlca;


resultset uf_retrieve()//读取客户信息
resultset lrs_customers
ds_datastore.dataobject="d_customer"
ds_datastore.retrieve()
ds_datastore.generateresultset(lrs_customers)//生成结果集
return lrs_customers//返回结果集
最后,保存改对象为"uo_customers"。

制作一个com组件的工程
新建"project",选择"Com/mts component wizard",确定。
给工程定义一个名字"p_recordset_com"
接下来,选择要生成com的用户对象"uo_customer"
设置生成com组件后的接口属性,这里可以使用缺省。
然后自己定义组件的program id为"pb70.uocustomer",
然后选择该com组件的dll文件名,单击"new",生成"component server appid",
同样生成"type library id",最后,选择pb资源文件名,以及注册方式,之后,系统会
给出用户设置的大致信息,然后选择生成"to do list"
这样就完成一个生成com组件的工程,名为"p_test_com"。

编译工程并注册组件
打开已经生成的工程,选择相应的pbl文件及用户对象,编译就可以了

下面我们创建asp网页来调用这个pb com
<head><title>pb com</title></head>
<body>
<%
set customers=server.createobject("pb70.uo_customers")
iflag=customers.uf_connect()
set rs=customers.uf_retrieve()
'www.knowsky.com
%>
<table>
<%rs.movefirst
do while not rs.eof
%>
<tr>
<td><%=rs("lname")%></td>
<td><%=rs("address")%></td>
<td><%=rs("city")%></td>
</tr>
<%rs.movenext
loop
rs.close
customers.uf_disconnect()
%>
</table>
</body>
保存成asp文件

最后,在浏览器中就可以浏览这个asp文件了

说明:pb7.0和pb8.0基本上差不多,读者可以自己实践。
lzheng2001 2006-02-06
  • 打赏
  • 举报
回复
自己到百度上搜索一下就会有结果了

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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