нужна помощь (обмен с внешней программой через библиотеку)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

нужна помощь (обмен с внешней программой через библиотеку)

Сообщение kulidas » 14.09.2006 (Чт) 15:34

Прошу помочь
есть внешняя программа (АРМ оператора), есть библиотека для обмена
АРМ'а с другими программами.
Пишется новая программа, которая должна обмениваться командами с АРМ чере эту библиотеку.
Подключение библиотеки и тестовые команды проходят.
Не понятно описание одной команды (составлено описание под язык типа Delphi, как я понял) - прошу помочь перевести на VB:
procedure nasc_CmdCallGroup(const CmdCallGroup: TCmdCallGroup);
Команда предназначена для вызова группы. В процедуру передаётся структура
TCmdCallGroup = packed record
NCommand: Integer; - номер команды(произвольное число)
IDGroup: DWord; - ID группы, которую необходимо вызвать
Phone: array [0..28] of Char; - номер телефона, который необходимо передать.
end;
Возвращение успешного завершения команды означает передачу АРМ УРВ команды вызова.

Насколько я понял речь идет про передачу функции пользовательского типа данных
т.е. например,
Private Type TCmdCallGroup
NCommand As Integer
IDGroup As long
Phone As long
Дальше
Dim tt As TCmdCallGroup
tt.Ncommand = значение
.....
и передаем функции tt.
????
Но что делать с "END",
и что это за тип данных DWORD и array [0..28] of Char??
B Как объявить тип переменной в самой функции??
Прошу помочь.
Спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.09.2006 (Чт) 15:58

DWord -> Long
array [0..28] of Char -> String*29
end -> End Type
Изображение

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 14.09.2006 (Чт) 16:41

tyomitch писал(а):DWord -> Long
array [0..28] of Char -> String*29
end -> End Type


а как этот массив строк описать в type и присвоить в dim??

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.09.2006 (Чт) 16:45

kulidas, это не массив строк.
Описать в Type: заменой строки слева от знака -> на строку справа от него.
Присвоить: так же, как в Delphi или любом другом ЯП (через точку)
Изображение

050
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.11.2005 (Пн) 11:59

Сообщение 050 » 15.09.2006 (Пт) 9:15

tyomich, не пинай меня сильно..я начинающий :)
укажи, пожалуйста, на ошибку, что я неправильно делаю согласно приведенному заданию:
Код: Выделить всё
В модуле
Public Declare Function nasc_CmdCallGroup Lib "NASC_Exchange.dll" (CmdCallGroup As Employee) As Boolean
Public Type Employee
Ncommand As Integer
IDGroup As Long
Phone As String * 29
End Type

В форме

Private Sub Command1_Click()
Dim TCmdCallGroup As Employee
TCmdCallGroup.Ncommand = 128
TCmdCallGroup.IDGroup = 7
TCmdCallGroup.Phone = "2784578"
'Call nasc_CmdCallGroup(TCmdCallGroup)
Text3.Text = nasc_CmdCallGroup(TCmdCallGroup)
End Sub

дело в том, что функция возвращает true , но на АРМ'е ничего не происходит, тогда как должен осуществляться вызов по номеру "2784578"

Спасибо за терпение..


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.09.2006 (Пт) 9:32

Ncommand As Integer попробуй заменить на Ncommand As Long
Lasciate ogni speranza, voi ch'entrate.

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 14:21

alibek, к сожалению, это не помогает.
А вот если обратиться к описанию то там написано:
procedure nasc_CmdCallGroup(const CmdCallGroup: TCmdCallGroup);
Команда предназначена для вызова группы. В процедуру передаётся структура
TCmdCallGroup = packed record
NCommand: Integer; - номер команды(произвольное число)
IDGroup: DWord; - ID группы, которую необходимо вызвать
Phone: array [0..28] of Char; - номер телефона, который необходимо передать.
end;
Возвращение успешного завершения команды означает передачу АРМ УРВ команды вызова.

const CmdCallGroup - не оначант ли что этот пользовательский тип данных нужно объявить константой??

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

Сообщение Viper » 15.09.2006 (Пт) 14:31

В VB нельзя объявить константой передаваемое значение. Тем более нельзя сделать константой пользовательский тип.

А какой тип должна возвращать процедура Delphi?
Весь мир матрица, а мы в нем потоки байтов!

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 15:09

!Viper,
вот что написано в описании:
Возвращение успешного завершения команды означает передачу АРМ УРВ команды вызова.

у меня As boolean и она мне возвращает true. Но вызова не происходит.
У меня есть исходный код на делфи, где реализованы эти функции,
если есть возможность помочь могу выслать...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.09.2006 (Пт) 15:29

Наверное все-же функция возвращает As Long, а не As Boolean.
Lasciate ogni speranza, voi ch'entrate.

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 15:47

alibek писал(а):Наверное все-же функция возвращает As Long, а не As Boolean.

..если As long - тогда возвращает 1

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.09.2006 (Пт) 16:08

Ну значит работает.
Хотя лучше код на дельфи выложи.
Lasciate ogni speranza, voi ch'entrate.

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 16:26

alibek,
работает но искомого вызова не производит...
другие функции, где не надо передавать пользовательские
типы данных - тоже работают и есть зримое подтверждение их работы
на АРМ'е.
хотя такая же программа на делфи работает.
Код большой, может лучше по email?

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 16:41

..вот так, например, происходит вызов функции:
Код: Выделить всё
procedure TForm1.btCallClick(Sender: TObject);
var
   CmdCG: TCmdCallGroup;
begin
   CmdCG.NCommand:=88;
   CmdCG.IDGroup:=seDepID.Value;
   StrLCopy(CmdCG.Phone, PChar(edPhone.Text), SizeOf(CmdCG.Phone));
   nasc_CmdCallGroup(CmdCG);
end;

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 15.09.2006 (Пт) 16:49

текст на делфи
Вложения
Test.rar
(2.53 Кб) Скачиваний: 51

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

Сообщение Viper » 16.09.2006 (Сб) 6:06

Судя по приведенному коду это отнюдь не функция, а процедура, соответственно возвращать ей нечего. И это единственное, что можно узнать из аттача.
Варианты:
1. Вызывать ее все-таки как процедуру, а не функцию?
2. Передавать не структуру, а указатель на нее.
Весь мир матрица, а мы в нем потоки байтов!

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 16.09.2006 (Сб) 9:29

!Viper!,
здесь в примере и описании все значится как процедуры,
в своем приложении я другие функции обозначаю как функции и обращаюсь к ним как к функциям и они работают...
и в описании написано что она должна возвращать - значит все таки функция (может это какие тонкости делфи?? :))
Вопрос:
а чем отличается передача функции (процедуре) структуры от указателя на нее??
Спасибо!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2006 (Сб) 9:43

Viper, процедура и функция по способу вызова ничем не отличаются. Т.е. kulidas прав: любую функцию можно вызывать как процедуру, и наоборот.

Кроме того, передавать в функцию структуру средствами VB невозможно. kulidas передаёт указатель на неё (и совершенно правильно делает). Это к тому, что вопроса "передавать не структуру, а указатель" здесь не стоит (и вообще никогда не стоит в прогах на VB).
Изображение

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

Сообщение Viper » 16.09.2006 (Сб) 9:54

Ну насчет передачи указателя вместо собственно структуры это уже пошли просто идеи типа "почему бы не попробовать". По идее VB и так передает указатель на структуру.

Насчет функция или процедура. Если функция в библиотеке действительно объявлена как функция, то она возвращает некое значение, указывающее на успешность или неуспешность ее выполнения. Кстати, неплохо бы знать, что она возвращает в случае успеха. Фантазия разработчика в принципе ничем не ограничена.
Если же в библиотеке эта функция объявлена как процедура, то возникает вопрос, а что же мы получаем при попытке вызова ее как функции?
Последний раз редактировалось Viper 16.09.2006 (Сб) 10:14, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2006 (Сб) 9:58

!Viper! писал(а):Если же в библиотеке эта функция объявлена как процедура, то возникает вопрос, а что же мы получаем при попытке вызова ее как функции?

Безобидный мусор.
Изображение

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

Сообщение Viper » 16.09.2006 (Сб) 10:12

И этот безобидный мусор не будет иметь никакого отношения к успешности выполнения процедуры.
Весь мир матрица, а мы в нем потоки байтов!

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 26.09.2006 (Вт) 14:26

...по-прежнему прошу помочь...
кажется, понятно почему не происходит вызова..
В описании к библиотеке написано что:
При старте приложения необходимо выполнить функцию открытия обмена
function nasc_OpenExchange(Wnd: HWND; Msg: DWord): Boolean;
В функцию передаётся HWND окна, которое будет принимать сообщения и номер сообщения.
В случае удачного выполонения функция возращает True.

