головняк с DDE

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

головняк с DDE

Сообщение Griffin » 09.10.2007 (Вт) 10:22

Привет всем!
Возникла проблема в написании некоего DDE клиента на .NET
Третий день гуглю но обычно нарываюсь на пример DDE-клиента из API-Guide. В нем как то не раобраться толком (опыта видимо ен хватает)
В общем по сабжу. Есть некое приложение, которое является DDE-сервером. в VB 6.0 достаточно было написать
Label1.LinkTopic="DASSIDirect|myGroup"
Label1.LinkItem="myItem"
Label1.LinkMode=1
И вуаля, лейбл отражает текущее значение myItem
теперь с .Net
'***Всякая лабуда из Api-Guide
hszServer = DdeCreateStringHandle (idInst, myServerName, 1004) ' <> 0
hszTopic = DdeCreateStringHandle (idInst, myItemName, 1004) ' <> 0
ConToServer=DdeConnect (idInst, hszServer, hszTopic, 0) ' эта функция всегда возвращает 0 - тоесть нет подключения к серверу.
Теперь внимание вопрос!
Какими в моем случае должны быть переменные myServerName и myTopicName ?
Если у кого то есть готовый код подобного клиента - поделитесь плиз

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.10.2007 (Вт) 12:43

Два вопроса:
1. На кой пнадобилось юзать DDE вообще? Ибо древность сия, особенно на NET как то не очень смотрится. Что собственно нужно реализовать?
2. Как объявлены юзаемые функции? И как они юзаются?
Весь мир матрица, а мы в нем потоки байтов!

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 09.10.2007 (Вт) 12:55


Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

Сообщение Griffin » 09.10.2007 (Вт) 17:40

2 Gloom - спасибо, завтра посмотрю архив, надеюсь что там есть все что мне нужно ;)
2 Viper
1: Реализовать необходимо что то вроде сервера сбора данных. Тут может было лучше использовать OPC но для этого нужно было покупать и конфигурировать OPC сервер. Писать его самому нет никакого желания, ибо номенклатура контроллеров превышает десяток разнообразных модификаций а у каждого свой протокол соединения и тп. В настоящее время используется DDE сервер обмена. К нему подключается SCADA - при этом ежесекундно происходит чтение нескольких сотен значений, и все работает благополучно. Для того что бы не мутить воду я решил использовать DDE. А так как куплена лицензия только на .Net вот и возник такой головняк
2: Объявление и использование функций примерно такое же как и в примере из Api-Guide. За исключением того что там еще надо было для одной функции сделать "Delegate"

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.10.2007 (Ср) 7:15

Griffin писал(а):2: Объявление и использование функций примерно такое же как и в примере из Api-Guide. За исключением того что там еще надо было для одной функции сделать "Delegate"

Если объявление такое же, то вполне возможно, что оно неправильное поскольку Long в VB6 = Integer в VB.NET
Весь мир матрица, а мы в нем потоки байтов!

Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

Сообщение Griffin » 10.10.2007 (Ср) 7:22

нет, все в интежер
Я создал сначала проект на VB6 проверил что все работает и потом экспортнул в .Net, он сам практически все исправил.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.10.2007 (Ср) 7:45

Тогда выкладывай кусок кода и что и в каком месте не так.
Весь мир матрица, а мы в нем потоки байтов!

Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

Сообщение Griffin » 10.10.2007 (Ср) 9:24

Код: Выделить всё
' @Module1
Option Strict Off
Option Explicit On
Module Module1
    Public Const myServerName As String = "DASSIDirect"
    Public Const myTopicName As String = "L1G1"
    Public Const CP_WINANSI As Short = 1004
    Delegate Function DdeCllbackDelegate(ByVal uType As Integer, ByVal uFmt As Integer, ByVal hConv As Integer, ByVal hszTopic As Integer, ByVal hszItem As Integer, ByVal hData As Integer, ByVal dwData1 As Integer, ByVal dwData2 As Integer) As Integer
    Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (ByRef pidInst As Integer, ByVal pfnCallback As DdeCllbackDelegate, ByVal afCmd As Integer, ByVal ulRes As Integer) As Short
    Public Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Integer, ByVal psz As String, ByVal iCodePage As Integer) As Integer
    Public Declare Function DdeConnect Lib "user32" (ByVal idInst As Integer, ByVal hszService As Integer, ByVal hszTopic As Integer, ByRef pCC As String) As Integer
    Public Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Integer, ByVal hsz As Integer) As Integer
    Public Declare Function DdeQueryString Lib "user32" Alias "DdeQueryStringA" (ByVal idInst As Integer, ByVal hsz As Integer, ByVal psz As String, ByVal cchMax As Integer, ByVal iCodePage As Integer) As Integer
    Public Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Integer) As Integer
    Function DdeCllback(ByVal uType As Integer, ByVal uFmt As Integer, ByVal hConv As Integer, ByVal hszTopic As Integer, ByVal hszItem As Integer, ByVal hData As Integer, ByVal dwData1 As Integer, ByVal dwData2 As Integer) As Integer
        DdeCllback = frmMain.AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2)
    End Function
End Module


Код: Выделить всё
'@Form1
Option Strict Off
Option Explicit On
Friend Class frmMain
    Inherits System.Windows.Forms.Form
    Dim hszServer, idInst, hszTopic As Integer
    Dim conToServer As Integer
    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        If DdeInitialize(idInst, AddressOf DdeCllback, 10, 0) Then Exit Sub
        hszServer = DdeCreateStringHandle(idInst, myServerName, CP_WINANSI)
        hszTopic = DdeCreateStringHandle(idInst, myTopicName, CP_WINANSI)
        conToServer = DdeConnect(idInst, hszServer, hszTopic, 0)
        If hconvServer Then
            Me.Close()
            Exit Sub
        End If
       
    End Sub

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.10.2007 (Ср) 9:56

1. Что есть 10 в вызове DdeInitialize (лениво лезть искть значения констант)
2. Где AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2) ?
3. Какую ошибку получаем?
4. Option Strict Off - сознательно включен или так получилось?
Весь мир матрица, а мы в нем потоки байтов!

Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

Сообщение Griffin » 10.10.2007 (Ср) 10:02

1: - Значение Флага APPCMD_CLIENTONLY
2:- Специально не выкладывал ибо не видел необходимости
3:- Никаких ошибок, просто форма должна закрыться если есть коннект
4:- так получилось

Griffin
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.05.2006 (Пн) 10:28

Сообщение Griffin » 10.10.2007 (Ср) 10:44

2 Gloom - Огромное спасибо, я получил то что я менно хотел. Респект
2 Viper - в принципе моя задача решена, но мне все равно интересно почему не работал мой вариант так что дискуссия продолжается=)


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList  
cron