Страница: 1 |
Страница: 1 |
Вопрос: передача указателя структуры? :(
Добавлено: 09.11.04 15:59
Автор вопроса: j3d1 | ICQ: 8370005
скорее всего я где-то чёто не досмотрел, а может и нет :(. Трабла собственно в том что я передаю из сишной функции указатель на структуру в вб, численные переменные отображаются нормально, вот со стрингами проблема, вб хавает только 1 символ.
наглядный сэмпл
Public Type cSes
cname As Long 'LPWSTR sesi502_cname;
username As Long 'LPWSTR sesi502_username;
num_opens As Long 'DWORD sesi502_num_opens;
time As Long 'DWORD sesi502_time;
idle_time As Long 'DWORD sesi502_idle_time;
user_flags As Long 'DWORD sesi502_user_flags;
lctype As Long 'LPWSTR sesi502_cltype_name;
transport As Long 'LPWSTR sesi502_transport;
End Type
^^^ структура в которую передаются значения таким вот макаром
dim struct as cSes
ret = SomeFunction()
в переменной ret сщдуржится адрес на начало структуры, затем
CopyMemory struct,ByVal ret,lenb(struct)
struct.time // - отображаятся нормально
struct.username // - содержит указатель на стринг, его я получаю следующим способом
dim tString as string
tString = string(255,0)
lstrcopyA(tString,struct.username) // это API функция
дальше обрезаю нули, и возврашяет только 1 символ :(
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #1
Добавлено: 09.11.04 16:35
Попробуй
Номер ответа: 2
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #2
Добавлено: 09.11.04 16:45
LPWSTR - это вроде wide, попробуй преобразовать его сначала в ascii
И попробуй определить длину строки в байтах и сравнить с количеством букв+завершающий ноль. Может это даст доп. инфу
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 09.11.04 17:55
То что в Си текстовое поле типа: LPWSTR/LPSTR это для нас VB'шников обычные Long'и. Т.е. там для нас будет храниться указатель на сам буфер со строкой.
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 10.11.04 09:14
2dNW Тогда уж Dim tString(255) As Byte
LPWSTR = ByVal as String. Разумеется, long, только вот длину этого буфера узнать трудновато. ВБ не ахти как работает с NTS. Хотя можно и через АПИ.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 10.11.04 09:18
Возможно еще зависит от оси. Так, под 2000/ХР обычно используется Unicode, для 98/ME - ANSI. Т.е. LPWSTR или LPSTR - это еще вопрос, и зависит он во многом от библиотеки.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 10.11.04 11:15
ЗЫ
для того тобы узнать длинну строки по ее адресу можно использовать АПИ:
lstrlenA
lstrlenW
при этом ByVal .. As String надо бы заменить на ByVal .. As Long
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 10.11.04 11:32
Оно понятно, но сложнее определить какая именно длина имеется ввиду - в
байтах или в символах. Функция об этом ничего не говорит.
Номер ответа: 8
Автор ответа:
j3d1
ICQ: 8370005
Вопросов: 34
Ответов: 466
Профиль | | #8
Добавлено: 12.11.04 21:08
эээ, тавариши, всем пасиба я с этим уже давно розбрался.
ЗЫ. решение нашёлв MSDN