при попытке обратитьтся к функции из моего приложения
возникает ошибка 49 "Bad DLL Calling Convention"

прошу показать что я неправильно объявляю:


Код: Выделить всё
В модуле
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function nasc_OpenExchange Lib "NASC_Exchange.dll" (ByVal Wnd As Long, ByVal Msg As Long) As Boolean

В форме

Private Sub Form_Load()
Dim hwnd As Long
Dim name As String
name = "Рабочее место УРВ - Pallada 20050210-1"
hwnd = FindWindow(vbNullString, name)
Text1.Text = hwnd
Call nasc_OpenExchange(hwnd, 127)
End Sub


и еще вопрос:
не ActiveX библиотеки нужно регистрирорвать через regsvr32???

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

Сообщение Viper » 26.09.2006 (Вт) 14:31

Регистрирровать не надо!

На какой строке ошибка?
Весь мир матрица, а мы в нем потоки байтов!

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 26.09.2006 (Вт) 14:38

Код: Выделить всё
Call nasc_OpenExchange(hwnd, 127)

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

Сообщение Viper » 26.09.2006 (Вт) 14:48

Разглядел
1. Объявление меняй на:
Код: Выделить всё
Public Declare Function nasc_OpenExchange Lib "NASC_Exchange.dll" (ByVal Wnd As Long, ByVal Msg As Long) As Long


Вызов делай либо так:
Код: Выделить всё
nasc_OpenExchange hwnd, 127


либо так:
Код: Выделить всё
Dim lngRes As Long
lngRes =  nasc_OpenExchange(hwnd, 127)


и проверяй hwnd на равенство нулю
Последний раз редактировалось Viper 26.09.2006 (Вт) 15:19, всего редактировалось 2 раз(а).
Весь мир матрица, а мы в нем потоки байтов!

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 26.09.2006 (Вт) 15:15

в объявлении на As long поменял,
но
Код: Выделить всё
Dim lngRes As Long
lngRes =  nasc_OpenExchange (hwnd, 127)


- ошибка таже (49)
Код: Выделить всё
Call nasc_OpenExchange hwnd, 127

- compile error
Expected: end of statement

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

Сообщение Viper » 26.09.2006 (Вт) 15:21

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

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 26.09.2006 (Вт) 15:38

..в смысле вызывать по имени, без call?
- ошибка та же...
это же не процедура, а функция!

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 27.09.2006 (Ср) 6:40

Прошу обратить внимание на то, что текст, передаваемый VB отличается от текста, передаваемого Delphi: там нет завершающего 0 в конце реальной строки. 0, конечно, там будет, но не в том месте. Вместо "2784578" будет "2784578<пробелы>", а это, наверное, но то, что ждет функция/процедура.
Код: Выделить всё
Public Type Employee
  Ncommand As Integer
  IDGroup As Long
  Phone As String * 29
End Type

хоть
Public Declare Function nasc_CmdCallGroup Lib "NASC_Exchange.dll" (CmdCallGroup As Employee) As Boolean
хоть
Public Declare Sub nasc_CmdCallGroup Lib "NASC_Exchange.dll" (CmdCallGroup As Employee)

  Dim TCmdCallGroup As Employee
    TCmdCallGroup.Ncommand = 128
    TCmdCallGroup.IDGroup = 7
    TCmdCallGroup.Phone = "2784578" & Chr(0)
    Call nasc_CmdCallGroup(TCmdCallGroup)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

kulidas
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 14.09.2006 (Чт) 15:07
Откуда: Санкт-Петербург

Сообщение kulidas » 29.09.2006 (Пт) 10:55

....все попытки и подсказки безуспешны.
В настоящее время проблема временно решена путем sendkey в нужное окно определенных комбинаций клавиш, но это не со всем то, и , к тому же, обмен односторонний...
Поскольку моих скромных знаний начинающего не хватает разобраться
с внешней библиотекой предлагаю (не зная, не противоречит ли это правилам данного форума) денежное вознаграждение за пример реализации данных функций на VB.
Дополнительно к выложенному и работающему коду на Delphi выкладываю также описание библиотеки от разработчика и список используемых констант и конструкций.
Предлагаю читать тему как Delphi vs VB. :)
Короче, если возможно прошу помочь...

След.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 95

    TopList