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

Подскажите пожалуйста как мне определить адрес буффера? Поясняю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim ByteArr() As Byte
Dim tempstr$, i&, byte_address As Long

tempstr = "Просто строка для иллюстрации"
ReDim ByteArr(Len(tempstr) -  1 )
For i =  0  To UBound(ByteArr)
    ByteArr(i) = Asc(Mid(tempstr, i +  1 ,  1 ))
Next i

Собственно по коду понятно что массив ByteArr где-то расположен в памяти. Вопрос а как узнать адрес по которому в памяти расположен массив? М.Б. какую-нибудь API кто-нибудь помнит?
...
Рейтинг: 0 / 0
Адресс буффера
    #35599179
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый вопрос: для чего это потребовалось?
Второй вопрос: зачем вы смешиваете в одной строке устаревший и сегодняшний способы декларирования ваших переменных?

Для справки: посмотрите CopyMemory и VarPtr

Здесь пример:

http://www.tek-tips.com/viewthread.cfm?qid=1425974

Успехов
...
Рейтинг: 0 / 0
Адресс буффера
    #35599187
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Kallandor
> Доброго времени суток, уважаемые.
>
> Подскажите пожалуйста как мне определить адрес буффера? Поясняю:

Я не совсем понял при чем здесь вопрос и код приведенный для примера :-[

Но твой код можно слегка "оптимизировать":
Код: plaintext
1.
2.
3.
4.
Dim ByteArr() As Byte
Dim tempstr As String

tempstr = "Просто строка для иллюстрации"
 ByteArr = StrConv(tempstr, vbFromUnicode)



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

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


Кстати! Почту получила?

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Адресс буффера
    #35599215
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnПервый вопрос: для чего это потребовалось?
Второй вопрос: зачем вы смешиваете в одной строке устаревший и сегодняшний способы декларирования ваших переменных?

1. Потребовалось потому что надо определить адрес данных в памяти. Такая поставлена задача
2. Объявление по-старому и по-новому, это скорее всего вопрос привычки, т.е. я привыкла писать Dim temp_string$, а не Dim temp_string As String. Принципиальной разницы не вижу.

CopyMemory по-моему как раз и отвечает за копирование данных с указанного адреса. А мне нужно узнать адресс.

VarPtr, StrPtr - наверное это то что мне надо. Буду разбираться.

Игорь Горбонос
1. Код приведен просто для примера, ну то есть как узнать адрес именно такого байтового массива не более
2. Почту не проверяла. На днях пойду проверю :)
...
Рейтинг: 0 / 0
Адресс буффера
    #35599237
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос: Почему tempstr и tempstr2 различаются?
Код:
Код: 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.
Dim ByteArr() As Byte, oByte() As Byte
Dim tempstr$, i&, byte_address As Long

tempstr = "Просто строка для иллюстрации"
ReDim ByteArr(Len(tempstr) -  1 )
For i =  0  To UBound(ByteArr)
    ByteArr(i) = Asc(Mid(tempstr, i +  1 ,  1 ))
Next i



StrPtr (tempstr)


CopyMemory Len(tempstr), ByVal StrPtr(tempstr),  4 
ReDim oByte( 0  To Len(tempstr) -  1 ) As Byte
CopyMemory oByte( 0 ), ByVal StrPtr(tempstr) +  4 , Len(tempstr)

Dim tempstr2$
tempstr2 = ""
For i =  0  To UBound(oByte)
    tempstr2 = tempstr2 + Chr(oByte(i))
Next i

'tempstr2 = ">AB>  AB@>:0  4;O"
...
Рейтинг: 0 / 0
Адресс буффера
    #35599282
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем с тем почему мне выдавало какую-то ерунду при копировании из памяти по указанному аддресу я разобралась. Если кому-нибудь будет интересно-поясняю. При конвертации не понимались русские буквы и строка разделена 0 символами, также строка получилась обрезанной из-за смещения, т.е. адрес на строку был ни разу не 32-разрядным.

Вопрос: Как сформировать 32-разрядный указатель?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim oByte() As Byte
Dim tempstr$, i&, byte_address As Long

tempstr = "english word"

CopyMemory Len(tempstr), ByVal StrPtr(tempstr),  0 
ReDim oByte( 0  To Len(tempstr) *  2  -  1 ) As Byte
CopyMemory oByte( 0 ), ByVal StrPtr(tempstr) +  0 , Len(tempstr) *  2 

Dim tempstr2$
tempstr2 = ""
For i =  0  To UBound(oByte)
    tempstr2 = tempstr2 + Chr(oByte(i))
Next i

'tempstr2 = "e n g l i s h   w o r d "

т.е. собственно чтобы вместо 0 было смещение 4, как для long ?
...
Рейтинг: 0 / 0
Адресс буффера
    #35599385
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kallandor,
про русские буквы: надо учитывать, что кодировка Unicode в понимании Microsoft двухбайтовая.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 Dim ByteArr() As Byte, oByte() As Byte
 Dim tempstr$, i&, byte_address As Long
 
 tempstr = "Просто строка для иллюстрации"
'Так делать нельзя, потому что надо использовать AscW(), которая вызовет
'переполнение при присвоениии байту, поскольку вернёт для кириллицы код,
'не умещающийся в байт.
' ReDim ByteArr(Len(tempstr) - 1)
' For i = 0 To UBound(ByteArr)
'     ByteArr(i) = Asc(Mid(tempstr, i + 1, 1)) 
' Next i
 
 'CopyMemory Len(tempstr), ByVal StrPtr(tempstr), 4 'Что это???? Нет, правда?
 ReDim oByte( 0  To Len(tempstr) *  2  -  1 ) As Byte
 CopyMemory oByte( 0 ), ByVal StrPtr(tempstr), Len(tempstr) *  2 
 
 Dim tempstr2$
 tempstr2 = ""
 For i =  0  To UBound(oByte) -  1  Step  2 
     tempstr2 = tempstr2 + ChrW(CInt(oByte(i +  1 )) *  256  + oByte(i))
 Next i

Право слово, ничего личного, я позитивен и лучусь благожелательностью , но не оставляет впечатление, что Вы
1) настойчиво ломитесь в открытую дверь
2) не читаете советских газет... тьфу, хорошие статьи, на которые Вам дали ссылки
3) пользуетесь терминологией в своём, отличном от общепринятого, смысле
4) считаете, что форумчане в контексте Ваших частных задач и Ваших способов их решения.

Это я к тому, что не понял фраз "Вопрос: Как сформировать 32-разрядный указатель?" и "т.е. собственно чтобы вместо 0 было смещение 4, как для long ?"
И ещё я не понял, зачем эти фокусы вообще.
...
Рейтинг: 0 / 0
Адресс буффера
    #35600331
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктKallandor,
про русские буквы: надо учитывать, что кодировка Unicode в понимании Microsoft двухбайтовая.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 Dim ByteArr() As Byte, oByte() As Byte
 Dim tempstr$, i&, byte_address As Long
 
 tempstr = "Просто строка для иллюстрации"
'Так делать нельзя, потому что надо использовать AscW(), которая вызовет
'переполнение при присвоениии байту, поскольку вернёт для кириллицы код,
'не умещающийся в байт.
' ReDim ByteArr(Len(tempstr) - 1)
' For i = 0 To UBound(ByteArr)
'     ByteArr(i) = Asc(Mid(tempstr, i + 1, 1)) 
' Next i
 
 'CopyMemory Len(tempstr), ByVal StrPtr(tempstr),  4  'Что это???? Нет, правда?

Это я пыталась посмотреть что лежит в памяти по указанному мною адресу и надо чтобы обязательно смещение было 4
Бенедикт
Право слово, ничего личного, я позитивен и лучусь благожелательностью , но не оставляет впечатление, что Вы
1) настойчиво ломитесь в открытую дверь
2) не читаете советских газет... тьфу, хорошие статьи, на которые Вам дали ссылки
3) пользуетесь терминологией в своём, отличном от общепринятого, смысле
4) считаете, что форумчане в контексте Ваших частных задач и Ваших способов их решения.

1. Если я вдруг оказалась хамкой - извините, вот что что, а хамить я точно не собиралась
2. читать то я читаю, только вот наверное до меня доходит не все что написано, или все но не с первого раза. Так что в этом вопросе я признаю свою туповатось
4. Ставить форумчан в контекст всей задачи считаю нецелесообразно. Потому как порой большая задача делится на мелкие подзадачи и ряд мелких подзадач уже решен, а одна какая-нибудь мелкая, зараза, ну никак не хочет решаться, и надо решить именно мелкую подзадачу

БенедиктЭто я к тому, что не понял фраз "Вопрос: Как сформировать 32-разрядный указатель?" и "т.е. собственно чтобы вместо 0 было смещение 4, как для long ?"
И ещё я не понял, зачем эти фокусы вообще.
Одним из входных параметров в функцию, описанную в сторонней dll, является указатель на буфер в котором помещенны данные полученные с помощью вызова MTEGetSnapshot. Собственно, данные из буфера MTEGetSnapshot помещены в базу. Потом я формирую байтовый массив из этих данных или строку из байтов (еще не поняла до конца что надо команде) и потом указатель на буффер хочу передать в команду MTESetSnapshot. Собственно коды:
Код: 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.
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)

'....

Sub SetSnapshot(Idx As Long, iId_Snapshot As Long)
Dim sErr$, tempstr$, TmpSnap() As String, iLen&, ErrorMsg As String, ByteSnapshot() As Byte, i&
Dim nErr As Long, iAdress As Long
Dim NullCharPos&

On Error GoTo SetSnapshot_Err

Cmd = "select DATA from SNAPSHOT where SNAPSHOT_ID='" + CStr(iId_Snapshot) + "'"

SQL_exec Cmd
If Result <>  0  Then
    Result =  1 
    Exit Sub
End If

tempstr = rs_SQL.Fields( 0 )
If Right(tempstr,  1 ) = Chr( 124 ) Then
    tempstr = Left(tempstr, Len(tempstr) -  1 )
End If

TmpSnap = Split(tempstr, Chr( 124 ))


ReDim ByteSnapshot(UBound(TmpSnap))

For i =  0  To UBound(TmpSnap)
    ByteSnapshot(i) = CByte(TmpSnap(i))
Next i

tempstr = Replace(tempstr, Chr( 124 ), "")
tempstr = StrConv(tempstr, vbFromUnicode)
'пока только пытаюсь понять что конкретно надо команде строка или массив, поэтому разные варианты
iAdress = StrPtr(tempstr) -  4 
iAdress = VarPtr(ByteSnapshot( 0 ))
iLen = Len(tempstr)
ErrorMsg = String$( 255 , vbNullChar)

nErr = DF_SetSnapshot(Idx, iAdress, iLen, ErrorMsg)

NullCharPos = InStr(ErrorMsg, vbNullChar)

If NullCharPos And nErr < MTE_OK Then
    PutErrorTextByIdx nErr
    Result =  1 
    Exit Sub
End If


Result =  0 
Exit Sub
SetSnapshot_Err:
    Result =  1 
    sErr = Err.Number & " " & Err.Source & " " & Err.Description
    PutError "SetSnapshot. " + sErr + " Ошибка при получении снапшота", , Logging
    Exit Sub
End Sub

Собственно это описание проблемы более подробно. Но все равно пока такой код выдает ошибку на этапе обращения к DF_SetSnapshot. То есть ErrorMsg заполнено ошибкой, присланной от ММВБ
...
Рейтинг: 0 / 0
Адресс буффера
    #35601239
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KallandorЭто я пыталась посмотреть что лежит в памяти по указанному мною адресу и надо чтобы обязательно смещение было 4А получилось вот что: создана автоматическая временная переменная, в которую помещён результат функции Len(). Затем в эту переменную функцией CopyMemory() занесены первые 4 байта (два символа) тела строки. Затем эта переменная автоматически уничтожилась.KallandorСобственно, данные из буфера MTEGetSnapshot помещены в базу.Хорошее решение. Не выложите базу (это .mdb?) (или дампов нескольких снэпшотов) вместе с кодом, помещавшим данные в базу, для того, чтобы было, что пощупать руками?KallandorПотом я формирую байтовый массив из этих данных или строку из байтов (еще не поняла до конца что надо команде) и потом указатель на буффер хочу передать в команду MTESetSnapshot.Может быть, стоит проверить на самом простом тесте: передать в MTESetSnapshot снэпшот, сохранённый в базе, без каких-либо изменений?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim ByteSnapshot() As Byte

On Error GoTo SetSnapshot_Err

Cmd = "select DATA from SNAPSHOT where SNAPSHOT_ID='" + CStr(iId_Snapshot) + "'"

SQL_exec Cmd
If Result <>  0  Then
    Result =  1 
    Exit Sub
End If

ByteSnapshot = rs_SQL.Fields( 0 ) 'кстати - DAO или ADO?

iAdress = VarPtr(ByteSnapshot( 0 ))
iLen = UBound(ByteSnapshot) +  1 
'и т. д.
Как изменения Вы хотите внести в снэпшот?

P.S. Под ломлением в открытую дверь я имел ввиду, что Вы пытаетесь сделать какую-то простую, и многократно сделанную вещь. Сами, набивая все шишки, и без оглядки на то, как это делали другие. Больно на это смотреть. Но - Ваше право. (Сам такой Мы все такие)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601375
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

Один снапшот для примера я могу привести (посто на самом деле они все похожи, так как до второго снапшота я не могу дойти, к сожаленью). Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 104 | 214 | 101 | 38 | 182 | 108 | 250 | 217 | 6 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 8 | 0 | 0 | 0 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 51 | 74 | 0 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 83 | 69 | 84 | 84 | 76 | 69 | 67 | 79 | 68 | 69 | 83 | 0 | 159 | 225 | 255 | 255 | 5 | 0 | 0 | 0 | 10 
| 0 | 0 | 0 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 43 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 73 | 78 | 83 | 84 | 82 | 83 | 0 
| 159 | 225 | 255 | 255 | 4 | 0 | 0 | 0 | 8 | 0 | 0 | 0 | 48 | 48 | 48 | 48 | 48 | 55 | 57 | 51 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 
| 70 | 73 | 82 | 77 | 83 | 0 | 159 | 225 | 255 | 255 | 3 | 0 | 0 | 0 | 34 | 0 | 0 | 0 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 48 | 32 | 32 | 32 | 32 
| 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 40 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 
| 0 | 0 | 85 | 83 | 69 | 82 | 83 | 0 | 159 | 225 | 255 | 255 | 2 | 0 | 0 | 0 | 10 | 0 | 0 | 0 | 48 | 48 | 48 | 48 | 48 | 48 | 49 | 51 | 48 | 53 | 54 | 0 | 0 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 84 | 82 | 65 | 68 | 69 | 83 | 0 | 159 | 225 | 255 | 255 | 1 | 0 | 0 | 0 | 35 | 0 | 0 | 0 | 48 | 48 | 48 
| 48 | 48 | 48 | 48 | 48 | 48 | 48 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 
| 32 | 32 | 33 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 32 | 0 | 83 | 69 | 67 | 85 | 82 | 73 | 84 | 73 
| 69 | 83 | 0 | 159 | 225 | 255 | 255 | 52 | 57 | 48 | 48 |

Собственно это байтовый массив, через chr(124) - вертикальная палочка, я сплитую это в байтовый массив просто через Cbyte()
Пробовала посылать и ByRef сформированный массив - не выходит цветочек каменный

Как формирую массив байтов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim in_byte() As String, out_byte() As Byte, i&
If Right(tempstr$,  1 ) = Chr( 124 ) Then
    tempstr = Left(tempstr, Len(tempstr$) -  1 )
End If

in_byte = Split(tempstr, Chr( 124 ))
ReDim out_byte(UBound(in_byte))

For i =  0  To UBound(in_byte)
    out_byte = CByte(in_byte(i))
Next i

Мне кажется, что это из-за различной адресной арифметики между с++ и vb. Так как сторонняя dll написана на с++. Также посоветовавшись с разработчиками dll я поняла что если я им буду передавать строку, то в бейсике она будет в формате unicode, а они ожидают asciiZ строку, поэтому наверное лучше передвать массив. Осталось понять как определить адрес этого массива :(
...
Рейтинг: 0 / 0
Адресс буффера
    #35601385
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт,

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


А с чего ты взяла, что там будет юникод?

А как тогда работает этот код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Declare Function FindWindow Lib "user32" Alias _
         "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName _
         As String) As Long
....
' Get the hWnd of the target application
          ThWnd = FindWindow(vbNullString, "Target")
....
Здесь явно указана функция не использующая юникод. И все работает, без дополнительных
перетрубаций

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

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

Юникод там потому что когда я делала действия указанные в первом посте, только на примере строки, вытащенной из sql сервера, то возвращалась сторка с ноликом через символ. Вот. На основании этого я решила, что в бейсике по умолчанию юникод. Вот
...
Рейтинг: 0 / 0
Адресс буффера
    #35601446
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BSTR пусть в c++ dll юзают и тебя и нас не мучают ;)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601460
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

это только мечты. Мне кажется сейчас они активно продвигают продажу уже сделанного продукта. И еще по-моему у них действует принцип - "Это не bug'а, это фича"
...
Рейтинг: 0 / 0
Адресс буффера
    #35601463
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грустно, тогда гуглите по проблеме передачи строк из бэйсика в C++ (BSTR->ansiiZ)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601471
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Konst_One
> грустно, тогда гуглите по проблеме передачи строк из бэйсика в C++ (BSTR->ansiiZ)
По моему Бенедикт уже давал
эту ссылку

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Адресс буффера
    #35601473
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
невнимательно читал ветку, тогда автору надо все прочитать и сделать коррективы
...
Рейтинг: 0 / 0
Адресс буффера
    #35601501
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strings and Byte Arrays
Of course, a byte array is just an array whose members have type byte, for instance:

Dim b(1 to 100) As Byte

To get a pointer to this byte array, we can use VarPtr:

Dim lpsz As Long
lpsz = VarPtr(b(1)) ' or rpiVarPtr(b(1))

(Even though it doesn't seem so, the letters lpsz stand for long pointer to null-terminated string.) Note that the address of the first member of the array is the address of the array.

Remembering that an LPSTR is a pointer to a null-terminated character array, we should initialize the array to nulls:

For i = 1 To 100
b(i) = 0
Next

(It is true that VB does its own initialization, but it is not good programming practice to rely on this.)

Translating Between Byte Arrays and BSTRs
To copy a BSTR:

Dim s As String

to a byte array, we can proceed in a couple of different ways. For a strictly VB solution, we have:

s = "help"
Dim b(1 To 8) As Byte
For i = 1 To 8
b(i) = AscB(MidB(s, i))
Next

Another approach is:

s = "help"
Dim b(1 To 8) As Byte
CopyMemory b(1), ByVal StrPtr(s), LenB(s)

Note that (in both cases) we get:

104 0 101 0 108 0 112 0

showing that the bytes are reversed in each Unicode integer.

In the other direction, to copy a byte array into a BSTR, VB gives us some help. If b is a Unicode byte array, we can just write:

Dim t As String
t = b

For an ANSI byte array b, we write:

Dim t As String
t = StrConv(b, vbUnicode)

Note, however, that the StrConv function does not recognize a null terminator in the byte array--it will translate the entire array. Any nulls that are encountered in the array become embedded nulls in the BSTR.
...
Рейтинг: 0 / 0
Адресс буффера
    #35601517
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
From BSTR to LPSTR
The function to convert a BSTR to an LPSTR is similar, but requires a translation from Unicode to ANSI first:

Код: 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.
Dim cnt as Long
Dim bArr() as Byte
Dim lpsz as Long

cnt=BSTRtoLPSTR("передаем эту строку в С++ dll", bArr, lpsz)

'это на выходе, что нужно сунуть в C++ dll
'bArr - массив
'lpsz - указатель на массив


Function BSTRtoLPSTR(sBSTR As String, b() As Byte, lpsz As Long) As Long
 
' Input: a nonempty BSTR string
' Input: **undimensioned** byte array b()
' Output: Fills byte array b() with ANSI char string
' Output: Fills lpsz with a pointer to b() array
' Returns byte count, not including terminating null
' Original BSTR is not affected
 
Dim cBytes As Long
Dim sABSTR As String
 
cBytes = LenB(sBSTR)
 
' ReDim array, with space for terminating null
ReDim b( 1  To cBytes +  2 ) As Byte
 
' Convert to ANSI
sABSTR = StrConv(sBSTR, vbFromUnicode)
 
' Point to BSTR char array
lpsz = StrPtr(sABSTR)
 
' Copy the array
CopyMemory b( 1 ), ByVal lpsz, cBytes +  2 
 
' Point lpsz to new array
lpsz = VarPtr(b( 1 ))
 
' Return byte count
BSTRtoLPSTR = cBytes
 
End Function
...
Рейтинг: 0 / 0
Адресс буффера
    #35601537
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

ага, я это тоже увидела. Только вот доходит до меня долго Тупенькая я

Когда делаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim ByteArr() As Byte, oByte() As Byte
Dim tempstr$, i&, byte_address As Long, iLen As Long, hArrMem As Long

tempstr = "english word"

iLen = BSTRtoLPSTR(tempstr, ByteArr, byte_address)

CopyMemory iLen, ByVal byte_address,  2 
ReDim oByte( 0  To iLen -  1 ) As Byte
CopyMemory oByte( 0 ), ByVal byte_address +  2 , iLen

Dim tempstr2$
tempstr2 = ""
For i =  0  To UBound(oByte)
    tempstr2 = tempstr2 + Chr(oByte(i))
Next i

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

что вы хотите увидеть?
...
Рейтинг: 0 / 0
Адресс буффера
    #35601557
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
cnt=BSTRtoLPSTR("передаем эту строку в С++ dll", bArr, lpsz)
nErr = DF_SetSnapshot(Idx, lpsz, cnt, ErrorMsg)
...
Рейтинг: 0 / 0
Адресс буффера
    #35601559
Фотография Kallandor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneзачем вам tempstr2$

что вы хотите увидеть?

"english word"
...
Рейтинг: 0 / 0
Адресс буффера
    #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
Адресс буффера
    #35605609
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решения этой задачи мне может пригодиться в качестве взлома проги (обход запретных процедур) ?
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Адресс буффера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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