|
원칙적으로 안됩니다.
왜냐하면 프로세서간에 메모리가 기본적으로 공유되지는 않기때문이죠
대상프로그램의 ListView에서는 LVM_GETITEMTEXT 라는 GetItemText 메세지를 받습니다
하지만
parameter로 넘어온 주소에 해당하는 자신의 메모리 영역에서 access하려고 합니다.
호출한 프로그램의 메모리가 아니라..
대상프로그래에서는 그 영역을 사용하지 않는 영역이라면 access voilation이 나게되고
혹 사용하는 영역이라 하더라도 그영역에 엉뚱한 내용이 쓰려지게 되므로
대상프로그램이 이상하게 돌아갈수가 있겠죠
[방법1]
대상프로그램을 수정할수 있다면?
리스트뷰가 LVM_GETITEMTEXT 를 수신할때 해당 item의 내용을 파일로 기록한다던가...
공유메모리 영역을 만들어(CreateFileMapping) 쓴다던가 하고
호출한곳에서도 파일이나 공유메모리에서 가져오면 됩니다.
기타 프로세서간에 통신하는 여러가지 방법을 이용할수 있죠
[방법2]
대상 프로그램을 수정할수 없다면?
"dll인젝션" 인가? "쓰레드 인젝션" 인가? 뭐 그런것( CreateRemoteThread )을 이용하여
다른 프로세서 안에 쓰레드를 심은 다음
그 쓰레드에서 "방법1" 등을 통해 item의 캡션을 찾아 보내면 됩니다.
[방법3]
대상 프로그램을 수정할수 없는경우?
C++Builder나 Delphi 에서는 디버깅시에 내가 만든 프로그램의 특정 메모리에 내용을 정확하게 가져옵니다.
대상프로그램을 디버깅권한글 가지고 OpenProcess(..ALL_ACCESS..)하여 접근하는 방법도 있을것 같습니다.
이방법은 저도 해보지는 않았습니다. (이론적으로 가능하다는것만..)
[기타]
....
그럼...
김형기 님이 쓰신 글 :
: 다른프로그램의 리스트뷰의 아이템을 가져오고 싶은데...잘 안되네요...
: 리스트뷰의 핸들을 얻은다음 ListView_GetItemText를 이용하여 아이템을 가져오면 될거 같았는데...
: 일단 제가 한 방법은 이렇습니다.
:
: HWND hWndTarget = ::FindWindow(NULL, "targetProgram"); //targetProgram은 대상 프로그램의 캡션(타이틀)입니다.
:
: char szTemp[255] = {0,};
: ListView_GetItemText(GetDlgItem(hWndMain, 1005), 0, 1, szTemp, 255); //1005는 대상 프로그램의 리스트뷰의 ID입니다.(0,1의 아이템의 텍스트를 얻고자 했습니다.)
:
: ShowMessage((String)szTemp); //확인용...
:
: 근데 이 방법으로 대상 프로그램이 같은 프로그램에서는 잘 되는데 대상프로그램이 다른 프로그램에서는 안되네요...
: 다른 프로그램의 리스트뷰의 텍스트를 얻을 방법은 없는것인가요...
: 고수님들 도움 부탁드립니다....(__) 꾸벅...
|