Windows 환경에서 PHP를 사용할 일이 생겨서 생활코딩(http://opentutorials.org/course/62/5103)을 보고 Windows에 Apacahe + PHP + Mysql을 설치했다. 알아서 다 설치해주니까 편했지만(근데 이거 CakePHP나 CodeIgniter같은 화석 프레임워크는 왜 끼워서 설치하는지..) 모듈때문에 고민을 좀 했다. PHP의 LDAP 모듈을 따로 깔아야 하나? 하고 고민하다가, 에라 모르겠다 하고 그냥 활성화만 시켰는데 다행히 모듈도 같이 설치되었는지 잘 된다! ㅎㅎ

php.ini (위의 링크와 같이 설치했다면 C:/Bitnami/wampstack-5.4.39-0/php/php.ini) 수정
*주의: 관리자 권한을 가진 메모장으로 수정해야 저장이 됩니다.*

extension=php_intl.dll
extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
extension=php_ldap.dll
extension=php_mbstring.dll
;extension=php_exif.dll ; Must be after mbstring as it depends on it

그러니까, 앞의 세미콜론 하나만 지우면 된단겁니다! 주석만 풀어주면 바로 적용되는거죠 :D

*References:

가끔 다른 프로세스의 SysListView32를 읽고싶을 때가 있다.
그런데 막상 해보니까 쉬울줄 알았던 일이 잘 안돼서 고생을 좀 하다가.. 검색을 통해 해결했다.
우선 다음과 같은 코드를 생각해보자.
#define WIN32_LEAN_AND_MEAN // compile faster
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <commctrl.h>

const int COLS(5), SZBUF(512);
int main(void)
{
	setlocale(LC_ALL, ""); // 한글 출력을 위해 기본 로케일 설정.
	HWND hParent = FindWindow(NULL, L"SW 찾기");
	HWND hListView = FindWindowEx(hParent, NULL, L"SysListView32", NULL);

	int numItems=(int)SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);

	LVITEM lvi;
	wchar_t subItems[COLS][SZBUF] = {};

	lvi.cchTextMax=SZBUF; // 텍스트 버퍼 사이즈를 설정

	for(int i = 0; i < numItems; i++) {
		for (int j = 0; j < COLS; j++) {
			// j번째 column의 값을 얻는다.
			lvi.iSubItem = j;
			lvi.pszText = subItems[j];
			wcscpy(subItems[j], L"끼야아앙");
			SendMessage(hListView, LVM_GETITEMTEXTW, (WPARAM)i, (LPARAM)&lvi);
			printf("%s%ls", j > 0 ? ";" : "", subItems[j]);
			// column1;column2;column3 형식으로 한 줄씩 출력.
		}
		puts("");
	}

	return 0;
}

완벽해보이...지만 실행해보면?

 C:\>a.exe
 끼야아앙;끼야아앙;끼야아앙;끼야아앙;끼야아앙
 끼야아앙;끼야아앙;끼야아앙;끼야아앙;끼야아앙
 C:\>

실제로 버퍼에 아무것도 쓰이지 않은 것을 확인할 수 있다.
원인이 뭘까 고민해보다가 reference에서 그 답을 찾았다.
요약하자면 "ListView를 가진 프로세스는 a.exe의 메모리에 접근 권한이 없음!" 이라고..
그러므로 일단 ListView를 가진 프로세스에 메모리를 할당하고,
우리는 ReadProcessMemory/WriteProcessMemory를 이용해서 해당 메모리에 접근하면 된다.
덕분에 코드는 더 지저분해졌지만, 어쨌든 돌아는 간다 :D

최종 결과물

#define WIN32_LEAN_AND_MEAN // compile faster
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <commctrl.h>

const int COLS(5), SZBUF(512);
int main(void)
{
	setlocale(LC_ALL, ""); // 한글 출력을 위해 기본 로케일 설정.
	HWND hParent = FindWindow(NULL, L"SW 찾기");
	HWND hListView = FindWindowEx(hParent, NULL, L"SysListView32", NULL);

	int numItems=(int)SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);

	LVITEM lvi, *_lvi = NULL;
	wchar_t subItems[COLS][SZBUF] = {};
	wchar_t *_subItems[COLS] = {};
	unsigned long pid = -1;
	HANDLE process = NULL;
	
	// hWnd로부터 pid를 얻는다.
	GetWindowThreadProcessId(hListView, &pid);
	// 해당 pid를 가진 프로세스에 대해 VM조작 권한을 얻는다.
	process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
		PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

	_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
		MEM_COMMIT, PAGE_READWRITE);
	// ListView를 가지고 있는 프로세스에 LVITEM 메모리를 할당한다.

	for (int i = 0; i < COLS; i++) {
		_subItems[i]=(wchar_t*)VirtualAllocEx(process, NULL,
							SZBUF * sizeof(wchar_t),
							MEM_COMMIT,
							PAGE_READWRITE);
		// ListView를 가지고 있는 프로세스에 wchar[] 메모리를 할당한다.
	}

	lvi.cchTextMax=SZBUF; // 텍스트 버퍼 사이즈를 설정

	for(int i = 0; i < numItems; i++) {
		for (int j = 0; j < COLS; j++) {
			// j번째 column의 값을 얻는다.
			lvi.iSubItem = j;
			lvi.pszText = _subItems[j];
			// 반환되는 텍스트는 타겟 프로세스의 wchar[] 버퍼에 써진다.
			WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
			// 타겟 프로세스의 LVITEM에 lvi의 설정값을 쓴다(복사).
			SendMessage(hListView, LVM_GETITEMTEXTW, (WPARAM)i, (LPARAM)_lvi);
			ReadProcessMemory(process, _subItems[j], subItems[j], SZBUF, NULL);
			// 타겟 프로세스의 wchar[] 버퍼를 읽는다.
			printf("%s%ls", j > 0 ? ";" : "", subItems[j]);
			// column1;column2;column3 형식으로 한 줄씩 출력.
		}
		puts("");
	}

	// 타겟 프로세스에 할당한 메모리를 해제한다.
	VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
	for (int j = 0; j < COLS; j++) {
		VirtualFreeEx(process, _subItems[j], 0, MEM_RELEASE);
	}

	return 0;
}


'Computer' 카테고리의 다른 글

[Fedora] OpenVAS 설치  (0) 2015.04.22
Windows에서 PHP LDAP 이용하기  (0) 2015.04.08
img2term: 터미널에서 이미지 보기  (0) 2015.03.24
[Ubuntu] 유저에게 sudo 권한 주기.  (0) 2015.03.13
Advices for applying machine learning.  (0) 2015.03.11

https://github.com/kcy1019/img2term

GIF(애니메이션 포함!), PNG, JPG 등등을 지원합니다(ImageMagickncurses를 이용했습니다).

make 후 ./img2term <그림파일경로>를 입력하면 ㅇㅋ! *경로 자리에 웹주소를 입력해도 됩니다.