powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Адресс буффера
25 сообщений из 51, страница 2 из 3
Адресс буффера
    #35601564
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оно вам не надо, см ответ выше. или читайте статью дальше, как преобразовывать обратно в BSTR
...
Рейтинг: 0 / 0
Адресс буффера
    #35601586
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: plaintext
1.
cnt=BSTRtoLPSTR("передаем эту строку в С++ dll", bArr, lpsz)
nErr = DF_SetSnapshot(Idx, lpsz, cnt, ErrorMsg)


ех, все равно DF_SetSnapshot возвращает ошибку
...
Рейтинг: 0 / 0
Адресс буффера
    #35601590
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где C-шное описание DF_SetSnapshot?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601598
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
Dim s as String
s="test string"
cnt=BSTRtoLPSTR(s, bArr, lpsz)
nErr = DF_SetSnapshot(Idx, bArr( 0 ), Len(s), ErrorMsg)
?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601603
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor


Может это поможет понять что и
как происходит со строками. Заодно и оптимизацию проведёшь ;)))

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Адресс буффера
    #35601606
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описание(C language definition)
int32 WINAPI MTESetSnapshot( int32 Idx, char * Snapshot, int Len, char *ResultMsg);

Аргументы:
Idx
Дескриптор соединения, полученный с помощью вызова MTEConnect.
Snapshot
Указатель на буфер в котором помещенны данные полученные с помощью вызова MTEGetSnapshot.
Len
Длина данных в передаваемом буфере.
ResultMsg
Указатель на буфер размером не менее 256 байт, куда в случае успешного выполнения будет помещена строка текста с результатом обработки транзакции торговой системой.

Возвращаемое значение:
Один из кодов ошибки MTE_xxxx.


Я думаю это из-за адресной арифметики. Ну то есть когда я на тестовом примере делаю, то мне вовращается практически правильное значение при смещении 2 (ну как для 16-разрядного указателя). А у них скорее всего нужно смещение 4 (32-разрядный указатель)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601612
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function DF_SetSnapshot& Lib "mtesrl.dll" _
    Alias "MTESetSnapshot" ( _
    ByVal Idx As Long, _
    ByRef Snapshot As Long, _
    ByRef Leng As Long, _
    ByVal ResultMsg As String)


а почему такое объявление? это вам разработчики dll так подсказали?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601638
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, как вы все сложно замутили...
Код: plaintext
cnt=StrPtr(StrConv("передаем эту строку в С++ dll" & vbNullChar, vbFromUnicode))
...
Рейтинг: 0 / 0
Адресс буффера
    #35601646
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Declare Function DF_SetSnapshot Lib "mtesrl.dll" _
    Alias "MTESetSnapshot" ( _
    ByVal Idx As Long, _
    ByVal Snapshot As String, _
    ByVal pLen As Long, _
    ByRef ResultMsg As String) as Long


Dim ErrorMsg as String
ErrorMsg = String$( 255 , vbNullChar)
ret=DF_SetSnapshot(Idx,"test",Len("test"),ErrorMsg)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601656
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyОй, как вы все сложно замутили...
Код: plaintext
cnt=StrPtr(StrConv("передаем эту строку в С++ dll" & vbNullChar, vbFromUnicode))
Бес попутал. Показалось, что нужно передать указатель на юникодную строку.
...
Рейтинг: 0 / 0
Адресс буффера
    #35601667
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Declare Function DF_SetSnapshot Lib "mtesrl.dll" _
    Alias "MTESetSnapshot" ( _
    ByVal Idx As Long, _
    ByVal Snapshot As String, _
    ByVal pLen As Long, _
    ByRef ResultMsg As String) as Long


Dim ErrorMsg as String
ErrorMsg = String$( 255 , vbNullChar)
ret=DF_SetSnapshot(Idx,"test",Len("test"),ErrorMsg)


Даже если так. У них в dll есть проверки по ключевым символам. И видать передаваемая строка не проходит эти проверки. И ret ="-17" что в расшифровке означает "Неправильные параметры"

Все же я думаю это именно из-за смещения, так как даже в функции BSTRtoLPSTR - CopyMemory b(1), ByVal lpsz, cBytes + 2 а мне надо 4
...
Рейтинг: 0 / 0
Адресс буффера
    #35601678
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor
а мне надо 4

