Ctrl-Alt-Delete를 누르면 나타나는 작업관리자 목록에서 원하는 프로그램을 감추는 방법을 소개하겠다. 사실 방법은 매우 간단하지만 잘 알려져 있지 않은듯하다.

Win32 API 중 RegisterServiceProcess()는 커널함수가 있다. 이 함수는 MSDN에서도 문서화되어 있는 함수이지만 일반 API 함수를 사용하듯 호출할 수 없다. 아마 특별한 이유에서 헤더파일에 프로토타입을 빼놓은 듯 한데, GetProcAddress() 함수와 함수포인터를 사용해서 호출할 수 있다. 아래에 리스트된 코드를 보자.

typedef DWORD (WINAPI *LPREGSRVPROC)(DWORD, DWORD); 
void RegisterServiceProcess(DWORD dwProcessId, DWORD dwType) 
HMODULE hMod = GetModuleHandle("kernel32.dll"); 
if(hMod) 
LPREGSRVPROC pfn = (LPREGSRVPROC)GetProcAddress (
hMod, "RegisterServiceProcess"); 

if(NULL != pfn) pfn(dwProcessId, dwType); 

 
dwProcessId : 프로세스 식별자
dwType : 1이면 프로세스를 서비스모드로 등록(작업관리자에 나타나지 않음), 0이면 서비스모드 해제 

Example Borland c code:

//--------------HiddenApp.cpp--------------
#include 
#pragma hdrstop

USERES("HiddenApp.res");
USEFORM("Unit1.cpp",Form1);

typedef DWORD (WINAPI *TRegisterServiceProcess)(DWORD,DWORD);
bool registered=false;

//////////////////////////////////////////////////////////////////////////
void __fastcall reg(bool which) //true=register, false=unregister
{
  HMODULE hmod;
  TRegisterServiceProcess pReg;
  hmod = LoadLibrary("kernel32.dll");

  if (!hmod) return;
  (FARPROC)pReg = (FARPROC)::GetProcAddress(hmod,"RegisterServiceProcess");
  if (!pReg) {FreeLibrary(hmod); return;}
  else 
  {
 if (which)
 pReg(0,1); //unregister our process  
 else
 pReg(0,0);
  }
  registered = true;
  FreeLibrary(hmod);
}
//////////////////////////////////////////////////////////////////////////
WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{  
  try
  {
 reg(true);
 Application->Initialize();
 Application->CreateForm(__classid(TForm1), &Form1);
 Application->Run();
  }
  catch (Exception &exception)
  {
 Application->ShowException(&exception);
  }

  if (registered) reg(false);
  return 0;
}
//--------------eof----------------------------
Posted by 모과이IT
,
** 문자열 처리 함수 **

#include

1) 문자열의 길이 측정(strlen)

strlen(문자열)

2) 문자열 결합(strcat)

char *ptr;
ptr = strcat(문자열, 문자열2)

3) 문자열 비교(strcmp)

int i;
i = strcmp(문자열, 문자열2)
i == 0 <--- 같다.
i != 1 같지 않다.

4) 문자열 복사(strcpy)

char *ptr;
strcpy(문자열, 문자열2)
문자열2를 문자열로 복사 5) 문자열 변환(atoi, atol, atof)

atoi -> 정수
atol -> long
atof -> 부동 소수점.

long b; float c;
int a;

a = atoi("1234" );
b = atol("-544334" );
c = atof("43.5456);

6) 문자열 교환 함수 (str_swap)

void str_cpy(char *ptr1, char *ptr2)
{
while(*ptr2)
*ptr1++ = *ptr2++;
*ptr1 = NULL;

}

void str_swap(char *a, char *b)
{
char temp[255];
str_cpy(temp, a)
str_cpy(a, b);
str_cpy(b, temp);
}
7) 문자열 내에서 특정 문자의 개수를 카운트 하는 함수(char_cnt)

int char_cnt(char *ptr, char ch)
{
int i = 0;

wile(*ptr)
if(*ptr++ == ch)
i++;

return(i);

}  

8) 문자열 내의 특정 문자를 다른 문자로 바꾸는 함수(str_chg)

int str_chg(char *ptr, char ch1, char ch2)
{
while(*ptr)
{
if(*ptr == ch1)
*ptr = ch2;

ptr++;
}
}

9) 문자열 내의 특정 문자를 탐색(str_fine)

char *str_find(char *ptr, char ch)
{
while(*ptr)
{
if(*ptr == ch)
return(ptr);
ptr++;
}

return((char *)(-1));

}

10) 문자열 내의 소문자를 대문자로 바꾸는 함수(str_upp)

void str_upp(char *ptr)
{
while(*ptr)
{
if(islower(*ptr))
*ptr = toupper(*ptr);
ptr++;
}
}

11) 문자열 내의 대문자를 소문자로 바꾸는 함수(str_low)

void str_low(char *ptr)
{
while(*ptr)
{
if(isupper(*ptr))
*ptr = tolower(*ptr);
ptr++;
}
}

12) 대문자와 소문자 상호 교환 함수(str_case)

void str_case(char *ptr)
{
while(*ptr)
{
if(isupper(*ptr))
*ptr = tolower(*ptr);
else if(islower(*ptr)
*ptr = toupper(*ptr);
ptr++;
}
}

13) 각 문장의 첫 문자만 대문자로 교환하는 함수(str_fst)

