Значит так. Есть чужая форма (программа), в которой имеется компонент SysListView32, тоесть ListView. Необходимо через WinApi показать текст одного из элементов этого листбокса. Навякал код: Code: char pszText[20000]; LVITEM * lvi = new LVITEM(); lvi->mask = LVIF_TEXT; lvi->iItem = 0; lvi->iSubItem = 0; lvi->pszText = pszText; lvi->cchTextMax = 10000; hWnd = FindWindow(NULL, "чужая прога"); //тут хэндл программы hWnd = FindWindowEx(hWnd, NULL, "#32770", NULL); hWnd = FindWindowEx(hWnd, NULL, "SysListView32", NULL); //а вот тут хэндл этого листбокса i = (int) SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&lvi); //на этой строке чужая прога вылетает с "Память не может быть read" Что только уже не пробовал. Но хэндл есть, т.к. некоторые другие сообщения, которые я передаю ему, работают корректно. Вобщем, что за трабла, и как её решить? Подозреваю, что я что-то не так сделал в структуре LVITEM. Пишу на C++, но WinApi
дело не в структуре, при посылке сообщения Code: i = (int) SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&lvi); &lvi указывает на структуру, находящуюся в адресном пространстве вашей программы; когда чужая программа получает данный указатель, то она будет обрабатывать его (считывать/записывать данные) относительно своего адресного пространства, а такого адреса, в зависимости от ситуации, в адресном пространстве чужой программы может и не быть, поэтому и выскакивает такая ошибка
Нет, программа обрабатывает его относительно МОЕЙ программы и передает данные именно туда. Возьмем банальный WM_GETTEXT: Code: char mChar[1]; SendMessage(hWnd, WM_GETTEXT, 1 + 1, (LPARAM)&mChar); Данный код возьмет 1 символ из текста handle, и запишет его в переменную МОЕЙ программы. Только что проверил, все работает. Проблема остается открытой...
А нахера ты передаешь адрес адреса? Тамже русским языком написано (LPARAM) (LPLVITEM) pitem pitem - Pointer to an LVITEM structure that specifies the information to retrieve and receives information about the list-view item. Так что передавай сразу указатель на структуру
Аналогично - "Память не может быть read" С той же ошибкой вылетает прога при след. коде: Code: ListView_GetItem(hWnd, lvi); и Code: ListView_GetItem(hWnd, &lvi);