以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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,
否则哪里都不会出错,就是运行不起来
我现在做的项目 就是使用这个做的,一点一滴 累的要死
在金字塔里面 需要用到的 一些东西 我列出来下
\'定时器部分
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能不能把事件传递进来? |