void str_fst(char *ptr)
{
if(islower(*ptr))
*ptr = toupper(*ptr);

while(*ptr)
{
if(*ptr == '.')
{
ptr++;

while(*ptr == ' ')
ptr++;

if(islower(*ptr))
*ptr = toupper(*ptr);
}

break;
}

ptr++;
}

14) 문자열 내의 지정한 위치에 다른 문자열을 삽입하는 함수(str_ins)

char *str_ins(char ptr1[], char ptr2[],int t)
{
char temp[255];
int i, j, k;

if(t>=str_len(ptr1) return (-1);

for(k=0; i=0; i<t; i++; k++)
temp[k] = ptr1[i];

for(j=0; ptr2[j] != NULL; j++, k++)
temp[k] = ptr2[j];

while(ptr1[i])
temp[k++] = ptr1[i++];
temp[k] = NULL;
}

15) 문자열 앞에 지정한 개수 만큼의 공백을 추가하는 함수(str_blk)

void str_blk(char ptr[], int t)
{
static char temp[255];
int i;

for(i = 0; i<t; i++)
temp[i] = BLANK;

temp[i] = NULL;

str_cat(temp, ptr);

str_cpy(ptr, temp);
}

16) 문자열 내의 모든 공백을 삭제하는 함수(rmv_blk)

void rmv_blk(char ptrp[])
{
char temp[255];
int i, k;

for(i=0, k=0; ptr[i] != NULL; i++)
if(ptr[i] != BLANK)
temp[k++] = ptr[i];

temp[k] = NULL;

str_cpy(ptr, temp);
}

17) 문자열 내에서 원하는 개수 만큼 문자를 삭제하는 함수(str_rmv)

void str_rmv(char *ptr, int loc, int count)
{
int len, i, j;
len = str_len(ptr);

if(loc >= len)
return (-1);

if(loc + count <= len)
{
j = loc + count;

for(i=loc; ptr[j] != 0; i++)
{
ptr[i] = ptr[j];
j++;
}
ptr[i] = NULL
}
else
ptr[loc] = NULL;
}

18) 특정한 문자열이 기억된 위치를 계산하는 함수(str_loc)

int str_loc(char ptr1[], char ptr2[])
{
int i, j, k;
for(i=0; ptr1[i] != NULL; i++)
for(j=i, k=0; ptr2[k] == ptr1[j]; k++, j++)
return (i);
return (-1);
}

19) 특정한 문자열이 나온 개수를 카운트 하는 함수(str_cnt)

int str_cnt(char ptr1[], char ptr2[])
{
int i, j, k;
int count = 0;
for(i=0; ptr1[i] != NULL; i++)
for(j=i, k=0; ptr2[k] == ptr1[j]; k++, j++)
if(ptr2[k+1] == NULL)
{
count++;

break;
}
return ((count == 0) ? -1 : count);
}

'개발지식창고 > C' 카테고리의 다른 글

C 문자열 함수 정리  (0) 2010.09.20
BASE64 Encode/Decode  (0) 2010.09.20
printf 특수문자 출력하기  (0) 2010.08.16
32비트 배열을 이용한 상태값 저장 및 얻어오기  (0) 2010.08.16
[C/C++]#define 매크로 팁  (0) 2010.08.16
Posted by 모과이IT
,
1.요약 

ATL 컴포넌트가 특정 키보드 메세지를 받을 수 있는 방법에 대해서 알아봅니다. 


2.본문 

ATL 컴포넌트를 만들게 되면, 웹브라우저가 키보드 메세지를 (Accelerator Key.. 예를 들어 Tab, Delete 같은 키) 컴포넌트로 보내주지 않습니다. 하지만, 웹브라우저가 노출하는 IOleInPlaceActiveObject 인터페이스의 TtranslateAccelerator 함수를 호출하면 됩니다. 물론 WM_KEYDOWN 메세지 핸들러에서 처리해 주시면 됩니다. 하지만, 간혹 WM_KEYDOWN 메세지가 정상적으로 들어오지 않는 경우가 있는데, 이를 위해서 아래와 같이 메세지 펌프를 조작하면 됩니다. 

3.예제

// 메세지 펌프 

while (GetMessage(&msg, NULL, 0, 0)) 

 TranslateMessage(&msg);


 // Send all keyboard messages to the window of your 

 // application. hwndApp is the window handle of 

 // your application. 

 // 

 if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) 

  ::SendMessage(hwndApp, msg.message, msg.wParam, msg.lParam);


 DispatchMessage(&msg); 

}


// WM_KEYDOWN 메세지 핸들러에서.. 

LRESULT OnKeydown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 

 // m_spWebBrowser is a data member of type IWebBrowser2. 

 // Using CComQIPtr in this way queries m_spWebBrowser 

 // for the IOleInPlaceActiveObject interface which is 

 // then stored in the pIOIPAO variable. 

 // 

 CComQIPtr pIOIPAO(m_spWebBrowser); 

 HRESULT hr = S_FALSE;


 if (pIOIPAO) 

 { 

  MSG msg; msg.message = uMsg; 

  msg.wParam = wParam; 

  msg.lParam = lParam; 

  hr = pIOIPAO->TranslateAccelerator(&msg); 

 } 

 

 return hr; 

}

Posted by 모과이IT
,