16,548
社区成员




typedef struct tagMYLVCOLUMN
{
LVCOLUMN oldCol;
char text[80];
} MYLVCOLUMN, FAR* LPMYLVCOLUMN;
//
LPMYLVCOLUMN CRemoteListCtrlDlg::RemoteLVGetColumn(HWND hLvWnd)
{// GetItemCount
m_hHdWnd=ListView_GetHeader(m_hLvWnd);
int nColumn=::SendMessage(m_hHdWnd,HDM_GETITEMCOUNT,0,0);
// afxDump << nColumn << "\n";
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(m_hLvWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
LPMYLVCOLUMN pRemoteCol = (LPMYLVCOLUMN)VirtualAllocEx(hProcess, NULL, nColumn*sizeof(MYLVCOLUMN), MEM_COMMIT, PAGE_READWRITE);
if (!pRemoteCol)
{
::MessageBox(NULL, "无法分配内存!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// local
LPMYLVCOLUMN pLocalCol=new MYLVCOLUMN[nColumn];
memset(pLocalCol,0,nColumn*sizeof(MYLVCOLUMN));
for(int i=0; i<nColumn; i++)
{
pLocalCol[i].oldCol.mask=LVCF_FMT | LVCF_TEXT | LVCF_WIDTH ;//| LVCF_SUBITEM;
pLocalCol[i].oldCol.cchTextMax=80;
pLocalCol[i].oldCol.pszText=pRemoteCol[i].text;// not pLocalCol[i].text
if(!WriteProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "WriteProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
ListView_GetColumn(m_hLvWnd,i,&pRemoteCol[i]);
// ::SendMessage(m_hLvWnd, LVM_GETCOLUMN, (WPARAM)i, (LPARAM)&pRemoteCol[i]);
if(!ReadProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "ReadProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// !!!
pLocalCol[i].oldCol.pszText=pLocalCol[i].text;
// afxDump << pLocalCol[i].text << "\n";
}
//释放内存
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pRemoteCol , 0, MEM_RELEASE);
return pLocalCol;
}