это откуда известно?


Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function DF_SetSnapshot Lib "mtesrl.dll" _
    Alias "MTESetSnapshot" ( _
    ByVal Idx As Long, _
    ByVal Snapshot As Long, _
    ByVal pLen As Long, _
    ByRef ResultMsg As String) as Long

и дальше пробуйте
...
Рейтинг: 0 / 0
Адресс буффера
    #35601691
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

Это предположение, потому как когда я копирую данные пришедшие с их адресом в памяти, т.е. 32-разрядным указателем на строку (байтовый массив) то я указываю смещение 4. Остальные не действуют - проверяла. Также я думаю и им надо, чтобы указатель был 32 - разрядным, а не 16.

Опять же это предположение. А как проверить посылая 4 я как-то не соображу. То есть про 2 вижу, а про 4 не соображаю
...
Рейтинг: 0 / 0
Адресс буффера
    #35601710
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim bArr() as Byte
Dim s as String
Dim ErrorMsg as String
Dim ret as Long

ErrorMsg = String$( 255 , vbNullChar)
s="test"

'пособирайте свой bArr разными способами и выполните
'1
bArr=s
ret = DF_SetSnapshot(Idx, bArr( 0 ), Len(s), ErrorMsg)
Debug.Print ret
...
...
Рейтинг: 0 / 0
Адресс буффера
    #35601764
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
'Класс CDump
Option Explicit

Private Declare Function lstrcpynSB Lib "kernel32" Alias "lstrcpynA" ( _
   ByVal lpString1 As String, lpString2 As Byte, _
   ByVal iMaxLength As Long) As Long
Private Declare Function lstrlenB Lib "kernel32" Alias "lstrlenA" ( _
   lpString As Byte) As Long

Private Type TInteger
   Data0 As Long
End Type

Private Type TShort
   Data0 As Integer
End Type

Private Type T4Bytes
   Data0 As Byte
   Data1 As Byte
   Data2 As Byte
   Data3 As Byte
End Type

Private Type T2Bytes
   Data0 As Byte
   Data1 As Byte
End Type

Private m_bDump() As Byte
Private m_nDumpSize As Long
Private m_nDumpLen As Long
Private m_nDumpPos As Long

Public Property Get Pos() As Long
 Pos = m_nDumpPos
End Property

Public Function ReadByte() As Byte
 ReadByte = m_bDump(m_nDumpPos)
 m_nDumpPos = m_nDumpPos +  1 
End Function

Public Function ReadShort() As Integer
 Dim t1 As T2Bytes, t2 As TShort
 t1.Data0 = m_bDump(m_nDumpPos +  0 )
 t1.Data1 = m_bDump(m_nDumpPos +  1 )
 LSet t2 = t1
 ReadShort = t2.Data0
 m_nDumpPos = m_nDumpPos +  2 
End Function

Public Function ReadInteger() As Long
 Dim t1 As T4Bytes, t2 As TInteger
 t1.Data0 = m_bDump(m_nDumpPos +  0 )
 t1.Data1 = m_bDump(m_nDumpPos +  1 )
 t1.Data2 = m_bDump(m_nDumpPos +  2 )
 t1.Data3 = m_bDump(m_nDumpPos +  3 )
 LSet t2 = t1
 ReadInteger = t2.Data0
 m_nDumpPos = m_nDumpPos +  4 
End Function

Public Function ReadCharArray() As String
 Dim nLen As Long
 nLen = ReadInteger 'длина массива
 ReadCharArray = String$(nLen, vbNullChar) 'подготовка буфера для тела строки
 lstrcpynSB ReadCharArray, m_bDump(m_nDumpPos), nLen +  1  'тело строки
 m_nDumpPos = m_nDumpPos + nLen  'перемещение текущего указателя
End Function

Public Function ReadString() As String
 Dim nLen As Long
 nLen = lstrlenB(m_bDump(m_nDumpPos))
 ReadString = String$(nLen, vbNullChar) 'подготовка буфера для тела строки
 lstrcpynSB ReadString, m_bDump(m_nDumpPos), nLen +  1  'тело строки
 m_nDumpPos = m_nDumpPos + nLen +  1  'перемещение текущего указателя
End Function

Private Sub AppendDump(ByVal bByte As Byte)
 If m_nDumpSize <= m_nDumpLen Then
    m_nDumpSize = m_nDumpSize +  256 
    ReDim Preserve m_bDump( 0  To m_nDumpSize -  1 ) As Byte
 End If
 m_bDump(m_nDumpLen) = bByte
 m_nDumpLen = m_nDumpLen +  1 
End Sub

Public Sub ReadDump()
 Dim sLine As String
 Dim nLineLen As Long
 Dim nSepPos As Long, nNextSepPos As Long
 Dim nFile As Integer
 
 nFile = FreeFile
 Open "C:\Temp\dump1.txt" For Input As #nFile
 Do
    Line Input #nFile, sLine
    'Debug.Print sLine
    nLineLen = Len(sLine)
    nSepPos =  0 
    Do
       nNextSepPos = InStr(nSepPos +  1 , sLine, "|")
       If nNextSepPos =  1  Then
          nSepPos = nNextSepPos
       ElseIf nNextSepPos >  0  Then
          AppendDump CByte(Mid$(sLine, nSepPos +  1 , nNextSepPos - nSepPos -  1 ))
          nSepPos = nNextSepPos
       Else
          If nSepPos < nLineLen Then AppendDump CByte(Mid$(sLine, nSepPos +  1 ))
          Exit Do
       End If
    Loop
 Loop Until EOF(nFile)
 Close #nFile
 
 ReDim Preserve m_bDump( 0  To m_nDumpLen -  1 ) As Byte
End Sub

Public Property Get Body() As Byte()
 Body = m_bDump
End Property
Код: 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.
'Модуль формы с кнопкой
Option Explicit

Private Sub PrintRepeatingDumpBlock(ByVal Dump As CDump)
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadByte
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadString
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadCharArray
End Sub

Private Sub Command1_Click()
 Dim Dump As CDump
 Set Dump = New CDump

 Dump.ReadDump
 Debug.Print StrConv(Dump.Body, vbUnicode)
 
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadCharArray
 
 PrintRepeatingDumpBlock Dump
 PrintRepeatingDumpBlock Dump
 PrintRepeatingDumpBlock Dump
 PrintRepeatingDumpBlock Dump
 PrintRepeatingDumpBlock Dump

 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadInteger
 Debug.Print Dump.ReadString
 Debug.Print Dump.ReadString
 Debug.Print Dump.ReadInteger
 Debug.Print Chr(Dump.ReadByte);
 Debug.Print Chr(Dump.ReadByte);
 Debug.Print Chr(Dump.ReadByte);
 Debug.Print Chr(Dump.ReadByte)
End Sub
...
Рейтинг: 0 / 0
Адресс буффера
    #35601773
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

Я согласна что это вменяемый дамп. И даже если перевести его в chr то я знаю что какие байты означают. Основная проблема не в том что дамп не тот. А в том что он не передается. Опять же мне кажется из-за смещения. Как только я пойму как это сделать - значит я-герой , не пойму - лузер. Все просто
...
Рейтинг: 0 / 0
Адресс буффера
    #35601787
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
почему у Вас опасение, что указатель 16-битный? StrPtr(), VarPtr(), ObjPtr() возвращают нормальные 32-битные указатели (хранящиеся в Long) для плоской (flat) модели памяти. Добавляйте нужное смещение (опять - почему опасение?), и передавайте ByVal.
...
Рейтинг: 0 / 0
Адресс буффера
    #35601793
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Бенедикт,
>
> Как только я пойму как это сделать - значит я-герой , не пойму - лузер. Все просто


А вот тут не согласен, геро иней ты станешь тогда, когда хлопнешь себя по лбу и
скажешь "Какая, я была (тут подставить что лучше подойдет), ведь можно было сделать все
намного проще и быстрее". А пока, наверное ты права, примем и тебя в ряды героев.

не проше сделать "прокладку" в виде dll, на том-же С++ или Дельфи???

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Адресс буффера
    #35601812
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вах! Что-то мне подсказывает источник смущения:Описание(C language definition)
int32 WINAPI MTESetSnapshot( int32 Idx, char * Snapshot, int Len, char *ResultMsg);В C нет типа "байт", а есть тип "символ". char * Snapshot может означать не только "указатель на ASCIIZ-строку", но и "указатель на массив байтов". Зависит от контекста применения. По дампу отчётливо видно, что он не строка. Это массив байтов. Поэтому в VB можно функцию описать как
Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function DF_SetSnapshot Lib "mtesrl.dll" _
    Alias "MTESetSnapshot" ( _
    ByVal Idx As Long, _
    ByRef Snapshot As Byte, _
    ByVal Length As Long, _
    ByVal ResultMsg As String) As Long
Вызов:
Код: plaintext
1.
2.
3.
Dim ErrorMsg as String
ErrorMsg = String$( 256 , vbNullChar)
ret = DF_SetSnapshot(Idx, ByteBuffer(смещение), _
                     UBound(ByteBuffer) - LBound(ByteBuffer) +  1 , ErrorMsg)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601816
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

Обидно то что я сейчас уже вижу места, которые можно сделать проще :( а я наваяла 2500 строк кода, причем компактного и очень осмысленного. Наверное это усталось, но я уже 3 недели сижу над этим проектом, а конца не видно только сделаешь одно - появляется другое. (ет я жалуюсь - просьба не воспринимать серьезно )
И я еще не герой
...
Рейтинг: 0 / 0
Адресс буффера
    #35601820
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт
ret = DF_SetSnapshot(Idx, ByteBuffer( смещение ), _
UBound(ByteBuffer) - LBound(ByteBuffer) + 1, ErrorMsg)[/src]

Не поняла?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601832
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
поправлю код:
Код: plaintext
1.
ret = DF_SetSnapshot(Idx, ByteBuffer(LBound(ByteBuffer) + смещение), _
                     UBound(ByteBuffer) - LBound(ByteBuffer) +  1  - смещение, ErrorMsg)
"смещение" означает, при раз существует предположение, что передавать надо имеющийся байтовый буфер не с начала, здесь нужно записать смещение от начала буфера: 0, 2, 4, какое угодно. Если б я не видел дамп, я бы сказал, что смещение равно нулю. Но Вы постоянно говорите о каком-то смещении, да и я, смотря на первые 8 байт дампа, не могу понять, что это такое - мусор, контрольные суммы, полезная информация?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601833
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"при раз" читать как "раз"
...
Рейтинг: 0 / 0
Адресс буффера
    #35601837
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Игорь Горбонос,
>
> Обидно то что я сейчас уже вижу места, которые можно сделать проще :( а я наваяла
> 2500 строк кода, причем компактного и очень осмысленного.

См. ниже

> Наверное это усталось, но я уже 3 недели сижу над этим проектом, а конца не видно
> только сделаешь одно - появляется другое. (ет я жалуюсь - просьба не воспринимать
> серьезно )

А вот это и есть "легкая работа программиста" и при том "непонятно за что, получают
слишком много".
У меня товарищ спрашивает периодически в аське, чем я сейчас занимаюсь, а я поддерживаю и
развиваю внутрикорпоративную систему, и я занимаюсь только ей. Сегодня нужно расширить
возможности в одном месте, завтра в другом, послезавтра сделать новый функционал, и так
из-зо дня в день :)

> И я еще не герой

А ты уверенна? см. чуть выше фразы "См. ниже" ;))

Далеко не все решается блиц-кригом, а если и решается, то ОЧЕНЬ хорошо спланированным. А
тебе для него не хватает немного знаний и времени, что-бы разложилось все по полочкам. Но
за одного битого, двух не битых дают (с) пословица

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Адресс буффера
    #35601873
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктKallandor,
поправлю код:
Код: plaintext
1.
ret = DF_SetSnapshot(Idx, ByteBuffer(LBound(ByteBuffer) + смещение), _
                     UBound(ByteBuffer) - LBound(ByteBuffer) +  1  - смещение, ErrorMsg)
"смещение" означает, при раз существует предположение, что передавать надо имеющийся байтовый буфер не с начала, здесь нужно записать смещение от начала буфера: 0, 2, 4, какое угодно. Если б я не видел дамп, я бы сказал, что смещение равно нулю. Но Вы постоянно говорите о каком-то смещении, да и я, смотря на первые 8 байт дампа, не могу понять, что это такое - мусор, контрольные суммы, полезная информация?

Не работает - собака. Да еще и я устала с ним бороться. Так что пойду домой. Спасибо за советы. :)
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Адресс буффера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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