Использование GetWindowText

 
Обнаружилось, что функция GetWindowText (и, насколько можно предположить, остальные функции, получающие LPTSTR), не возвращает значения:

string s;
GetWindowText(hwnd,s,num);
Print(s);

данная ситуация обходится предварительной инициализацией строки s. Задним числом можно догадаться о причинах этого, но ситуация, тем не менее, весьма неочевидная. Хотелось бы видеть в будущих релизах или соответствующую авто-инициализацию строковых переменных перед вызовами dll, или хотя бы пример использования (благо, в stdlib.h функция упомянута)
 
Для многих это очевидно

Syntax

int GetWindowText( HWND hWnd,
LPTSTR lpString,
int nMaxCount
);
Parameters

hWnd
[in] Handle to the window or control containing the text.
lpString
[out] Pointer to the buffer that will receive the text. If the string is as long or longer than the buffer, the string is truncated and terminated with a NULL character.
nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.
 
Вы правильно нашли обходной путь, однако имейте в виду, что инициализатор, используемый для строки s, больше нигде нельзя использовать.
 
babybear: хелп к винапи, разумеется, вещь полезная ). Я немного о другом (речь даже не о конкретной функции): раз уж полного сокрытия технических деталей не получается, то было бы здорово видеть в mt-документации немного больше информации о том, как все это "изнутри" устроено. Т.е. если речь идет о передаче/приемке в длл чуть более сложного, чем int (те же массивы котировок, или вот я бы с удовольствием тот же LPRECT пополучал бы) - уже нужно в голове прокручивать "ага, а внутри это, скорее всего то-то, значит, используем как обычный указатель". Т.е. что касается конкретно передачи буферов LPTSTR - я бы с бОльшим удовольствием увидел бы что-нибудь вроде SetLength.

slawa: не вполне уразумел насчет "больше нигде нельзя использовать" - т.е.? Я инициализирую константой.
 
Вот эту константу больше нельзя нигде использовать. Попробуйте её распечатать после вызова функции GetWindowTextA.
   string initstr="         1         2         3         4         5         6";
   GetWindowTextA(hwnd,initstr,StringLen(initstr));
   Print("         1         2         3         4         5         6");


 
кстати, по поводу документирования: Слава, вы не думали прикрутить к mql4.com что-нибудь более простое для добавления, чем "статьи", т.е. нечто wiki-образное? В официальной документации - находится самый минимум, новичку, сталкивающемуся с чуть более сложными, но постоянными вопросами (нормализация, скажем) - приходится спрашивать в форуме в сотый раз. А некоторые важные и нетривиальные вопросы обсуждаются и теряются в глубинах старых страниц. (их и искать никто не будет, поскольку не догадывается о том, что такой вопрос в принципе существует ;))). Опять же можно было бы кучковать пожелания к будущим версиям.
 
хехех, забавненько )))). У вас устроена какая-то хэш-таблица констант?
ну вот, а вы, babybear, говорите, что все очевидно )))...
 
Этот побочный эффект обнаружил Rosh примерно год назад, когда пытался прочитать имя директория, откуда запущен клиентский терминал.
 
хехех, забавненько )))). У вас устроена какая-то хэш-таблица констант?
ну вот, а вы, babybear, говорите, что все очевидно )))...

Сдаюся! :)
Оптимизаторы на.
 
Этот побочный эффект обнаружил Rosh примерно год назад, когда пытался прочитать имя директория, откуда запущен клиентский терминал.



Видимо речь об этом - "MQL4: Crash в "About""
Причина обращения: