首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA to VB (DCOM)

Excel VBA to VB (DCOM)
EN

Stack Overflow用户
提问于 2009-04-27 22:07:23
回答 3查看 2.4K关注 0票数 4

我继承了一个Excel VBA电子表格。我的任务是将它转换成VB。

我认为应用程序使用DCOM对象从PLC获取数据。下面的代码在MX1.0更新时运行子SBR1Select。

代码语言:javascript
复制
Sub Workbook_Open()
    ActiveWorkbook.SetLinkOnData "dassidirect|strandburner!MX1.0", "SBR1Select"
End Sub

当我打开控制面板->管理工具->组件服务,然后导航到控制台根->组件服务-> Computers -> My Computer -> DCOM Config列出了"DASSIDirect“项,我相信这就是Excel引用的项。

如何通过DASSIDIRECT组件将VB代码连接到PLC?

注意: DASSIDIRECT也是一项Windows服务(不确定这是否有助于回答这个问题)。

EN

回答 3

Stack Overflow用户

发布于 2009-04-29 23:02:25

很久以前,我做了一些关于PLC的工作,并询问了我的一个老同事。他说,你需要来自WonderWare的InTouch,它有一组DASSIDIRECT2兼容的程序集,可以为你提供你需要的东西。

Here's是最新的版本,我希望它就是你想要的。

票数 1
EN

Stack Overflow用户

发布于 2009-05-17 10:16:23

哇,DDE。DDE,我相信您已经知道它已经相当老了。网络DDE已经折旧,将不再在Vista中工作。我只能想象这一趋势可能会继续下去。然而,user32中的DDE API仍然有效(参考资料在这里:http://msdn.microsoft.com/en-us/library/ms674605(VS.85).aspx,您可以从.net应用程序中调用它,只需做一些工作。我能找到的唯一例子是VB6,即使在那个时候它们也很老了。我相信你可以想象到这有点痛苦。无论如何,我从API-Guide (来自Mentalis)中挖掘出了这个示例。它不是.Net,但无论如何都应该让您开始使用它:

代码语言:javascript
复制
'This application shows you how to use DDE to create a better PrevInstance-function.
'Compile this sample and start it two times
'The first instance minimizes itself and when the second instance is started, it will
'send a message to the first instance to maximize itself.

'in a module
Public Const VBServerName = "TestServer"
Public Const VBTopicName = "SHOW_YOUR_MAIN_WINDOW"
Public Const XCLASS_BOOL = &H1000
Public Const XTYPF_NOBLOCK = &H2 ' CBR_BLOCK will not work
Public Const XTYP_CONNECT = &H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK
Public Const CP_WINANSI = 1004 ' default codepage for windows & old DDE convs.
Public Const SW_RESTORE = 9
Public Const DDE_FACK = &H8000
Public Const XCLASS_FLAGS = &H4000
Public Const XTYP_EXECUTE = &H50 Or XCLASS_FLAGS
Public Const DNS_REGISTER = &H1
Public Const DNS_UNREGISTER = &H2
Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (pidInst As Long, ByVal pfnCallback As Long, ByVal afCmd As Long, ByVal ulRes As Long) As Integer
Public Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Long, ByVal psz As String, ByVal iCodePage As Long) As Long
Public Declare Function DdeConnect Lib "user32" (ByVal idInst As Long, ByVal hszService As Long, ByVal hszTopic As Long, pCC As Any) As Long
Public Declare Function DdeNameService Lib "user32" (ByVal idInst As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Public Declare Function DdeQueryString Lib "user32" Alias "DdeQueryStringA" (ByVal idInst As Long, ByVal hsz As Long, ByVal psz As String, ByVal cchMax As Long, ByVal iCodePage As Long) As Long
Public Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
Function DdeCllback(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal dwData1 As Long, ByVal dwData2 As Long) As Long
    DdeCllback = Form1.AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2)
End Function
'in a form
Dim isRun As Boolean, idInst As Long, hszVBServer As Long, hszVBTopic As Long
Dim hconvVBServer As Long, dderesult As Long
Private Sub Form_Load()
   'KPD-Team 2000
   'URL: http://www.allapi.net/
   'E-Mail: KPDTeam@Allapi.net
   If DdeInitialize(idInst, AddressOf DdeCllback, 0, 0) Then Exit Sub
   hszVBServer = DdeCreateStringHandle(idInst, VBServerName, CP_WINANSI)
    hszVBTopic = DdeCreateStringHandle(idInst, VBTopicName, CP_WINANSI)
    'try to find the first instance
    hconvVBServer = DdeConnect(idInst, hszVBServer, hszVBTopic, ByVal 0&)
    If hconvVBServer Then
        Unload Me
        Exit Sub
    End If
    DdeNameService idInst, hszVBServer, 0, DNS_REGISTER
    Me.WindowState = vbMinimized
End Sub
Private Sub Form_Unload(Cancel As Integer)
        DdeFreeStringHandle idInst, hszVBServer
        DdeFreeStringHandle idInst, hszVBTopic
        'only unregister the DDE server for first instance
        If isRun Then
            If DdeNameService(idInst, hszVBServer, 0, DNS_UNREGISTER) Then
                MsgBox "in ServiceUnRegister", vbOKOnly, "Error"
            End If
        End If
        DdeUninitialize idInst
End Sub
Function AppDdeCallback(ByVal wType As Long, ByVal wFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
        Dim iCount As Long, Buffers As String, Ret As Long
        Select Case wType
            Case XTYP_CONNECT
                iCount = DdeQueryString(idInst, hszTopic, vbNullString, 0, CP_WINANSI)
                Buffers = Space(iCount)
                DdeQueryString idInst, hszTopic, Buffers, iCount + 1, CP_WINANSI
                If Buffers = VBTopicName Then
                    Me.WindowState = vbNormal
                    'add any code for the first instance have found the second one is launch
                    Ret = DDE_FACK
                End If
                AppDdeCallback = Ret
            Case XTYP_EXECUTE
                AppDdeCallback = Ret
        End Select
End Function
票数 1
EN

Stack Overflow用户

发布于 2009-10-15 01:16:38

解决这个问题的最简单的方法是使用VB6并创建一个“DDE”,它将ActiveX与SIDirect进行通信。从VB6做DDE是微不足道的。然后使用tlbimp为VB6模块创建一个主互操作程序集,或者简单地从C#代码中引用可执行文件作为COM组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/795474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档