windows - программисты, отзовитесь...

 

друзья, работаю с чужим приложением, у которого

SysListView32 control имеет стиль LVS_OWNERDATA, то есть является  virtual ListView.

речь идет об организации списка открытых позиций в МТ5.

но хоть ты тресни не получается прочитать текст из  SysListView32 control, читаю в  DLL

таким вот макаром, h_SysListView32 - это handle для SysListView32, проверил с помощью установки item в состояние SELECTED, t_LVtext - чтение сюда, всегда пусто

        NMLVCACHEHINT k_NMLVCACHEHINT;
        memset(&k_NMLVCACHEHINT,0,sizeof(k_NMLVCACHEHINT));
        k_NMLVCACHEHINT.hdr.hwndFrom = h_SysListView32;
        k_NMLVCACHEHINT.hdr.idFrom   = GetDlgCtrlID(h_SysListView32);
        k_NMLVCACHEHINT.hdr.code     = LVN_ODCACHEHINT;
        k_NMLVCACHEHINT.iFrom     = 0;
        k_NMLVCACHEHINT.iTo       = 3;
        SendMessage(GetParent(h_SysListView32),WM_NOTIFY,(WPARAM)k_NMLVCACHEHINT.hdr.idFrom,(LPARAM)&k_NMLVCACHEHINT);

        TCHAR  t_LVtext[200];
        int    i_LVtextMax = 200;

        NMLVDISPINFO k_NMLVDISPINFO;

        memset(&k_NMLVDISPINFO,0,sizeof(k_NMLVDISPINFO));
        memset(t_LVtext,0,sizeof(t_LVtext));
        wcscpy(t_LVtext,TEXT("Initialcontent ")); 

        k_NMLVDISPINFO.hdr.hwndFrom = h_SysListView32;
        k_NMLVDISPINFO.hdr.idFrom   = GetDlgCtrlID(h_SysListView32);
        k_NMLVDISPINFO.hdr.code     = LVN_GETDISPINFO;

        k_NMLVDISPINFO.item.mask       = LVIF_TEXT;
        k_NMLVDISPINFO.item.state      = 0;
        k_NMLVDISPINFO.item.stateMask  = 0;
        k_NMLVDISPINFO.item.pszText    = (LPTSTR)t_LVtext;
        k_NMLVDISPINFO.item.cchTextMax = i_LVtextMax;

        k_NMLVDISPINFO.item.iItem    = 2;
        k_NMLVDISPINFO.item.iSubItem = 1;

        ListView_SetItemState(h_SysListView32, -1, 0, LVIS_SELECTED); // deselect all items
        SendMessage(h_SysListView32,LVM_ENSUREVISIBLE,(WPARAM)k_NMLVDISPINFO.item.iItem,FALSE); // if item is far, scroll to it
        ListView_SetItemState(h_SysListView32,k_NMLVDISPINFO.item.iItem,LVIS_SELECTED,LVIS_SELECTED); // select item
        ListView_SetItemState(h_SysListView32,k_NMLVDISPINFO.item.iItem,LVIS_FOCUSED,LVIS_FOCUSED); // optional

        wcscpy(pt_Result,TEXT("<iItem,iSubItem> = ")); 

        SendMessage(GetParent(h_SysListView32),WM_NOTIFY,(WPARAM)k_NMLVDISPINFO.hdr.idFrom,(LPARAM)&k_NMLVDISPINFO);
        wcscat(pt_Result,t_LVtext);
        SendMessage(GetParent(h_SysListView32),WM_NOTIFY,(WPARAM)LVN_GETDISPINFO,(LPARAM)&k_NMLVDISPINFO);
        wcscat(pt_Result,t_LVtext);
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Denis Sartakov:

друзья, работаю с чужим приложением, у которого

SysListView32 control имеет стиль LVS_OWNERDATA, то есть является  virtual ListView.

речь идет об организации списка открытых позиций в МТ5.

но хоть ты тресни не получается прочитать текст из  SysListView32 control, читаю в  DLL

таким вот макаром, h_SysListView32 - это handle для SysListView32, проверил с помощью установки item в состояние SELECTED, t_LVtext - чтение сюда, всегда пусто

Мы же уже обсуждали это. Чаще всего у таких контролов (с Owner data) данные находятся в виртуальном списке, а не в самом контроле. Так что напрямую никак. Разве что распознаванием символов заниматься...

 
Ihor Herasko:

Мы же уже обсуждали это. Чаще всего у таких контролов (с Owner data) данные находятся в виртуальном списке, а не в самом контроле. Так что напрямую никак. Разве что распознаванием символов заниматься...

