这个是用PowerBuilder做的,但是PowerBuilder那边懂COM的人比较少,我认为对COM问题把握比较好的应该是C程序员,所以上这里向大家求教,谢谢,谢谢。我做了两个COM组件n_cnt,n_trans。在同一个DLL文件里。编译注册成功。组件服务里也能看到这两个组件。所对应的接口`方法也都正确。
但是,我在使用其中一个组件的方法uf_newtransbegin(ref n_trans trans, string dataobj)
//以上是PowerBuilder声明,ref 相当于&(引用)
//n_trans是另一个COM组件的类名
//string相当于char *
时出了问题,系统弹出错误信息:
"0x7800b834"指令引用的"0x00000000"内存。该内存不能为"read"。
要终止程序,请单击"确定"。
要调试程序,请单击"取消"。当我单击确定后,组件进程还在运行,客户端进程被操作系统终止了。经过测试,我发现,实际上被调用方法还没有来得及开始运行一条语句。程序是在调用的过程中就出了问题。我现在恳请VC COM大师们帮我分析一下,问题可能出在什么地方。谢谢,谢谢。
但是,我在使用其中一个组件的方法uf_newtransbegin(ref n_trans trans, string dataobj)
//以上是PowerBuilder声明,ref 相当于&(引用)
//n_trans是另一个COM组件的类名
//string相当于char *
时出了问题,系统弹出错误信息:
"0x7800b834"指令引用的"0x00000000"内存。该内存不能为"read"。
要终止程序,请单击"确定"。
要调试程序,请单击"取消"。当我单击确定后,组件进程还在运行,客户端进程被操作系统终止了。经过测试,我发现,实际上被调用方法还没有来得及开始运行一条语句。程序是在调用的过程中就出了问题。我现在恳请VC COM大师们帮我分析一下,问题可能出在什么地方。谢谢,谢谢。
我不知道pb怎么写,一般应该有CreateInstance这个词的!哈哈!创建的时候记着判断是否成功!不成功的话你调用就会出现上面的问题!hoho!过个好年!
以下是PB中调用组件及释放的做法(包括检测代码)
integer succall
OLEObject transobj
transobj = create OLEObject
succall = transobj.connecttonewobject("PB90.n_trans.1.0")
if succall < 0 then //如果调用失败
MessageBox("","事务组件调用失败。")
close(parent)
end if
transobj.disconnectobject() //释放组件
destroy transobj谢谢。还有没有其他的可能?
在uf_newtransbegin(ref n_trans trans, string dataobj)中,COM组件ref n_trans trans的引用地址是客户机的内存地址而不是服务器的内存地址,n_cnt并不了解n_trans的相关信息。
对n_trans的实例化可能放在uf_newtransbegin方法内部可能会好一些。只是一些猜测(不是判断),仅供参考。
2.接口是否实现完全,要支持 ole
你看看,