Study - Programming/C/C++2009. 2. 4. 08:38
BOOL CreateProcess(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

MSDN 참고 주소 : http://msdn.microsoft.com/en-us/library/ms682425.aspx (닷넷 기준이라 조금 모양이 다릅니다.)

자식 프로세스를 생성한다. 이때 이 함수를 호출한 프로세스는 부모 프로세스(Parent Process), 함수 호출로 생성된 프로세스를 자식 프로세스(Child Process)라고 한다.


  LPCTSTR lpApplicationName : 생성할 프로세스의 실행파일 이름.
  LPTSTR lpCommandLine : 생성할 프로세스의 파라미터 문자열

  LPSECURITY_ATTRIBUTES lpProcessAttributes : 프로세스의 보안 속성
  LPSECURITY_ATTRIBUTES lpThreadAttributes : 스레드를 전달할 경우 보안 속성
  BOOL bInheritHandles : 자식프로세스의 부모 프로세스의 핸들 소유 여부
  DWORD dwCreationFlags : 생성하는 프로세스의 프로세스 특성
  LPVOID lpEnvironment : 프로세스가 실행헤 필요한 문자열 저장. Enviroment Block 지정
  LPCTSTR lpCurrentDirectory : 자식 프로세스의 현재 디렉터리 설정
  LPSTARTUPINFO lpStartupInfo : 자식 프로세스의 속성이 담긴 구조체의 주소값
  LPPROCESS_INFORMATION lpProcessInformation : 자식 프로세스의 정보를 저장할 구조체 주소값


그리고 다음은 LPSTARTUPINFO의 구조이다.

typedef struct _STARTUPINFO {
  DWORD  cb;
  LPTSTR lpReserved;
  LPTSTR lpDesktop;
  LPTSTR lpTitle;
  DWORD  dwX;
  DWORD  dwY;
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute;
  DWORD  dwFlags;
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFO,
*LPSTARTUPINFO;

특별히 중요한 요소가 있다기보다는 이런게 있다라는 전체적인 것을 아는 것이 좋다. 자세한 것은 MSDN(http://msdn.microsoft.com/en-us/library/ms686331(VS.85).aspx) 을 참조하자.

다음은 LPPROCESS_INFORMATION 의 구조이다.
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId; } PROCESS_INFORMATION,
*LPPROCESS_INFORMATION;
자세한 사항은 좀 더 공부를 해 보아야겠다.

그리고 주의해야 할 점이 유니코드 기반에서 함수 실행 시 lpCommandLine인자에 바로 _T("abc.exe")형식으로 문자열을 넣으면 런타임에러가 난다. 함수 내부적으로 문자열에 변화를 가하기 때문이라고 한다. 그러므로 넘길때는 반드시 따로 문자열 변수를 만들어 넘기자.



Posted by 머리
Study - Programming/C/C++2008. 6. 8. 02:32
음.. 근무할 때 핑 테스트한다고 창을 열댓개를 띄워 놓고 그러니까

작업 표시줄이 너무 복잡하더라

그래서 어떻게 할 방법이 없을까 생각하다가 아예 실행 중인 프로그램을 관리하는 프로그램을 만들자고 생각해서 만들어 보았다
사용자 삽입 이미지

생각보다 간단히 만들 수 있었다.

Find Windows를 클릭하면 실행중인 프로그램이 목록으로 뜨고 Show/Hide를 조정할 수 있다.

휴가 와서 이거랑 비트맵 깔짝대는거 한다고 하루는 사용한 것 같다.

아 내일 가는구나.. 기분이 착찹하다... 일단은 핵심 소스만

   i = SendMessage(hList,LB_GETCURSEL,0,0);
   SendMessage(hList,LB_GETTEXT,i,(LPARAM)str);
   tempHwnd = FindWindow(NULL,str);
   ShowWindow(tempHwnd,SW_SHOW);
Posted by 머리
나의 이야기/Note2007. 11. 10. 01:01
  지금 내가 공부 하고 있는 언어들을 한번 세어 보면

1. C
2. C++
3. JAVA
4. C#
5. VB.NET
6. Delphi

  여기에 세부 분야까지 넣어 보면
1. API
2. MFC
3. TCP/IP

  뭐 이정도. 문제는 이런 것들을 그냥 배워 보고 싶다는 생각에 건드려만 본다는 것이다. C/C++이야 항상 만지고 있는 거니 예외라 치고, 델파이는 거의 안하니 제외 해도 너무 하려고 하는게 많다. 특히 C#이랑 JAVA는 의욕에 비해 하는게 너무 없는듯하다.

  지금 생각은 이렇다. 한 두가지 정도만 집중할것이냐 조금만 더 힘낼 것이냐. 솔직히 말해서 조금 버겁긴 하지만 그렇다고 못하겠는건 아니다. 그냥 진도가 너무 안나가는 것에 대한 불안감?

  그래도 대학 와서 내가 이쪽 분야 그동안 공부했던것과 비교해 본다면 결코 무리라는 생각은 안든다. 다만 걱정되는건 어린 시절 근 10년간 VB를 파 오면서 너무 공부하기에는 어렸었다는 것도 있었겠지만 여러가지를 많이 해보고 싶어서 이것 저것 해보다가 어중간하게 얕고 넓게(?) 익히게 되어서 그게 반복되지 않을까 신경쓰인다.

  1월 안에는 윈어플 큰거 하나 짜놓고 가긴 가야 하는데.. 제일 승산 있는게 무엇일까? 제일 승산있는건 MFC나 C#쪽인데.. 아무래도 최근에 새로 배우는 언어는 C#이 제일 무난하게 나가고 있어 조금만 더 하면 윈폼 시작할것이니. 아니면 지금 텀 프로젝트한다고 공부중인 MFC도 요즘들어 뭔가 감이 잡혀가기 시작해서 조금만 더 노력하면 속도가 붙을 것 같은데..

  이렇게 해봐야 겠다. JAVA로는 뭐 만드는건 잠시 미루되 꾸준히 공부는 하고 MFC는 텀에 충실하되 실력이 늘 수 있게, 그리고 C#으로는 뭘 만들도록 주로 공부해 봐야지. 이렇게 실천할수 있으면 얼마나 좋아.
Posted by 머리
Study - Programming/C/C++2007. 10. 5. 03:01
  흠.. 학교 친구들이 선대 시간에 매트랩으로 확률을 이용하여 원주율을 구하고 그 그래프를 그려 보라는 숙제를 하도 많이 물어보더라. 나는 매트랩도 할줄 모르는데..

  그래도 괜찮은 주제다 싶어서 C 콘솔 버전이랑 API 사용해서 한번 만들어 봤다. 일단 Test Case 의 수 입력받고 하는건 다 생략하고(콘솔은 가능), 랜덤하게 좌표를 찍어 내어 그게 사분원(부채꼴) 안에 들어가는 경우의 수를 계산해 내어 pi를 구하는 방식이다.

Number of Test Case = n
Number of Point in Circle = C

(pi * r^2 / 4) / r^2 = C/n
pi/4 = C/n

pi = 4 * C/n

이렇게. 하다보니 콘솔은 그렇게 문제가 아닌데 API를 하도 오랫만에 해서 GDI 새로 공부하고 한다고 시간 다 보냈다. 11시쯤에 시작했는데 끝내니 2시 반.. 뭐 암튼 좋은 공부 되었다.
사용자 삽입 이미지
콘솔 버전
invalid-file

원주율 구하기 콘솔버전


사용자 삽입 이미지

윈도우 버전
Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:23
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 int i;
 switch (iMessage)
 {
 case WM_CREATE:
  SetTimer(hWnd,1,50,NULL);
  return 0;
 case WM_TIMER:
  hdc = GetDC(hWnd);
  for(i = 0 ;i <1000; i++)
  {
   SetPixel(hdc,rand()%500,rand()%400,RGB(rand()%256,rand()%256,rand()%256));
  }
  return 0;
 case WM_LBUTTONDOWN:
  hdc = GetDC(hWnd);
  Ellipse(hdc,LOWORD(lParam)-10,HIWORD(lParam)-10,LOWORD(lParam)+10,HIWORD(lParam)+10);
  ReleaseDC(hWnd,hdc);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:19

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static BOOL isDown = FALSE;

 static int oldx;
 static int oldy;

 switch (iMessage)
 {
 case WM_LBUTTONDOWN:
  oldx = LOWORD(lParam);
  oldy = HIWORD(lParam);
  isDown = TRUE;
  return 0;
 case WM_LBUTTONUP:
  isDown = FALSE;
  return 0;
 case WM_MOUSEMOVE:
  if(isDown == TRUE)
  {
   hdc = GetDC(hWnd);
   MoveTo!Ex(hdc,oldx,oldy,NULL);
   oldx = LOWORD(lParam);
   oldy = HIWORD(lParam);
   LineTo(hdc,oldx,oldy);
   ReleaseDC(hWnd,hdc);
  }
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


별것 없다. 마우스로 드로잉 하는 예제


우선 WM_LBUTTONDOWN 메세지가 호출되면 oldx,oldy에 좌표가 저장되고, WM_MOUSEMOVE메세지에서 마우스가 움직일때마다 좌표를 읽는다. 그래서 oldx,oldy에서 마우스 위치까지 선을 그려내면 된다.


Posted by 머리