当前位置: 代码迷 >> C# >> pb9.0 .net4.0 COM组件 复杂对象,该如何处理
  详细解决方案

pb9.0 .net4.0 COM组件 复杂对象,该如何处理

热度:96   发布时间:2016-05-05 02:41:17.0
pb9.0 .net4.0 COM组件 复杂对象
用.NET4.0   C#写一个 COM组件形式的DLL  程序集"ZCom.ZCom"
让PB9.0编写的应用程序调用
调用函数传入N个参数 并且N个参数都要将值返回
  
OLEObject ZCom
ZCom = Create OLEObject
ZCom.ConnectToNewObject("ZCom.ZCom")
string string1
string1="a"
string string2
string2="b"
string string3
string3="c"
ZCom.ComMethoud1(ref string1,ref string2,ref string3)
textbox1.Text=string1+"|"+string2+"|"+string3


___________________________________________________________
上述部分已经实现,现在的问题是:
需要传入的参数很多,有二三十个。一个一个的写,排列起来麻麻扎扎的,很讨厌
现在想用structure来传这个参数

structure struct
struct.s1=string1
struct.s2=string2
struct.s3=string3
ZCom.ComMethoud2(ref  struct)
textbox1.Text=struct.s1+"|"+struct.s2+"|"+struct.s3


但是一直没有成功
____________________________________________________________
之前用PB调用其他语言的标准DLL是可以将structure作为参数传递的
但是现在没成功有2个地方不一样
1.c#
2.是COM组件而非标准DLL



[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")】
public struct  objstruct
{
public string s1{get;set;}
public string s2{get;set;}
public string s3{get;set;}
}
 [ComVisible(true)]
    [Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
    public interface _ZCom
    {
      [DispId(1)]
        string ComMethoud1(ref string  s1,ref string s2,ref string s3);
        [DispId(2)]
        string ComMethoud2(ref objstruct stru);


    }

 [Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ZCom_Events
    {
    }


 [ComVisible(true)]
    [ProgId("ZCom.ZCom")]
    [Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ZCom_Events))]
  public class ZCom : _ZCom
{
  public void ComMethoud1(ref string  s1,ref string s2,ref string s3)
  {
       s1="a";s2="b";s3="c";
}
public void ComMethoud2(ref objstruct stru)
  {
       stru.s1="a";stru.s2="b";stru.s3="c";
}

}
 
ComMethoud1 能够正确使用
ComMethoud2不能成功,是因为C#代码有误,还是说COM组件本身就不支持structure?如果不支持,有其他类似的实现方式吗?


------解决思路----------------------
用json串试试,你无非也就是想要一个结构化的传参方式。
------解决思路----------------------
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
[ProgId("ZCom.Param")]
public struct  objstruct
{
public string s1{get;set;}
public string s2{get;set;}
public string s3{get;set;}
}

public void ComMethoud2(ref objstruct stru)
  {
       stru.s1="a";stru.s2="b";stru.s3="c";
}
参数也是一个Com对象,方法定义里面不需要ref
OLEObject ZCom
ZCom = Create OLEObject
ZCom.ConnectToNewObject("ZCom.ZCom")
OLEObject p
p= Create OLEObject
p.ConnectToNewObject("ZCom.Param")
p.s1 = "1"
p.s2="2"
p.s3="3"
ZCom.ComMethoud2(p)
  相关解决方案