Вопрос: Текст контролла из POWERBASIC7.02 | Добавлено: 16.04.05 12:21 |
Автор вопроса: ![]() |
Народ! Нужно написать DLL на PowerBasic'е, функция которой возвращала бы текст контролла другого окна...
Подробнее: Есть одна прога (не ВБ и не ПБ). Она при помощи ДЛЛки (PureBasic) создаёт окно и контроллы, и делает себя дочерним для него. Но так как в PureBasic команда, которая вытаскивает текст из указанного контролла работает криво (если всё это скомпиллировано в ДЛЛ), мне нужно написать ДЛЛ на другом я зыке, которая бы заменяла этот досадный баг. Хэндл контролла известен. Юзаю АПИ. Я конечно ковырялся в ПБ, но толку мало - текст не возвращается... Вот моя наработка на ПБ: #COMPILE DLL
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #1 | Добавлено: 16.04.05 12:23 |
Забыл сказать, этот "загадочный контролл" - TextBox ![]() Может я не ту АПИ-функцию заюзал? Но вроде в API-Guide'е написано, что она возвращает текст окна или контролла, смотря кому этот хэндл принадленжит... |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #2 | Добавлено: 16.04.05 12:24 |
Читаем MSDN. Сразу узнаём, в чём дело.
Ещё можно почитать блог Реймонда Чена, тогда будет понятно ещё и почему всё обстоит именно так. Короче, нельзя получить текст не своего окна через getwindowtext. Нуно слать WM_GETTEXT. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 16.04.05 13:21 |
PowerBasic ни есть гуд ![]() ftp://crts.ru/sne/kolyanoid.rar |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #4 | Добавлено: 16.04.05 14:29 |
invoke SendMessage, hWnd, WM_GETTEXTLENGTH, 0h, 0h
может, тут добавить inc eax? На terminate zero. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 16.04.05 15:49 |
Я тоже по-началу засомневался и написал, потом сверился:
len
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 16.04.05 16:00 |
Ах да, цитату привел и не сказал откуда это ![]() BSTR SysAllocStringByteLen( LPCSTR psz, unsigned int len ); |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #7 | Добавлено: 16.04.05 17:18 |
Sne, спасибо большое! Но это не силдьно помогло, а даже разочаровало ![]() Дело в том, что вся прога вылетает после вызова ДЛЛки более 10000 раз (в основном цикле программы - это фигня, 10 секунд работы)... Стандартное средство PureBasic' (на котором все окна и контроллы создаются) тоже вылетает (но после 13908-го вызова), поэтому я и стал искать альтернативу... Весь ацтой в том, что периодическое открытие и закрытие ДЛЛки тоже не помогают... |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #8 | Добавлено: 16.04.05 17:23 |
А НЕТ!!!!! SNE! СПАСИБО! Я наконец решил эту проблему. Она была в СРАНОМ PUREBASIC'е! Я в цикле постоянно получал хэндл этого контролла, и именно это приводило к сбою. Т.е. когда я его получил один раз при запуске - всё стало нормально!
SNE! Маленький баг есть в твоей ДЛЛке. Она возвращает строку, но в этой строке отсутствует последний символ (т.е. строка на один символ меньше, чем реальный текст в контролле). Буду ОЧЕНЬ тебе благодарен, если ты исправишь эту багу... Правда, очень нужно! Зарание спасибо ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #9 | Добавлено: 16.04.05 17:37 |
Использование SysAllocStringByteLen имеет некоторые ньюансы, один из которых может приводить к вылету программы.
Если строка, которая была получена от SysAllocStringByteLen никак не была использована, то после некоторого количества вызовов последует вылет. Такой пример (на VB): Declare Function FuncInDll_UsingSysAllocStringByteLen() As String Private Sub cmd_Click() ![]() s = FuncInDll_UsingSysAllocStringByteLen End Sub будет работать, а такой: Private Sub cmd_Click() FuncInDll_UsingSysAllocStringByteLen End Sub будет вылетать. Чем вызвано - только догадываюсь. Возможно, что надо освобождать строку, в первом примере VB при перегрузке в переменную s очищает память занимаемую строкой от SysAllocStringByteLen, Во втором случае - нет. Это просто попытки объяснить явление. Но то, что первый вариант устойчиво работает, а второй устойчиво вылетает при многочисленных вызовах - это проверено на практике. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #10 | Добавлено: 16.04.05 17:39 |
sne, всё-таки inc eax ![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #11 | Добавлено: 16.04.05 17:44 |
Тут лежит подправленная dll^
http://webfile.ru/261777 |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #12 | Добавлено: 16.04.05 18:07 |
СПАСИБО!
P.S. Только прога всёравно вылетает... Просто теперь после 69517'го вызова ![]() |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #13 | Добавлено: 16.04.05 18:15 |
СРАНЫЙ PUREBASIC!!! ОДНИ БАГИ, БЛИН!
Ладно, спаибо народ! Буду PowerBasic насиловать - заставлять его показать хоть ОДНО окошко... |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #14 | Добавлено: 17.04.05 00:28 |
kolyanoid
Отладчик есть? Воспользуйся. Какая-нибудь доп.инфа появится, типа LastError или какое-то исключение, посмотришь, когда, при каких обстоятельствах происходит. |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 19 Ответов: 60 |
Профиль | Цитата | #15 | Добавлено: 17.04.05 15:06 |
А вылетает без сообщения об ошибке...
Ды это и не важно... Главное, я знаю конкретное место (команду) в котором это происходит... Отладчик-то есть, только я внём полный чайник... ![]() |
|