все правильно, практически все данные находятся в виртуальном списке у родителя,

но мы имеем штатные возможности попросить родителя поделится данными.

мы можем это сделать послав родителю WM_NOTIFY предоставив ему буфер, в который пишем чего мы от родителя хотим,

и в который родитель возвращает нам нужную инфу:

Virtual List-View Style

A virtual list view is a list-view control that has the LVS_OWNERDATA style. This style enables the control to handle millions of items because the owner receives the burden of managing item data. This allows you to use the virtual list-view control with large databases of information, where specific methods of data access are already in place.

A virtual list-view control maintains very little item information itself. Except for the item selection and focus information, the owner of the control must manage all item information. Other processes request item information from the owner by using LVN_GETDISPINFO notification codes.

Because this type of list control is intended for large data sets, it is recommended that you cache requested item data to improve retrieval performance. The list view provides a cache-hinting mechanism to assist in optimizing the cache. The hint is implemented in the form of an LVN_ODCACHEHINT notification code.

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774818(v=vs.85).aspx

LVN_GETDISPINFO notification code (Windows)
  • msdn.microsoft.com
Sent by a list-view control to its parent window. It is a request for the parent window to provide information needed to display or sort a list-view item. This notification code is sent in the form of a WM_NOTIFY message. Parameters lParam Pointer to an NMLVDISPINFO structure. On input, the LVITEM structure contained in this structure...
 

> работаю с чужим приложением

Из другого процесса данные просто так в лоб выцепить нельзя. Работают только вызовы GetWindowText для главных окон приложения, которые отображаются в таскбаре, если я не ошибаюсь. Всё остальное требует спец. приёмов. Копайте dll injection в книге Рихтера.

 
SeriousRacoon:

> работаю с чужим приложением

Из другого процесса данные просто так в лоб выцепить нельзя. Работают только вызовы GetWindowText для главных окон приложения, которые отображаются в таскбаре, если я не ошибаюсь. Всё остальное требует спец. приёмов. Копайте dll injection в книге Рихтера.

само собой, но у меня DLL, которая является собственно частью приложения МТ5,

injection я как раз и сделал...

эта DLL вызывается из ЕА

 
Denis Sartakov:

само собой, но у меня DLL, которая является собственно частью приложения МТ5,

injection я как раз и сделал...

эта DLL вызывается из ЕА

Т.е. чужое приложение, из которого вы пытаетесь достать строки - это сам МТ, в контексте которого в итоге оказывается длл? тогда должно работать, по идее. Кстати, сабайтемы нумеруются с нуля, k_NMLVDISPINFO.item.iSubItem = 1; - это так и задумывалось?
 
SeriousRacoon:
Т.е. чужое приложение, из которого вы пытаетесь достать строки - это сам МТ, в контексте которого в итоге оказывается длл? тогда должно работать, по идее. Кстати, сабайтемы нумеруются с нуля, k_NMLVDISPINFO.item.iSubItem = 1; - это так и задумывалось?

ну, да, это так, просто пощупать пока...

но вот не работает, здесь t_LVtext  всегда пусто...

 
Denis Sartakov:

ну, да, это так, просто пощупать пока...

но вот не работает, здесь t_LVtext  всегда пусто...

А что по адресу k_NMLVDISPINFO.item.pszText после вызова? Ибо "You can either copy text to the buffer or assign the address of a string to the pszText member".

 
SeriousRacoon:

А что по адресу k_NMLVDISPINFO.item.pszText после вызова? Ибо "You can either copy text to the buffer or assign the address of a string to the pszText member".

k_NMLVDISPINFO.item.pszText  - это указатель на мой буфер:

k_NMLVDISPINFO.item.pszText -> t_LVtext ,

родитель должен писать в этот буфер t_LVtext  то что я попросил

 
Denis Sartakov:

k_NMLVDISPINFO.item.pszText  - это указатель на мой буфер:

k_NMLVDISPINFO.item.pszText -> t_LVtext ,

родитель должен писать в этот буфер t_LVtext  то что я попросил

Нет. Родитель может заменить адрес в pszText на свой буфер, я же привёл выдержку из мсдн.
 
SeriousRacoon:
Нет. Родитель может заменить адрес в pszText на свой буфер, я же привёл выдержку из мсдн.

да, нет. тут речь о другом

- если ты хочешь, что-то передать родителю, ты пишешь в этот буфер нужную инфу,

- если хочешь принять что-то от родителя, то читаешь из этого буфера.

речь не идет о том что родитель может заменить адрес

Причина обращения: