以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  用VB.NET做的公开COM 能在金字塔下使用  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=143483)

--  作者:zyyh
--  发布时间:2016/11/28 17:02:02
--  用VB.NET做的公开COM 能在金字塔下使用
编写过程:
 图片点击可在新窗口打开查看

打开VS2010,选择 VB语言-选择类库-输入名称 zyyh (备注:此处绝对不允许输入中文,下面会说到这个)--点击确定
图片点击可在新窗口打开查看
在class1上面点击右键,选择重命名,重命名为 tianxiasan(备注:
此处也不允许输入中文,下面会说到这个) 
复制粘贴以下代码。功能仅仅是用于测试,作用是传递进来两个参数,传出一个相加结果
Public Class tianxiasan
    Public Function ceshi(ByVal 参数1 As Decimal, ByVal 参数2 As Decimal) As Decimal
        Return 参数1 + 参数2
    End Function
End Class
 图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看
此处已经设置完毕了,点击主菜单上保存-然后生成项目,生成的zyyh.dll 在保存项目下的
bin\\Debug的文件夹下


下面部分是注册
1:使用安装进行注册

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

完毕后  在计算机的 保存项目的文件夹下 会有个 安装包  我的是在 C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\注册安装包\\Debug
打开安装包,一直安装到底  会在 C:\\Program Files (x86)\\Microsoft\\注册安装包 这个文件夹下 有两个文件 zyyh.dll  zyyh.tlb

此处查看是否已经注册成功了的方法是  在开始菜单下 的搜索或者运行 输入 regedit  打开注册表

注意  如果前面的 不是zyyh和tianxiasan  而是中文  那么就会导致这里会出现乱码,导致调用失败
图片点击可在新窗口打开查看
 


底下是测试部分

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看图片点击可在新窗口打开查看




 然后运行测试 点击button  出现一个结果 
‘睇下是代码段 是 意思是引用 已经注册的 zyyh.tianxiasan  传递进去 1,2   在以前编译的zyyh.dll 处理完毕后  返回结果 3

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim yinyong \'创建一个变量
        yinyong = CreateObject("zyyh.tianxiasan")
        MsgBox(yinyong.ceshi(1, 2))
    End Sub
End Class
图片点击可在新窗口打开查看


下面一部分 是手动注册不是安装注册,会理解windows 运行原理
1:首先 net编译的 com 必须要有 net支持  因为选择net 4.0首先要查看 net4.0安装位置
 C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319   这个是我的 安装位置,我的系统是 win7 64位:
2:说明 net 编写的com必须要使用 这个环境底下的 RegAsm.exe 注册 
注册步骤如下
 2.1:在开始菜单下 打开系统的cmd ,输入  
   C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\RegAsm  C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.dll /tlb:C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.tlb 

此命令 意思是 使用 C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\下的RegAsm.exe  注册 C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.dll  并且生成库 C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.tlb
 2:.2:在开始菜单下 打开系统的regedit 在 相应位置 会看到 zyyh.tianxiasan  已经注册成功了(不会的 请看上面的 regedit 图片)

注册成功了,不代表能运行,此时运行不会报错,但是也不会出

现结果,原因是因为没有加入到系统缓存

 下面步骤是将zyyh.dll加入系统缓存
 此方法必须安装 VS2010 使用VS2010的命令行加入缓存 打开方法如下
图片点击可在新窗口打开查看
输入 gacutil /i C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.dll
意思是 将  
C:\\Users\\Administrator\\Desktop\\测试\\zyyh\\zyyh\\bin\\Debug\\zyyh.dll 加载到缓存
此处 会在 C:\\Windows\\Microsoft.NET\\assembly\\GAC_MSIL 底下 生成一个zyyh文件夹 里面放置了 一个4.0的文件夹(重命名会导致调用失败),这个文件夹下 就是zyyh.dll文件
注意  如果没有前面的签名,会导致 加入缓存失败
图片点击可在新窗口打开查看

再次测试就会成功啦 

 
我用了四个小时才搞定,一个人学习太痛苦了,高手带领的话 只要1分钟搞定的事情,我自己一个人搞用了4个小时 

 特别说明的是:
 
千万不要开放两个入口,就是不要写两个公开类在里面  
 
publice class 只允许有一个,
 
如果非得要使用class

请标志这个类为 友元  Friend Class,
 
否则哪里都不会出错,就是运行不起来

我现在做的项目 就是使用这个做的,一点一滴 累的要死
 
 
在金字塔里面调用就是在VBA底下输入
Sub Test()
        Dim yinyong \'创建一个变量
        yinyong = CreateObject("zyyh.tianxiasan")
        MsgBox(yinyong.ceshi(1, 2))
End Sub
在调用宏里面输入 Test,就好了

这里 如果申明的是一个对象,那么既可以放入 界面 又可以放入线程,还可以放入结构
如果是多个对象,就不用放入线程,但是同时也不可以放入界面,可以设置界面为共享 那样就不再为金字塔内部创建 窗口麻烦了。所有管理手段全部在自己编写的界面下操作,包括开平的操作

 
在金字塔里面 需要用到的 一些东西 我列出来下
\'定时器部分
Sub Application_VBAEnd()\'VBA停止事件
      Call Application.KillTimer(1)\'杀死定时器
End Sub
Sub Application_VBAStart()
         Call Application.SetTimer(1, 60000)\'启动定时器,并且设置定时器每隔60秒运行一次
End Sub
Sub Application_Timer(ByVal ID)
  If ID = 1 Then
         \'定时器内部操作代码填写处
  End If
End Sub
 
\'交易事件部分
Sub Order_OrderStatusEx2(OrderID, Status, Filled, Remaining, Price, Code, Market, OrderType, Aspect, Kaiping, Account, AccountType)
\'具体看参数VBA事件参数  Order对象的事件
End Sub
 
\'数据传输部分,此处是个模块,具体的要对应自己的DLL内容,这里写出来 只是看下该如何写传输模块
Sub ChuanRuShuJu(BanTu,PinZhong,DaZhouQiXuHao,DaZhouQiCount,ZhongZhouQiXuHao,ZhongZhouQiCount,XiaoZhouQiXuHao,XiaoZhouQiCount)
     \'Call TiShi("开始执行第四步")
     \'Call TiShi("开始执行第四步的第一项")
     Dim Zhou,Zhou_MACD,Ri,Ri_MACD,Shi,Shi_MACD
  \'处理大周期数据部分
        Set Zhou = marketdata.GetHistoryData(pinzhong, bantu, DaZhouQiXuHao) \'取M09连续的周线数据
        Set Zhou_MACD = marketdata.StkindiByData("MACD(26,12,9)", Zhou)
        \'Set Zhou_junxian = marketdata.StkindiByData("EXPMA(5,10,20,60,90,120,250,360,4)", Zhou)
  If Zhou.Count>= DaZhouQiCount Then\'如果数据充足,则载入最新数据,并且限定数据量
      For a = Zhou.Count -DaZhouQiCount To Zhou.Count - 1
    \'Call zyyh.add_Zhou(a, Zhou.Date(a), Zhou.High(a), Zhou.Low(a), Zhou.Open(a), Zhou.Close(a), Zhou_MACD.GetBufData("MACD", a), Zhou_MACD.GetBufData("DIFF", a), Zhou_junxian.GetBufData("M1", a), Zhou_junxian.GetBufData("M2", a), DaZhouQiXuHao)
    Call zyyh.add_Zhou(Zhou.Date(a), Zhou.High(a), Zhou.Low(a), Zhou.Open(a), Zhou.Close(a), Zhou_MACD.GetBufData("MACD", a), Zhou_MACD.GetBufData("DIFF", a), Zhou_MACD.GetBufData("DEA", a), DaZhouQiXuHao)
            Next
  Else\'如果数据不足,则载入最新的所有数据
      For a = 0 To Zhou.Count - 1
      \'Call zyyh.add_Zhou(a, Zhou.Date(a), Zhou.High(a), Zhou.Low(a), Zhou.Open(a), Zhou.Close(a), Zhou_MACD.GetBufData("MACD", a), Zhou_MACD.GetBufData("DIFF", a), Zhou_junxian.GetBufData("M1", a), Zhou_junxian.GetBufData("M2", a), DaZhouQiXuHao)
    Call zyyh.add_Zhou(Zhou.Date(a), Zhou.High(a), Zhou.Low(a), Zhou.Open(a), Zhou.Close(a), Zhou_MACD.GetBufData("MACD", a), Zhou_MACD.GetBufData("DIFF", a), Zhou_MACD.GetBufData("DEA", a), DaZhouQiXuHao)
            Next
  End If
  \'Call TiShi("开始执行第四步的第二项,总数据量:" & Zhou.Count )
  Set Zhou=NoThing
  Set Zhou_MACD =NoThing
      
  \'处理中周期数据部分
        Set Ri = marketdata.GetHistoryData(pinzhong, bantu, ZhongZhouQiXuHao)
        Set Ri_MACD = marketdata.StkindiByData("MACD(26,12,9)", Ri)
        \'Set Ri_junxian = marketdata.StkindiByData("EXPMA(5,10,20,60,90,120,250,360,4)", Ri)
  If Ri.Count>= ZhongZhouQiCount Then\'如果数据充足,则载入最新数据,并且限定数据量
      For a = Ri.Count -ZhongZhouQiCount To Ri.Count - 1
    \'Call zyyh.add_Ri(a, Ri.Date(a), Ri.High(a), Ri.Low(a), Ri.Open(a), Ri.Close(a), Ri_MACD.GetBufData("MACD", a), Ri_MACD.GetBufData("DIFF", a), Ri_junxian.GetBufData("M1", a), Ri_junxian.GetBufData("M2", a), ZhongZhouQiXuHao)
    Call zyyh.add_Ri(Ri.Date(a), Ri.High(a), Ri.Low(a), Ri.Open(a), Ri.Close(a), Ri_MACD.GetBufData("MACD", a), Ri_MACD.GetBufData("DIFF", a), Ri_MACD.GetBufData("DEA", a), ZhongZhouQiXuHao)
            Next
  Else\'如果数据不足,则载入最新的所有数据
      For a = 0 To Ri.Count - 1
      \'Call zyyh.add_Ri(a, Ri.Date(a), Ri.High(a), Ri.Low(a), Ri.Open(a), Ri.Close(a), Ri_MACD.GetBufData("MACD", a), Ri_MACD.GetBufData("DIFF", a), Ri_junxian.GetBufData("M1", a), Ri_junxian.GetBufData("M2", a), ZhongZhouQiXuHao)
    Call zyyh.add_Ri(Ri.Date(a), Ri.High(a), Ri.Low(a), Ri.Open(a), Ri.Close(a), Ri_MACD.GetBufData("MACD", a), Ri_MACD.GetBufData("DIFF", a), Ri_MACD.GetBufData("DEA", a), ZhongZhouQiXuHao)
            Next
  End If
     \'Call TiShi("开始执行第四步的第三项,总数据量:" & Ri.Count ) 
  Set Ri=NoThing
  Set Ri_MACD =NoThing
     
  \'处理小周期数据部分
        Set Shi = marketdata.GetHistoryData(pinzhong, bantu, XiaoZhouQiXuHao)
        Set Shi_MACD = marketdata.StkindiByData("MACD(26,12,9)", Shi)
        \'Set Shi_junxian = marketdata.StkindiByData("EXPMA(5,10,20,60,90,120,250,360,4)", Shi)
  If Shi.Count>= XiaoZhouQiCount Then\'如果数据充足,则载入最新数据,并且限定数据量
      For a = Shi.Count -XiaoZhouQiCount To Shi.Count - 1
    \'Call zyyh.add_Shi(a, Shi.Date(a), Shi.High(a), Shi.Low(a), Shi.Open(a), Shi.Close(a), Shi_MACD.GetBufData("MACD", a), Shi_MACD.GetBufData("DIFF", a), Shi_junxian.GetBufData("M1", a), Shi_junxian.GetBufData("M2", a),XiaoZhouQiXuHao)
    Call zyyh.add_Shi(Shi.Date(a), Shi.High(a), Shi.Low(a), Shi.Open(a), Shi.Close(a), Shi_MACD.GetBufData("MACD", a), Shi_MACD.GetBufData("DIFF", a), Shi_MACD.GetBufData("DEA", a),XiaoZhouQiXuHao)
            Next
  Else\'如果数据不足,则载入最新的所有数据
      For a = 0 To Shi.Count - 1
      \'Call zyyh.add_Shi(a, Shi.Date(a), Shi.High(a), Shi.Low(a), Shi.Open(a), Shi.Close(a), Shi_MACD.GetBufData("MACD", a), Shi_MACD.GetBufData("DIFF", a), Shi_junxian.GetBufData("M1", a), Shi_junxian.GetBufData("M2", a),XiaoZhouQiXuHao)
    Call zyyh.add_Shi(Shi.Date(a), Shi.High(a), Shi.Low(a), Shi.Open(a), Shi.Close(a), Shi_MACD.GetBufData("MACD", a), Shi_MACD.GetBufData("DIFF", a), Shi_MACD.GetBufData("DEA", a),XiaoZhouQiXuHao)
            Next
  End If
  \'Call TiShi("开始执行第四步的第四项,总数据量:" & Shi.Count)
  Set Shi=NoThing
  Set Shi_MACD =NoThing  
  \'Call TiShi("结束执行第四步")
 End Sub
 
