Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Текст контролла из POWERBASIC7.02 Добавлено: 16.04.05 12:21  

Автор вопроса:  kolyanoid
Народ! Нужно написать 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
Автор ответа:
 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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()
    ;Dim 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
А вылетает без сообщения об ошибке...
Ды это и не важно... Главное, я знаю конкретное место (команду) в котором это происходит...

Отладчик-то есть, только я внём полный чайник... :)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам