powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / null-терминированная строка
49 сообщений из 49, показаны все 2 страниц
null-терминированная строка
    #35566093
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток, уважаемые!

Подскажите пожалуйста как получить адресс null-терминированной строки?
Т.е. есть:

Код: plaintext
1.
2.
dim par$
par = "aaaaaa" & Chr$( 13 ) & "bbbb" & Null

Надо получить адрес этой конструкции, не подскажите как?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35566132
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем это был глупый вопрос. Он уже снят. Но зато появился другой: Когда в результате выполнения функции из dll возвращается null-терминированная строка, и я пытаюсь ее считать в переменную то вываливается ошибка VB:

AppName: vb6.exe AppVer: 6.0.89.88 ModName: kernel32.dll
ModVer: 5.1.2600.3119 Offset: 00009d92

Как с этим бороться?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35566172
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> В общем это был глупый вопрос. Он уже снят.

Самокритика это хорошо ;)

> Но зато появился другой: Когда в результате выполнения функции из dll возвращается
> null-терминированная строка, и я пытаюсь ее считать в переменную то вываливается ошибка
> VB:

А как пытаешся считать?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35571255
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При вызове функции я использую пользовательский тип данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Type TMTEMsg
    DataLen As Long
    Data As String
End Type

'объявление функции из dll:
Private Declare Function DF_Structure& Lib "my.dll" _
    Alias "MTEStructure" ( _
    ByVal Idx As Long, _
    ByRef Msg As TMTEMsg)

'И собственно вызов: 
Dim Msg As TMTEMsg, Idx&

Idx = DF_Structure(Idx, Msg)


P.S. извини что долго не отвечала - заболела и провалялась 2 дня (
...
Рейтинг: 0 / 0
null-терминированная строка
    #35571388
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> При вызове функции я использую пользовательский тип данных:
>
> Type TMTEMsg
> DataLen As Long
> Data As String
> End Type
>
> 'объявление функции из dll:
> Private Declare Function DF_Structure& Lib "my.dll" _
> Alias "MTEStructure" ( _
> ByVal Idx As Long, _
> ByRef Msg As TMTEMsg)
>
> 'И собственно вызов:
> Dim Msg As TMTEMsg, Idx&
>
> Idx = DF_Structure(Idx, Msg)

Вылетает на вызове функции, или при попытке считать данные из структуры Msg?
Может нужно перед вызовом сделать так:
'И собственно вызов:
Dim Msg As TMTEMsg, Idx&
Msg.Data = Space(255) 'Или сколько нужно
Idx = DF_Structure(Idx, Msg)

> P.S. извини что долго не отвечала - заболела и провалялась 2 дня (
То-то я думаю, чего начал заболевать, а это от тебя

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35571640
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
null-терминированная строка
    #35571966
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Странно, но сейчас уже не вылетает. после того как я поставила
Код: plaintext
Msg.Data = Space( 255 )
И очень даже хорошо выполнилась функция из dll. Вот, но само поле Msg.Data у меня осталось одними пробелами, и после вызова функции, а вот значение Msg.DataLen вернуло совершенно другое число (как я понимаю это размер данных поля Msg.Data). Собственно мне кажется что надо создать указатель. Но как его задать - я не знаю. подскажи пожалуйста.

P.S. Не знала, что зараза может быть перенесена посредствам интернета из Москвы на Украину извини что заражаю

Бенедикт
Книга Дена Эппелмана у меня под рукой и я понимаю, что тип данных LPSTR-это 32-разрядный указатель на строку, завершенную null-символом. Только я вот не понимаю как эту строку мне считать в VB ((. Спасибо за ссылку очень полезно для ликбеза :)
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572424
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, ну помогите же немного туповатой програмисту-женщине Ну не понимаю я как из буффера считать данные, которые передались при вызове функции из dll в указатель на пользовательский тип данных.
Повторюсь тип данных объявлен как:
Код: plaintext
1.
2.
3.
4.
Type TMTEMsg
    DataLen As Long
    Data As String
End Type
как из этого типа данных считать данные в Data?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572566
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Товарищи, ну помогите же немного туповатой програмисту-женщине Ну не понимаю я как
> из буффера считать данные, которые передались при вызове функции из dll в указатель на
> пользовательский тип данных.

Пообедать дашь?

> Повторюсь тип данных объявлен как:
>
> Type TMTEMsg
> DataLen As Long
> Data As String
> End Type
> как из этого типа данных считать данные в Data?

судя по структуре и тому что я знаю, скорее всего перед вызовом функции нужно
инициализировать строку, обычно делаю это пробелами, а в поле DataLen положить длину этой
строки. Тогда при вызове в функции возможно идет считывание из DataLen длины
подготовленной строки и исходя из этого эта строка заполняется данными и в DataLen
записывается длина заполненных данных. Возможно нужно делать первый вызов "холостым" и в
DataLen смотреть какой длины нужна строка и распределять строку перед повторным вызовом.
Возможно есть ещё подводные рифы

я помог Kallandor*ВЫРЕЗАННО ЦЕНЗУРОЙ* програмисту-женщине?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572621
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
это не Эпплман. Почитайте.

Вариантов много. Вот, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//в DLL
typedef struct tagTMTEMsg {
   LONG  DataLen;
   LPSTR Data;
} TMTEMsg, *PMTEMsg;

LONG WINAPI MTEStructure(LONG Idx, PMTEMsg Msg)
{
   strncpy(Msg->Data, "У попа была собака", Msg->DataLen);
   return strlen(Msg->Data);
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
'В VB/VBA
Private Sub Command2_Click()
 Dim Msg As TMTEMsg
 Dim lResult As Long
 Msg.DataLen =  255 
 Msg.Data = String$(Msg.DataLen,  0 )
 lResult = DF_Structure( 1 , Msg)
 Debug.Print "<" & Left$(Msg.Data, lResult) & ">"
End Sub
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572633
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос

Ну не совсем помог :( Потому как я не понимаю что не правильно или чего не хватает в последовательности дейстий:
1.перед вызовом функции я инициализирую пробелами Msg.Data
2. Вызываю функцию DF_Structure
3. В поле Msg.DataLen действительно получается размер полученных данных

По моей логике (которая может отличаться от программной) после вызова DF_Structure в поле Msg.Data должны появляться собственно строковые данные, а их нет :( только пробелы, инициализированные в начале :( Что неправильно?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572684
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт
Сделала так как вы подсказали. Debug.Print - ничего не вывел, видать потому что в Msg.Data содержатся null символы или что-то еще. В общем когда наводишь курсор на поле Msg.Data, то строка показана в виде квадратиков (ну как chr(13))
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572700
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
бесполезный разговор без кода.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572712
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь Горбонос
>
> Ну не совсем помог :( Потому как я не понимаю что не правильно или чего не хватает
> в последовательности дейстий:
> 1.перед вызовом функции я инициализирую пробелами Msg.Data
> 2. Вызываю функцию DF_Structure
> 3. В поле Msg.DataLen действительно получается размер полученных данных
>
> По моей логике (которая может отличаться от программной) после вызова DF_Structure
> в поле Msg.Data должны появляться собственно строковые данные, а их нет :( только
> пробелы, инициализированные в начале :( Что неправильно?


А что говорит документация к этой функции?

KallandorВ общем когда наводишь курсор на поле Msg.Data, то строка показана в виде
квадратиков (ну как chr(13))
Может эти квадратики и есть та информация, которая ожидается ;)

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572719
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще может выложишь свою длл, что-бы можно было посмотреть на неё поближе?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572908
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Вообще может выложишь свою длл, что-бы можно было посмотреть на неё поближе?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

Игорь, извини, но dll выложить наверное не могу
Описание поля Data:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Поле Data структуры TMTEMsg, указатель на которую возвращает функция 
MTEStructure, представляет собой бинарный массив данных. Данный буфер содержит описания о 
доступных для данной сессии информационных объектах и имеет следующий формат  (описание 
элементарных типов String, Integer и т.п. см. прил.  5 ):

поле			тип		
TInterface:						
ИмяИнтерфейса		String
ОписаниеИнтерфейса	String
ПеречислимыеТипы	TEnumTypes
Таблицы			TTables
Транзакции		TTransactions

Собственно описание информационных объектов состоит из трех блоков: описание перечислимых
 типов, таблиц и транзакций.

TEnumTypes:
КолвоТипов		Integer
Тип1			TEnumType
Тип2			TEnumType
...
ТипN			TEnumType

TEnumType:
Имя			String
Описание		String
Размер			Integer
Тип			TEnumKind
КолвоКонстант		Integer
Константа1		String
Константа2		String
...
КонстантаN		String

TEnumKind:		Integer
ekCheck =  0 		
ekGroup =  1 		
ekCombo =  2 

Вот, собственно когда я объявляю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Type ArrStr
    dataArr() As Byte
End Type

Type TMTEMsg
    DataLen As Long
    Data As ArrStr
End Type
То в массиве dataArr появляются нолики (((
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572923
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал тему "Dll не подключается". Там есть такое сообщение:
KallandorКодов dll нет.

Вызов функции из dll:
Код: plaintext
1.
2.
3.
4.
5.
6.
'фунции из библиотеки mtesrl.dll
Private Declare Function DF_Connect Lib "mtesrl.dll" _
    Alias "MTEConnect" ( _
    ByVal Params As String, _
    ByVal ErrorMsg As String) As Integer

Текст ini
[GENERAL]
Logging=1
ClientLogsDir=./Logs
ClientLogLevel=2
ErrLog=./Logs/ErrorLog.txt

Пример описания и вызова функции на C++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
(C language definition)
int32 WINAPI MTEConnect(char *Params, char *ErrorMsg);


... вызов
int32 Idx;
char ErrorMsg[ 255 ];
...
Idx = MTEConnect(“PORT=COM1\rBAUDRATE= 115200 ”, ErrorMsg);
if( Idx < MTE_OK )
{
fprintf(stderr, “Ошибка при установке соединения: %s”, ErrorMsg);
	exit( 1 );
}
else 
  fprintf(stdout, “Соединение установлено.”);


Во-первых, есть ошибочка:
Код: plaintext
1.
2.
3.
Private Declare Function DF_Connect Lib "mtesrl.dll" _
    Alias "MTEConnect" ( _
    ByVal Params As String, _
    ByVal ErrorMsg As String) As Long
Во-вторых, непонятны в этом контексте вопросы про передачу UDT.
В-третьих, Params входной параметр, ErrorMsg - выходной, сишный пример даёт образец для VB-кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
 Dim Idx As Long
 Dim ErrorMsg As String
 Dim NullCharPos As Long
 ErrorMsg = String$( 255 , vbNullChar)
 Idx = MTEConnect("PORT=COM1" & vbCr & "BAUDRATE=115200", ErrorMsg)
 NullCharPos = InStr(ErrorMsg, vbNullChar)
 If NullCharPos Then ErrorMsg = Left$(ErrorMsg, NullCharPos -  1 )
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572945
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктВо-первых, есть ошибочка:
Код: plaintext
1.
2.
3.
Private Declare Function DF_Connect Lib "mtesrl.dll" _
    Alias "MTEConnect" ( _
    ByVal Params As String, _
    ByVal ErrorMsg As String) As Long
Во-вторых, непонятны в этом контексте вопросы про передачу UDT.
В-третьих, Params входной параметр, ErrorMsg - выходной, сишный пример даёт образец для VB-кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
 Dim Idx As Long
 Dim ErrorMsg As String
 Dim NullCharPos As Long
 ErrorMsg = String$( 255 , vbNullChar)
 Idx = MTEConnect("PORT=COM1" & vbCr & "BAUDRATE=115200", ErrorMsg)
 NullCharPos = InStr(ErrorMsg, vbNullChar)
 If NullCharPos Then ErrorMsg = Left$(ErrorMsg, NullCharPos -  1 )
[/quot]

С первым замечанием не согласна, потому как :Private Declare Function DF_Connect & Lib "mtesrl.dll" _
Alias "MTEConnect" ( _
ByVal Params As String, _
ByVal ErrorMsg As String) As Long

Дальше. Я действительно не знаю разницу в объявлении переменных, используемых dll через API, при входных и выходных параметрах
Ну а на счет третьего замечания полностью согласна, так как исключить Null-символы действительно надо, только я думала, заменить их replace

Собственно вопрос то остался по вызову другой функции, коннект проходит успешно.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35572988
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
я указывал на несоответствие сишного прототипа DF_Connect VB-шному (в рамках того сообщения; может быть, Вы его уже поправили в реальном коде, но по обсуждению этого не видно).

Про DF_Structure(). Не стоит рассматривать поле Data как строковое, судя по описанию. Я бы в Declare параметр вообще написал As Any, и передавал первый байт байтового массива. Есть способ определить его размер заранее? Или ограничение на длину? Кстати, как описаны элементарные типы в "прил. 5"?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573018
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктKallandor,
я указывал на несоответствие сишного прототипа DF_Connect VB-шному (в рамках того сообщения; может быть, Вы его уже поправили в реальном коде, но по обсуждению этого не видно).

Про DF_Structure(). Не стоит рассматривать поле Data как строковое, судя по описанию. Я бы в Declare параметр вообще написал As Any, и передавал первый байт байтового массива. Есть способ определить его размер заранее? Или ограничение на длину? Кстати, как описаны элементарные типы в "прил. 5"?

C первым абзацем согласна - потому как не помню
По второму абзацу:
1. Если я объявляю поле Data as Variant, то тоже пустота.
2. Зараннее нет способа определить размер, ограничения на длину тоже нет
3.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Приложение  5 . Элементарные типы
Для представления элементарных типов в библиотеке MTESRL.DLL используются следующие структуры:
Byte
Один байт.

Integer
Четыре байта в формате процессоров x86 (сначала наименее значащий байт).

String
Структура следующего вида:

ДлинаСтроки: Integer
ТекстСтроки: Byte[ДлинаСтроки]

Byte[N]
Массив байт длиной N.
4. Собственно как именно следует определять поле Data? Даже если передавать первый байт, приведите пожалуйста пример. Так как я не понимаю :(
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573090
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor

Кстати о птичках!
А каков KallandorПример описания и вызова функции на C++: для этой функции?


--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573111
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--
С уважением Горбонос Игорь Леонидович
"Игорь Горбонос" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:6258207@sql.ru...
> Автор: Игорь Горбонос
>
Отсюда скачал описание.
там написанно:
Получение описания информационных объектов
Описание информационных объектов торговой системы содержит список таблиц, транзакций, их
полей и некоторых вспомогательных объектов, доступных клиенту. Для получения описания
используется функция MTEStructure.



function MTEStructure(Idx: Integer; var Msg: PMTEMsg): Integer;

Аргументы:

Idx

Дескриптор соединения, для которого нужно получить информацию.

Msg

Адрес переменной (имеющей тип "указатель на TMTEMsg"), куда будет помещен указатель на
буфер, содержащий описание информационных объектов. Формат буфера описан в приложении 1.
Структура TMTEMsg определена так:

PMTEMsg = ^TMTEMsg;

TMTEMsg = record

DataLen: Integer; // Длина следующих далее данных

Data: record end; // Данные переменной длины

end;

Насколько я знаю делфи, то рекорд это структура, давай описание этой структуры

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573114
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
Получение описания информационных объектов Описание информационных объектов 
содержит список таблиц, транзакций, их полей и некоторых вспомогательных объектов, доступных 
клиенту. Для получения описания используется функция MTEStructure.

(C language definition)
int32 WINAPI MTEStructure(int32 Idx, TMTEMsg **Msg);

(Delphi language definition)
function MTEStructure(Idx: Integer; var Msg: PMTEMsg): Integer;

Аргументы:
Idx
Дескриптор соединения, для которого нужно получить информацию.
Msg
Указатель на указатель структуры TMTEMsg, куда будет помещен указатель на буфер, содержащий описание информационных объектов. Формат буфера описан в приложении  2 .
Память под данный буфер выделяется и освобождается библиотекой. Структура TMTEMsg определена так:

-------- C language --------
typedef struct TMTEMSG_TAG
{
long DataLen; // Длина следующих далее данных
// char Data[DataLen];// commented – pseudo field
} TMTEMSG;
, причем данные длиной DataLen следуют непосредственно за данными данной структуры. Это 
сделанно для обеспечения совместимости с продуктами реализованными на Delphi. 

-------- Delphi language ---------
PMTEMsg = ^TMTEMsg;
TMTEMsg = record
  DataLen: Integer;  // Длина следующих далее данных
  Data: record end;  // Данные переменной длины
end;




Доступ к данным описания может выглядеть следующим образом:

-------- C language --------
int32 Idx;
char ErrorMsg[ 255 ];
TMTEMsg *Msg;
char *Data;
int32 err;
...
Idx = MTEConnect(“PORT=COM1\rBAUDRATE= 115200 ”, ErrorMsg);
if( Idx < MTE_OK )
{
fprintf(stderr, “Ошибка при установке соединения: %s”, ErrorMsg);
	exit( 1 );
}
else 
  fprintf(stdout, “Соединение установлено.”);

if( (err = MTEStructure(Idx, &Msg)) != MTE_OK )
{
if( Err == MTE_TSMR )
{ 
 		Data = (char *)(Msg +  1 );
	fprintf(stderr, “Ошибка: %s\n”, Data ); 
}
else
fprintf(stderr, “Ошибка: %s\n”, MTEErrorMsg(Err));
	}
else
  fprintf(“Описание информационных объектов получено.\n”);
Data = (char *)(Msg +  1 ); // Собственно данные

-------- Delphi language ---------
Idx: Integer;	// Инициализирована вызовом MTEConnect
Err: Integer;
Msg: PMTEMsg;
S: string;
...
Err := MTEStructure(Idx, Msg);
if Err <> MTE_OK then 
  if Err = MTE_TSMR then 
  begin
    SetString(S, @Msg.Data, Msg.DataLen);
    Writeln('Ошибка: ' + S);
  end
  else
    Writeln('Ошибка: ' + MTEErrorMsg(Err))
else
  Writeln('Описание информационных объектов получено.);

Возвращаемое значение:
В случае успеха функция возвращает MTE_OK и помещает в аргумент Msg указатель на буфер с 
описанием.
При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код 
ошибки MTE_TSMR, поле Data структуры Msg  содержит текст сообщения об ошибке длиной DataLen символов.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573122
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть большое подозрение, что ту dll писали не для юзайнья из VB
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573127
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно у меня еще один вопрос:
Если мне нужно создать пользовательский тип данных, одно из значений которого будет типа string, а другое может принимать только определенные значения могу ли я написать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type MyType2
   Const a1% =  0 
   Const a2% =  1 
   Const a3% =  2 
end Type

type MyType
   aaa as String
   bbb as MyType2
end type

...
Рейтинг: 0 / 0
null-терминированная строка
    #35573132
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
type MyType2
   Const a1% =  0 
   Const a2% =  1 
   Const a3% =  2 
end Type

???
что это, почему там Const
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573136
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может вам нужно это:

Код: plaintext
1.
2.
3.
4.
enum MyType2
a1= 0 
a2= 1 
a3= 2 
end enum
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573137
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Указатель на указатель структуры TMTEMsg, куда будет помещен указатель на буфер,
> содержащий описание информационных объектов. Формат буфера описан в приложении 2.

Давай описание буфера из приложения 2

> Память под данный буфер выделяется и освобождается библиотекой. Структура TMTEMsg
> определена так:
>
> -------- C language --------
> typedef struct TMTEMSG_TAG
> {
> long DataLen; // Длина следующих далее данных
> // char Data[DataLen];// commented – pseudo field
> } TMTEMSG;
> , причем данные длиной DataLen следуют непосредственно за данными данной структуры. Это
> сделанно для обеспечения совместимости с продуктами реализованными на Delphi.

Интересное решение.

А ты уверена, что им можно воспользоватся из VB?
Может проще сделать обертку на С или Делфи которую уже можно будет использовать из VB?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573139
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
посмотрел наискось документацию по MTESRL.DLL (не уверен, что та же версия). Морочите Вы нам головы, сударыня :)

документация по MTESRL.DLLПОЛУЧЕНИЕ ОПИСАНИЯ ИНФОРМАЦИОННЫХ ОБЪЕКТОВ
Описание информационных объектов торговой системы содержит список таблиц, транзакций, их полей и некоторых вспомогательных объектов, доступных клиенту. Для получения описания используется функция MTEStructure.

Код: plaintext
 function  MTEStructure(Idx: Integer;  var  Msg: PMTEMsg): Integer;
Аргументы:
Idx
Дескриптор соединения, для которого нужно получить информацию.
Msg
Адрес переменной (имеющей тип "указатель на TMTEMsg"), куда будет помещен указатель на буфер, содержащий описание информационных объектов. Формат буфера описан в приложении 1. Структура TMTEMsg определена так:
Код: plaintext
1.
2.
3.
4.
PMTEMsg = ^TMTEMsg;
TMTEMsg =  record 
  DataLen: Integer;   // Длина следующих далее данных 
  Data:  record   end ;   // Данные переменной длины 
 end ;
Возвращаемое значение:
В случае успеха функция возвращает MTE_OK и помещает в аргумент Msg указатель на буфер с описанием.
При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, поле Data структуры Msg содержит текст сообщения об ошибке длиной DataLen символов.
Пример:
Получение описания доступных информационных объектов для сеанса с номером Idx.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Idx: Integer;		 // Инициализирована вызовом MTEConnect 
Err: Integer;
Msg: PMTEMsg;
S:  string ;
...
Err := MTEStructure(Idx, Msg);
 if  Err <> MTE_OK  then  
   if  Err = MTE_TSMR  then  
   begin 
    SetString(S, @Msg.Data, Msg.DataLen);
    Writeln('Ошибка: ' + S);
   end 
   else 
    Writeln('Ошибка: ' + MTEErrorMsg(Err))
 else 
  Writeln('Описание информационных объектов получено.);
Т.е. параметр Msg должен в VB быть описан как [ByRef] lpMsg As Long. Не нужна по большому счёту структура TMTEMsg. Хорошо, допустим Вы очень хотите её иметь. Тогда при вызове MTEStructure() получите в lpMsg адрес, который надо передавать в CopyMemory(), чтобы получить объём буфера, и затем скопировать буфер (опять CopyMemory()) в эту самую структуру. Хотя, с моей точки зрения, это лишнее копирование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)

Type TMTEMsg
    DataLen As Long
    Data() As Byte
End Type

'...

 Dim lpMsg As Long
 Dim nErr As Long
 Dim Idx As Long
 Dim Msg As TMTEMsg
 nErr = MTEStructure(Idx, lpMsg)
 If nErr <> MTE_OK Then
    CopyMemory Msg.DataLen, ByVal lpMsg,  4 
    ReDim Msg.Data( 0  To Msg.DataLen -  1 ) As Byte
    CopyMemory Msg.Data( 0 ), ByVal lpMsg +  4 , Msg.DataLen
'...
 End If

P.S. Гы. Но не буду стирать набранное.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573166
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneможет вам нужно это:

Код: plaintext
1.
2.
3.
4.
enum MyType2
a1= 0 
a2= 1 
a3= 2 
end enum


Спасибо. Просто не знала как это делается
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573203
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Kallandor
> Указатель на указатель структуры TMTEMsg, куда будет помещен указатель на буфер,
> содержащий описание информационных объектов. Формат буфера описан в приложении 2.

Давай описание буфера из приложения 2


С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

В переводе на VB это описание выгледит примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
Enum TEnumKind
    ekCheck =  0 
    ekGroup =  1 
    ekCombo =  2 
End Enum

Type TEnumType
    Name As String
    Descr As String
    Size As Integer
    Type As TEnumKind
    Count_Const As Integer
    Const_Arr(Count_Const) As String
End Type

Type TEmunTypes
    Count_Types As Integer
    Arr_Type(Count_Types) As TEnumType
End Type
'============================================================================

'====================================TTables=================================
Enum TTableFlags
    tfUpdateable =  1 
    tfClearOnUpdate =  2 
End Enum

Enum TFieldFlags
    ffKey =  1 
    ffSecCode =  2 
End Enum

Enum TFieldType
    ftChar =  0 
    ftInteger =  1 
    ftFixed =  2 
    ftFloat =  3 
    ftDate =  4 
    ftTime =  5 
End Enum

Type TField
    Name As String
    Descr As String
    Size As Integer
    Type As TFieldType
    Attributes As TFieldFlags
    EnumerType As String
    Def_Val As String
End Type

Type TFields
    Count_Field As Integer
    Arr_Fields(Count_Field) As TField
End Type

Type TTable
    Name As String
    Descr As String
    Attributes As TTabbleFlags
    In_Fiels As TFields
    Out_Field As TFields
End Type

Type TTables
    Count_Table As Integer
    Arr_Table As TTable
End Type
'============================================================================
'===============================TTransactions================================
Type TTransaction
    Name As String
    Descr As String
    In_Fields As TFields
End Type

Type TTransactions
    Count_Tran As Integer
    Arr_Tran(Count_Tran) As TTransaction
End Type
'============================================================================
Type ArrInterface
    InterfaceName As String
    InterfaceDescr As String
    InterfaceTypes As TEnumTypes
    Interfacetables As TTables
    InterfaceTrans As TTransactions
End Type

Type TMTEMsg
    DataLen As Long
    Data As ArrInterface
End Type

Вот, собственно это перевела я, поэтому имеются огромные сомнения по поводу строк
Код: plaintext
Arr_Tran(Count_Tran) As TTransaction
и тому подобное, так как я не знаю как задать массив с длинной строк, которые определены в первом поле объявленного типа. Наверняка это не правильно. не подскажешь как это делается?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573235
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
это не в ту степь. Вы надеетесь, что, если Вы "правильно" опишите структуры, VB "сам" правильно сделает десериализацию. Не сделает. Придётся делать самой.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573245
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Структура TMTEMsg определена так:

-------- C language --------
typedef struct TMTEMSG_TAG
{
long DataLen; // Длина следующих далее данных
// char Data[DataLen];// commented – pseudo field
} TMTEMSG;
, причем данные длиной DataLen следуют непосредственно за данными данной структуры. Это 
сделанно для обеспечения совместимости с продуктами реализованными на Delphi. 

-------- Delphi language ---------
PMTEMsg = ^TMTEMsg;
TMTEMsg = record
  DataLen: Integer;  // Длина следующих далее данных
  Data: record end;  // Данные переменной длины
end;
О Господи! Какой идиот это писал?!

Kallandor, ты можешь dll править? Если нет, то лучше возьми какую-нибудь другую библиотеку.
Проблема в том, что в исходном тексте поле Data не является членом структуры вообще. Оно всего-лишь предполагает что поле Data будет лежать в динамической памяти рядом с DataLen, но не требует этого от компилятора. В зависимости от ключей оптимизации данный код может работать а может и не работать - как ветер на Марсе подует.
Из VB (у которого совершенно другой принцип работы с динамическими переменными на стеке) эту процедуру успешно вызвать - нереально совершенно.
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573250
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктKallandor,
это не в ту степь. Вы надеетесь, что, если Вы "правильно" опишите структуры, VB "сам" правильно сделает десериализацию. Не сделает. Придётся делать самой.

Ну понятно, что мы с VB перекладываем друг на друга работу

Собственно у меня к вам вопрос:
Согласно вашему варианту я написала:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Declare Function DF_Structure& Lib "mtesrl.dll" _
    Alias "MTEStructure" ( _
    ByVal Idx As Long, _
    ByRef lpMsg As Long)
'.....
Type TMTEMsg
    DataLen As Long
    Data() As Byte
End Type
'...

Dim Msg As TMTEMsg
Dim nErr as Long, lpMsg as long
nErr = DF_Structure(MainIdx, lpMsg)
If nErr < MTE_OK Then
    PutErrorTextByIdx Idx
Else
    CopyMemory Msg.DataLen, ByVal lpMsg,  4 
    ReDim Msg.Data( 0  To Msg.DataLen -  1 ) As Byte
    CopyMemory Msg.Data( 0 ), ByVal lpMsg +  4 , Msg.DataLen
End If

И собственно вылетает VB просто закрывается и все (((
Что неправильно?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573266
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
на всякий случай дайте ещё описание CopyMemory.

В какой строке вылетает при пошаговом проходе?

MainIdx имеет правильное значение? Чему равен nErr? Чему равно lpMsg (должно быть больше нуля)?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573268
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, каковы значения локальных переменных перед шагом, приводящем к вылету?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35573353
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктВ общем, каковы значения локальных переменных перед шагом, приводящем к вылету?

Это я ошиблась. Написала declare не Sub, а Function и поэтому вылетало. Когда переименовала и переконвертировала из byte в chr, то выдался впринципе понятный текст
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
nErr = DF_Structure(MainIdx, lpMsg)
If nErr < MTE_OK Then
    PutErrorTextByIdx Idx
Else
    CopyMemory Msg.DataLen, ByVal lpMsg,  4 
    ReDim Msg.Data( 0  To Msg.DataLen -  1 ) As Byte
    CopyMemory Msg.Data( 0 ), ByVal lpMsg +  4 , Msg.DataLen
End If
Dim sstr$
For i% =  0  To UBound(Msg.Data)
    If Msg.Data(i) =  0  Then
        Msg.Data(i) =  42 
    End If
    sstr = sstr$ & Chr(Msg.Data(i%))
Next i%
Open "C:\TmpMMVB.txt" For Append As # 1 
Print # 1 , sstr
Close # 1 
ну и его я сохранила в файл
...
Рейтинг: 0 / 0
null-терминированная строка
    #35574335
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
лучше сделайте нормальные примитивы десериализации, типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Declare Function lstrcpynSB Lib "kernel32" Alias "lstrcpynA" ( _
   ByVal lpString1 As String, lpString2 As Byte, _
   ByVal iMaxLength As Long) As Long

'...

Private Function ReadInteger(Msg As TMTEMsg, Offset As Long) As Long
 CopyMemory ReadInteger, Msg.Data(Offset),  4 
 Offset = Offset +  4  'перемещение текущего указателя
End Function

Private Function ReadString(Msg As TMTEMsg, Offset As Long) As String
 Dim nLen As Long
 nLen = ReadInteger(Msg, Offset) 'длина строки
 ReadString = String$(nLen, vbNullChar) 'подготовка буфера для тела строки
 lstrcpynSB ReadString, Msg.Data(Offset), nLen +  1  'тело строки
 Offset = Offset + nLen 'перемещение текущего указателя
End Function
(а ещё лучше, сделайте их методами класса, чтобы параметры не гонять туда-сюда)
...
Рейтинг: 0 / 0
null-терминированная строка
    #35574473
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт
Ех, осознаю написанное я долго :(

А вот скажи пожалуйста, не знаешь ли ты почему выполнения кода, написанного тобою на пост выше (с CopyMemory) все же валится с ошибкой?

Вот, я выполняю следующий кусок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
nErr = DF_Refresh(Idx, lpMsg)
If nErr < MTE_OK Then
    result =  1 
    PutErrorTextByIdx nErr
    Exit Sub
Else
    CopyMemory Msg.DataLen, ByVal lpMsg,  4 
    ReDim Msg.Data( 0  To Msg.DataLen -  1 ) As Byte
    CopyMemory Msg.Data( 0 ), ByVal lpMsg +  4 , Msg.DataLen

    sstr = ""
    'первые 4 байта - Ref
    For i =  0  To  3 
        output_ref = output_ref + CInt(Msg.Data(i))
    Next i
    sstr = sstr + "Ref=" + CStr(output_ref)
    'вторые 4 байта - Количество строк
    For i =  4  To  7 
        output_rows = output_rows + CInt(Msg.Data(i))
    Next i
    sstr = sstr + "NumRows=" + CStr(output_rows)
    
    For i =  8  To UBound(Msg.Data)
        'первый байт - кол-во полей
        output_numfields = CInt(Msg.Data(i))
        'дальше 4 байта - длина данных
        output_datalen =  0 
        For j = i +  1  To i +  4 
            output_datalen = output_datalen + CInt(Msg.Data(j%))
        Next j
        'массив номеров полей равный количеству полей
        output_number_fields = ""
        If output_numfields <>  0  Then
            For k = j +  1  To j + output_numfields -  1 
                output_number_fields = output_number_fields + CStr(Msg.Data(k)) + ","
            Next k
        Else: k = j
        End If
        'массив данных по одной строке, равный длинне строки
        tstr = ""
        For l = k +  1  To k + output_datalen -  1 
            tstr = tstr + Chr(Msg.Data(l))
        Next l
        sstr = sstr + "@@@" + "NumFields=" + CStr(output_numfields) + ", DataLen=" + CStr(output_datalen)
        sstr = sstr + "*@@" + output_number_fields + "*@@" + tstr
        i = l -  1 
    Next i%
    Open SaveFile For Append As # 1 
    Print # 1 , sstr
    Close # 1 
End If


Валится на
Код: plaintext
CopyMemory Msg.Data( 0 ), ByVal lpMsg +  4 , Msg.DataLen
Значение Msg.DataLen = 80035848
Я не понимаю из-за чего?

Вот, и еще у меня там байтовый массив, который в зависимости от выполняемой команды возвращает ту или иную структуру данных, поэтому я сомневаюсь на счет прямой работы со строками. Вот. Собственно выслушаю советы :)
...
Рейтинг: 0 / 0
null-терминированная строка
    #35574573
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor

Ты вот скажи, вызываешь как lpMsg
> nErr = DF_Refresh(Idx, lpMsg )
а работаешь с Msg
> CopyMemory Msg .DataLen, ByVal lpMsg, 4
???
;)
> Вот. Собственно выслушаю советы :)


--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35574604
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Kallandor

Ты вот скажи, вызываешь как lpMsg
> nErr = DF_Refresh(Idx, lpMsg )
а работаешь с Msg
> CopyMemory Msg .DataLen, ByVal lpMsg, 4
???
;)
> Вот. Собственно выслушаю советы :)


--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

Игорь, в данном случае lpMsg - указатель на структуру данных (байтовый массив). Структура определена типом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Type TMTEMsg
    DataLen As Long
    Data() As Byte
 End Type

'...
Dim Msg as TMTEMsg

Собственно экспериментально установлено, что конструкция
Код: plaintext
1.
2.
3.
CopyMemory Msg.DataLen, ByVal lpMsg,  2 
    ReDim Msg.Data( 0  To Msg.DataLen -  1 ) As Byte
    CopyMemory Msg.Data( 0 ), ByVal lpMsg +  2 , Msg.DataLen
работает. И мне не понятно за что отвечает цифра 4 (она была третьим передаваемым параметром в первом варианте) и почему когда ее заменить на 2, то все проходит. А на 3 не проходит. Вот, странно
...
Рейтинг: 0 / 0
null-терминированная строка
    #35574641
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь, в данном случае lpMsg - указатель на структуру данных (байтовый массив).
> Структура определена типом
>
> Type TMTEMsg
> DataLen As Long
> Data() As Byte
> End Type
>
> '...
> Dim Msg as TMTEMsg

Понятно :)
>
> Собственно экспериментально установлено, что конструкция
>
> CopyMemory Msg.DataLen, ByVal lpMsg, 2
> ReDim Msg.Data(0 To Msg.DataLen - 1) As Byte
> CopyMemory Msg.Data(0), ByVal lpMsg + 2, Msg.DataLen
> работает. И мне не понятно за что отвечает цифра 4 (она была третьим передаваемым
> параметром в первом варианте) и почему когда ее заменить на 2, то все проходит. А на 3
> не проходит. Вот, странно


Ты как первый раз замужем!!! 4 байта - размер DataLen, размер типа Long, почему работает
при 2 мне тоже не совсем понятно, потому что я ожидал работу при 4.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575004
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Ты как первый раз замужем!!! 4 байта - размер DataLen, размер типа Long, почему работает
при 2 мне тоже не совсем понятно, потому что я ожидал работу при 4.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

Ех, замужем я ни разу еще не была а вот в процессе эксплуатации выяснилось что с 2 работает через раз - стандартно. А с 4 вообще ни разу. Буду экспериментировать дальше с циферками.

Игорь, а ты не мог бы кинуть ссылки где было бы написано про xml,xsl как для чайников, то есть интересно как создавать подобные файлы, как загружать их в VB и считывать из них данные? Т.о. я прошу тебя научить меня пользоваться поиском, только не за дорого, а за что-нибудь попроще ?
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575112
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь Горбонос
>
> Ты как первый раз замужем!!! 4 байта - размер DataLen, размер типа Long,
> почему работает
> при 2 мне тоже не совсем понятно, потому что я ожидал работу при 4.
>
> --
> С уважением Горбонос Игорь Леонидович
>
> Posted via ActualForum NNTP Server 1.4
>
>
> Ех, замужем я ни разу еще не была

Это возрастное :)

> а вот в процессе эксплуатации выяснилось что с 2 работает через раз - стандартно. А
> с 4 вообще ни разу. Буду экспериментировать дальше с циферками.

Да нечего там експерементировать. Нужен отладчик и смотреть, что, куда и когда возвращает

>
> Игорь, а ты не мог бы кинуть ссылки где было бы написано про xml,xsl как для
> чайников, то есть интересно как создавать подобные файлы, как загружать их в VB и
> считывать из них данные? Т.о. я прошу тебя научить меня пользоваться поиском, только не
> за дорого, а за что-нибудь попроще ?

Ну, для начала http://xml.nsu.ru/


--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575375
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь, а ты не мог бы кинуть ссылки где было бы написано про xml,xsl как для
> чайников, то есть интересно как создавать подобные файлы, как загружать их в VB и
> считывать из них данные? Т.о. я прошу тебя научить меня пользоваться поиском, только не
> за дорого, а за что-нибудь попроще ?


напиши мне

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575442
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KallandorА вот скажи пожалуйста, не знаешь ли ты почему выполнения кода, написанного тобою на пост выше (с CopyMemory) все же валится с ошибкой?

Значение Msg.DataLen = 80035848CopyMemory() - небезопасная функция. Всегда надо проверять адреса источника, приёмника, и длину копируемого блока. Здесь длина явно неправильная. Либо ты что-то не показываешь и неправильно делаешь, или Integer у них 16-битный. Выравнивание в структуре, опять, неизвестно. В общем, это вопрос отладки. Надо брать дамп данных, и смотреть, что там реально лежит.
Kallandor
Код: plaintext
1.
2.
3.
    'первые 4 байта - Ref
    For i =  0  To  3 
        output_ref = output_ref + CInt(Msg.Data(i))
    Next i
Это что? Формирование Integer из четырёх байт? По-твоему, 1 рубль + 10 рублей + 100 рублей + 1000 рублей равно 4 рубля? Да... пора замуж, считать семейный бюджет

KallandorВот, и еще у меня там байтовый массив, который в зависимости от выполняемой команды возвращает ту или иную структуру данных, поэтому я сомневаюсь на счет прямой работы со строками.Какая разница? Если документация соответствует действительности, то предложенные мной примитивы десериализации вполне рабочие. Кстати, байтовый массив в строку можно превратить довольно легко:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Dim bArr( 0  To  5 ) As Byte
 bArr( 0 ) = Asc("П")
 bArr( 1 ) = Asc("р")
 bArr( 2 ) = Asc("и")
 bArr( 3 ) = Asc("м")
 bArr( 4 ) = Asc("е")
 bArr( 5 ) = Asc("р")

 Dim sStr As String
 sStr = StrConv(bArr, vbUnicode)
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575731
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт KallandorА вот скажи пожалуйста, не знаешь ли ты почему выполнения кода, написанного тобою на пост выше (с CopyMemory) все же валится с ошибкой?

Значение Msg.DataLen = 80035848CopyMemory() - небезопасная функция. Всегда надо проверять адреса источника, приёмника, и длину копируемого блока. Здесь длина явно неправильная. Либо ты что-то не показываешь и неправильно делаешь, или Integer у них 16-битный. Выравнивание в структуре, опять, неизвестно. В общем, это вопрос отладки. Надо брать дамп данных, и смотреть, что там реально лежит.

Вот, ты правильно сформулировал мое предчувствие. Мне дейтвительно кажется что у них один раз 16-разрядное смещение, а другой раз 32-разрядное. Собственно как отловить и узнать это смещение для меня остается вопросом.

Бенедикт
Kallandor
Код: plaintext
1.
2.
3.
    'первые 4 байта - Ref
    For i =  0  To  3 
        output_ref = output_ref + CInt(Msg.Data(i))
    Next i
Это что? Формирование Integer из четырёх байт?
Согласна с твоим замечанием, но когда по факту имеешь массив байтовый массив
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Type TMTEMsg
    Data as Byte
    DataLen as Long
End Type

'...

Dim Msg as TMTEMsg

'...

Msg.Data( 0 )= 1 
Msg.Data( 1 )= 0 
Msg.Data( 2 )= 0 
Msg.Data( 3 )= 0 

То по-тупому его можно конечно преобразовывать так как я написала, а по-умному будет наверное так
Код: plaintext
1.
2.
3.
    'первые 4 байта - Ref
    For i =  0  To  3 
        output_ref = output_ref + CInt(Msg.Data(i))* 255 ^i
    Next i
Бенедикт KallandorВот, и еще у меня там байтовый массив, который в зависимости от выполняемой команды возвращает ту или иную структуру данных, поэтому я сомневаюсь на счет прямой работы со строками.Какая разница? Если документация соответствует действительности, то предложенные мной примитивы десериализации вполне рабочие. Кстати, байтовый массив в строку можно превратить довольно легко:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Dim bArr( 0  To  5 ) As Byte
 bArr( 0 ) = Asc("П")
 bArr( 1 ) = Asc("р")
 bArr( 2 ) = Asc("и")
 bArr( 3 ) = Asc("м")
 bArr( 4 ) = Asc("е")
 bArr( 5 ) = Asc("р")

 Dim sStr As String
 sStr = StrConv(bArr, vbUnicode)


Если речь идет о числах, а некоторые byte'ы следует трактовать как числа, то при пререводе в chr символов от 0 до 32 или 33 (не помню точно) это будут нечитаемые квадратики, а не реальные числа. Собственно если этот момент можно как-нибудь обойти, то я с удовольствем откажусь от CopyMemory
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575735
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбоноснапиши мне
Ок, почитаю сайт, который ты порекомендовал и буду донимать вопросами :)
...
Рейтинг: 0 / 0
null-терминированная строка
    #35575746
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь Горбонос
> напиши мне
>
> Ок, почитаю сайт, который ты порекомендовал и буду донимать вопросами :)


Я имел в виду е-мейл дай, мой в моем профиле

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / null-терминированная строка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]