在VB.NET里面设置对象线程 就跟普通的一模一样,大数据处理才用到这个,小数据计算就不需要
 
特别 特别注意,VBS不接收结构处理,所以啊,传递过来的结构都不接受,譬如在VB.NET定义结构为
Public Structure 结构_计算
            Dim 序号 As Int32
End Structure
在VB.NET内部可以传输 这个结构,但是在VBS里面,这个结构就传输不出来.反正我自己试了很多遍 都没传输出来,
但是可以设置Property的模式,这样就可以设置,譬如底下设置对象属性就是这样的,不允许有Call
 zyyh.PingDuoZhuangTai(BanTu, PinZhong,AccountID)=True\'设置平多状态为True
 zyyh.KaiDuoShuLiang(BanTu, PinZhong,AccountID)=0\'设置开多数量为0
读取属性就是这样的
KK=zyyh.PingKongZhuangTai(JiaoYiBanTu, JiaoYiPinZhong, AccountID)\'读取平空状态赋值给KK
 
如果计算数据太大,就需要用线程,涉及到多线程的异步和同步,如果计算数据不是太大,个人建议不要去搞,需要的知识有点多
 
 
这次如果还是看不了图片的话,不管球,当自己没写过的,反正也只是分享

--  作者:onlyflyttn
--  发布时间:2016/11/28 19:55:01
--  
vbs调dll能不能把事件传递进来?