这个是用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大师们帮我分析一下,问题可能出在什么地方。谢谢,谢谢。

解决方案 »

  1.   

    哈哈!老兄,你根本没有创建组件的实例,或者没有创建成功!
    我不知道pb怎么写,一般应该有CreateInstance这个词的!哈哈!创建的时候记着判断是否成功!不成功的话你调用就会出现上面的问题!hoho!过个好年!
      

  2.   

    组件的实例我已经创建了,而且一定是成功的。因为我每创建一个实例都有测试代码检验创建是否成功。这个应该不会有问题。
    以下是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谢谢。还有没有其他的可能?
      

  3.   

    PB和COM都略微了解一点,楼主的用法可能有一点问题。
    在uf_newtransbegin(ref n_trans trans, string dataobj)中,COM组件ref n_trans trans的引用地址是客户机的内存地址而不是服务器的内存地址,n_cnt并不了解n_trans的相关信息。
    对n_trans的实例化可能放在uf_newtransbegin方法内部可能会好一些。只是一些猜测(不是判断),仅供参考。
      

  4.   

    com的引用不能传递空指针;trans是有效的对象,否则在服务器断无法列举对象
      

  5.   

    1.先写个 mfc程序,调试一下 com 是否正确
    2.接口是否实现完全,要支持 ole
      

  6.   

    http://blog.csdn.net/online/archive/2003/01/09/7758.aspx
    你看看,