запуск терминала с автоматической оптимизацией - страница 4

 
FILE_SHARE_READ в большинстве случаев используется в паре с FILE_SHARE_WRITE. Тогда есть возможность смотреть файл, например в FARе, параллельно с работой советника
 
stringo:
FILE_SHARE_READ в большинстве случаев используется в паре с FILE_SHARE_WRITE. Тогда есть возможность смотреть файл, например в FARе, параллельно с работой советника
Да, это понятно! Thanx!
 
чтение данных из чужого приложения 

---------

DWORD PID;
	PSTR pszText;
	DWORD dwBytesWriten;
 
	LV_ITEM *plviRemoteLVItem = NULL;
	LV_ITEM lviRemoteLVItem;
	char svText[256];
	UINT iMax = 255;
 
	// имена для FincWindow(Ex) поставишь свои, разумеется...
	HWND MDI = FindWindow(0, "Form1");
	if(MDI)
	{
		HWND LABE = FindWindowEx (MDI, 0, "TsShellListView", 0);
		if(LABE)
		{
			// узнаем кол-во строк в SysListView32
			int Items = SendMessage(LABE, LVM_GETITEMCOUNT, 0, 0);
 
			// открываем процесс со всеми правами
			GetWindowThreadProcessId(LABE, &PID);
			HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, PID);
 
			// создаем переменные в другом процессе
			pszText = (PSTR)VirtualAllocEx(ProcessHandle, NULL, iMax,
					MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
			plviRemoteLVItem = (tagLVITEMA *)VirtualAllocEx(ProcessHandle, NULL,
					sizeof(LV_ITEM), MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
 
			// очищаем переменную, через которую будем общаться с чужим ListView
			ZeroMemory(&lviRemoteLVItem, sizeof(LV_ITEM));
 
			// Собственно, идем по строкам ListView
			for (int i = 0; i < Items; i++)
			{
				// Это для записи в наш ListView (я уж не стал извращаться с API, сделал с TListView)
				TListItem *currItem = 0;
 
				// читаем столько столбцов, сколько нужно. Для примера сделал 5...
				for(int j = 0; j < 5; j++)
				{
					lviRemoteLVItem.mask = LVIF_STATE | LVIF_TEXT;
					lviRemoteLVItem.pszText = pszText;
					lviRemoteLVItem.cchTextMax = iMax;
					lviRemoteLVItem.iSubItem = j; // Номер столбца
					lviRemoteLVItem.iItem = i; // Номер строки
 
					// пишем эту переменную в чужой процесс
					if (!WriteProcessMemory(ProcessHandle, plviRemoteLVItem,
							&lviRemoteLVItem, sizeof(LV_ITEM), &dwBytesWriten))
					{
						// Если что - обрабатываем ошибку, не забывай про это,
						// их обработка должна быть везде, где только можно...
						// Я не стал перегружать код проверками, добавишь сам.
						ShowMessage("Error...");
					}
 
					// Отправляем сообщение с указателем на структуру,
					// которая содержит нужные нам параметры
					int nTextLength = SendMessage(LABE, LVM_GETITEMTEXT, i, int(plviRemoteLVItem));
 
					// Читаем результат
					ZeroMemory(&svText, iMax);
					ReadProcessMemory(ProcessHandle, lviRemoteLVItem.pszText,
							&svText, nTextLength, &dwBytesWriten);
 
					// Прочитали, теперь его надо запихать к нам в ListView...
					if(currItem == 0) // Еще не добавили новую строку? Добавляем...
					{
						currItem = ListView1->Items->Add();
						currItem->Caption = svText;
					}
					else // Строка уже добавлена, теперь SubItem-ы
						currItem->SubItems->Add(svText);
				}
			}
 
			// Ну, всё... Можно уходить. Не забываем все почистить:
			// Освобождаем выделенную память
			VirtualFreeEx(ProcessHandle, pszText, 0, MEM_RELEASE);
			VirtualFreeEx(ProcessHandle, plviRemoteLVItem, 0, MEM_RELEASE);
			// Закрываем описатель процесса
			CloseHandle(ProcessHandle);
		} // if LABE
	} // if MDI
Причина обращения: