Страница: 1 | 2 |
Вопрос: Текст контролла из POWERBASIC7.02
Добавлено: 16.04.05 12:21
Автор вопроса: kolyanoid
Народ! Нужно написать DLL на PowerBasic'е, функция которой возвращала бы текст контролла другого окна...
Подробнее:
Есть одна прога (не ВБ и не ПБ). Она при помощи ДЛЛки (PureBasic) создаёт окно и контроллы, и делает себя дочерним для него. Но так как в PureBasic команда, которая вытаскивает текст из указанного контролла работает криво (если всё это скомпиллировано в ДЛЛ), мне нужно написать ДЛЛ на другом я зыке, которая бы заменяла этот досадный баг. Хэндл контролла известен. Юзаю АПИ.
Я конечно ковырялся в ПБ, но толку мало - текст не возвращается... Вот моя наработка на ПБ:
DECLARE FUNCTION GetWindowText LIB "user32" ALIAS "GetWindowTextA" (BYVAL hwnd AS LONG, BYVAL lpString AS STRING, BYVAL cch AS LONG) AS LONG
FUNCTION GETTEXT(BYVAL ID$) EXPORT AS STRING
DIM Txt AS STRING
Txt = STRING$(100, CHR$(0))
GetWindowText(BYVAL VAL(ID$), BYVAL Txt, BYVAL 100)
FUNCTION=txt
END FUNCTION
Для удобства я передаю хэндл контролла (ID$) в виде строки...
НАРОД! Подскажите, где я неправ???
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #1
Добавлено: 16.04.05 12:23
Забыл сказать, этот "загадочный контролл" - TextBox
Может я не ту АПИ-функцию заюзал? Но вроде в API-Guide'е написано, что она возвращает текст окна или контролла, смотря кому этот хэндл принадленжит...
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 16.04.05 12:24
Читаем MSDN. Сразу узнаём, в чём дело.
Ещё можно почитать блог Реймонда Чена, тогда будет понятно ещё и почему всё обстоит именно так.
Короче, нельзя получить текст не своего окна через getwindowtext. Нуно слать WM_GETTEXT.
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 16.04.05 13:21
PowerBasic ни есть гуд
ftp://crts.ru/sne/kolyanoid.rar
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 16.04.05 14:29
invoke SendMessage, hWnd, WM_GETTEXTLENGTH, 0h, 0h
может, тут добавить inc eax? На terminate zero.
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 16.04.05 15:49
Я тоже по-началу засомневался и написал, потом сверился:
Number of bytes to copy from psz. A null character is placed afterwards, allocating a total of len plus the size of OLECHAR bytes.
Allocates a new string of len bytes, copies len bytes from the passed string into it, and then appends a null character.
и не стал разбрасываться лишним байтом
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 16.04.05 16:00
Ах да, цитату привел и не сказал откуда это
BSTR SysAllocStringByteLen(
LPCSTR psz,
unsigned int len
);
Номер ответа: 7
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #7
Добавлено: 16.04.05 17:18
Sne, спасибо большое! Но это не силдьно помогло, а даже разочаровало
Дело в том, что вся прога вылетает после вызова ДЛЛки более 10000 раз (в основном цикле программы - это фигня, 10 секунд работы)... Стандартное средство PureBasic' (на котором все окна и контроллы создаются) тоже вылетает (но после 13908-го вызова), поэтому я и стал искать альтернативу... Весь ацтой в том, что периодическое открытие и закрытие ДЛЛки тоже не помогают...
Номер ответа: 8
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #8
Добавлено: 16.04.05 17:23
А НЕТ!!!!! SNE! СПАСИБО! Я наконец решил эту проблему. Она была в СРАНОМ PUREBASIC'е! Я в цикле постоянно получал хэндл этого контролла, и именно это приводило к сбою. Т.е. когда я его получил один раз при запуске - всё стало нормально!
SNE! Маленький баг есть в твоей ДЛЛке. Она возвращает строку, но в этой строке отсутствует последний символ (т.е. строка на один символ меньше, чем реальный текст в контролле).
Буду ОЧЕНЬ тебе благодарен, если ты исправишь эту багу... Правда, очень нужно!
Зарание спасибо
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 16.04.05 17:37
Использование SysAllocStringByteLen имеет некоторые ньюансы, один из которых может приводить к вылету программы.
Если строка, которая была получена от SysAllocStringByteLen никак не была использована, то после некоторого количества вызовов последует вылет. Такой пример (на VB):
Declare Function FuncInDll_UsingSysAllocStringByteLen() As String
Private Sub cmd_Click()
 im s as String
s = FuncInDll_UsingSysAllocStringByteLen
End Sub
будет работать, а такой:
Private Sub cmd_Click()
FuncInDll_UsingSysAllocStringByteLen
End Sub
будет вылетать.
Чем вызвано - только догадываюсь. Возможно, что надо освобождать строку, в первом примере VB при перегрузке в переменную s очищает память занимаемую строкой от SysAllocStringByteLen,
Во втором случае - нет.
Это просто попытки объяснить явление. Но то, что первый вариант устойчиво работает, а второй устойчиво вылетает при многочисленных вызовах - это проверено на практике.
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 16.04.05 17:39
sne, всё-таки inc eax
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 16.04.05 17:44
Тут лежит подправленная dll^
http://webfile.ru/261777
Номер ответа: 12
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #12
Добавлено: 16.04.05 18:07
СПАСИБО!
P.S.
Только прога всёравно вылетает... Просто теперь после 69517'го вызова ((((((((((((((((((
Номер ответа: 13
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #13
Добавлено: 16.04.05 18:15
СРАНЫЙ PUREBASIC!!! ОДНИ БАГИ, БЛИН!
Ладно, спаибо народ! Буду PowerBasic насиловать - заставлять его показать хоть ОДНО окошко...
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 17.04.05 00:28
kolyanoid
Отладчик есть? Воспользуйся. Какая-нибудь доп.инфа появится, типа LastError или какое-то исключение, посмотришь, когда, при каких обстоятельствах происходит.
Номер ответа: 15
Автор ответа:
kolyanoid
Вопросов: 19
Ответов: 60
Профиль | | #15
Добавлено: 17.04.05 15:06
А вылетает без сообщения об ошибке...
Ды это и не важно... Главное, я знаю конкретное место (команду) в котором это происходит...
Отладчик-то есть, только я внём полный чайник...