블로그 이미지
훅크선장

카테고리

분류 전체보기 (362)
사진이야기 (23)
펭귄컴퓨팅 (121)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
C언어, C++ 과 Visual C+.. (12)
C# .net (1)
Delphi (40)
Python (5)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

공지사항

태그목록

최근에 올라온 글

Linux 에서는 /proc 구조를 뒤져서 알아낼 수 있고,
Windows에서도 비슷하게 프로세스들을 일일히 뒤져서 알아낸다.


#include <stdio.h>
#include <dirent.h>
#include <string.h>

unsigned int getProcessID(char *p_processname) {
DIR *dir_p;
struct dirent *dir_entry_p;
char dir_name[40]; // ??? buffer overrun potential
char target_name[252];  // ??? buffer overrun potential
int target_result;
char exe_link[252];
int errorcount;
int result;

errorcount=0;
result=0;
dir_p = opendir("/proc/"); // Open /proc/ directory
while(NULL != (dir_entry_p = readdir(dir_p))) { // Reading /proc/ entries
if (strspn(dir_entry_p->d_name, "0123456789") == strlen(dir_entry_p->d_name)) { // Checking for numbered directories 
strcpy(dir_name, "/proc/");
strcat(dir_name, dir_entry_p->d_name);
strcat(dir_name, "/"); // Obtaining the full-path eg: /proc/24657/ 
exe_link[0] = 0;
strcat(exe_link, dir_name);
strcat(exe_link, "exe"); // Getting the full-path of that exe link
target_result = readlink(exe_link, target_name, sizeof(target_name)-1); // Getting the target of the exe ie to which binary it points to
if (target_result > 0) {
target_name[target_result] = 0;
if (strstr(target_name, p_processname) != NULL) { // Searching for process name in the target name -- ??? could be a better search !!!
result = atoi(dir_entry_p->d_name);
printf("getProcessID(%s) :Found. id = %d\n", p_processname, result);
closedir(dir_p);
return result;
}
}
}
}
closedir(dir_p);
printf("getProcessID(%s) : id = 0 (could not find process)\n", p_processname);
return result;
}


#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>
#include "psapi.h"

DWORD GetProcessByFileName(char* name){
    DWORD process_id_array[1024];
    DWORD bytes_returned;
    DWORD num_processes;
    HANDLE hProcess;
    char image_name[256];
    char buffer[256];
int i;
    DWORD exitcode;
    EnumProcesses(process_id_array, 256*sizeof(DWORD), &bytes_returned);
    num_processes = (bytes_returned/sizeof(DWORD));
    for (i = 0; i < num_processes; i++) {
        hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,process_id_array[i]);
        if(GetModuleBaseName(hProcess,0,image_name,256)){
            if(!stricmp(image_name,name)){
                CloseHandle(hProcess);
                return process_id_array[i];
            }
        }
        CloseHandle(hProcess);
    }
    return 0;
}
void __cdecl main(int argc, char *argv[])
{
DWORD dwPID;
dwPID = GetProcessByFileName("calc.exe");
printf("%lu", (unsigned long)dwPID);
return;
}

Posted by 훅크선장
, |
Visual C++에서는  UNIX에서 제공하는 getopt() 함수가 없습니다.

그런 경우, 간단하게 인자 처리를 하고 싶으면 다음과 같이 합니다.

 char *pszFolder;
 char *pszDLLName;
 bool bUninstall;

 int arg = 1;
 for (; arg < argc && (argv[arg][0] == '-' || argv[arg][0] == '/'); arg++) 
 {
  CHAR *argn = argv[arg] + 1;
  CHAR *argp = argn;
  while (*argp && *argp != ':')
   argp++;
  if (*argp == ':')
   *argp++ = '\0';

  switch (argn[0]) {
  case 'd':                                     // 설치 폴더
  case 'D':
   pszFolder = argp;
   break;

  case 'f':                                     // dll 이름
  case 'F':
   pszDllName = argp;
   break;

  case 'u':
  case 'U':
   bUninstall = TRUE; 
//    RemoveRasAdmin(); 
//    return 0; 
   break; 

  default:
   printf("%s Bad argument: %s\n", argv[0], argv[arg]);
//   Usage( argv[0] ); 
   break;
  }
 }

argp 가 실제 처리된 인자입니다. (당근, 문자열이죠.)

인자사용은
프로그램명   -d:/abc/efg/  -f:who.dll  -u

원본 getopt와는 다르게, 옵션문자뒤에 세미콜론 : 이 있어야합니다. 주의~.
Posted by 훅크선장
, |
str 표준함수 중에 strtoul() 을 사용하면 됩니다.
atoi() 함수는 정수형 int로 바꾸기 때문에, 범위에 한계가 있다고 합니다.

10진수 경우,
#include <stdlib.h>

const char *str = "1234567890";

char *endptr = NULL;

unsigned long value = strtoul( str, &endptr, 10);

16진수 경우,
#include <stdlib.h>

const char *str = "B8000";

char *endptr = NULL;

unsigned long value = strtoul( str, &endptr, 16);

이상입니다.
Posted by 훅크선장
, |
Delphi 를 만지다보니, 자연스레 동일한 비주얼 컴포넌트를 사용할 수 있는 C++ Builder에 관심을 가지게 되었다. (사실 나도 시작은 C/C++ 프로그래머였으니, 당연하지 않겠는가?)

그런데, C++ Builder 2007을 처음 사용해보면서, 아주 간단한 에디트와 버튼 컴포넌트를 가지고, 예제를 테스트해봤는데...

계속 에러가 생기는 것이었다. 예전에 보지 못한 에러라서, 혹시 새로이 설치한 컴포넌트들때문인지 의문이 생겼다. 아니 디폴트 설치하고나서, 처음 만드는 프로젝트인데, 단순한 컴포넌트 2개 쓴 프로젝트가 에러가 생기다니???
이전에는 문제없이 컴파일 되었던 것으로 기억했는데...

약 6시간에 가까운 온갖 방법의 동원과 디버깅을 해보았지만, 전혀 원인을 찾을 수 없었다.
컴포넌트를 제거하고, 라이브러리 경로를 추가하는 등 할 수 있는 것을 다 해보았다.

그리고, 출력되는 에러메시지도 전혀 정보를 주지 않았다.

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Borland.Cpp.Targets(1796,3): error : Fatal: Unable to open file ''

파일을 열수 없다는데, 파일명은 없는 이런 황당한 경우가...
지친 상태에서 야밤에 인터넷을 뒤적거리다보니, 참고될만한 내용이 있었다.



문제는 바로 프로젝트 경로명이었다.

내가 프로젝트를 만든 경로는 
C:\Documents and Settings\HooK\My Documents\RAD Studio\Projects_2007_C++Builder\ex1\
이었는데,
결정적으로 경로명에 "++"가 들어있는 것이 문제를 야기한 것이다.

해결되고보니, 너무 황당한 상황이었다.

C++ Builder 2009에서는 이런 문제가 없는 것 같았는데, 유난히 2007에서만 경로명에 "++" 문자열이 들어가면 안되는 것이었다.

너무 습관에 충실해서 생기는 문제라니... 경로명에는 아무튼 영문자와 _ 문자만 쓰는게 맞을 듯 싶다.
Posted by 훅크선장
, |
str() 계열의 함수나 다른 문자열 클래스를 이용하지 않는,
순수한 문자버퍼의 문자열 split 하는 예제

속도도 빠르고, 알고리즘도 신뢰할 수 있다.
순수 C언어 방신의 Split 방식이다.
----------------------------------------------------------------------------------
 DWORD len = 0, count = 0, line_count = 0 ; // 토큰 길이 변수, 토큰 개수 변수, 전체 행 개수 변수
 char line[LINE_MAX_STRING_LEN] = {0};  // 한 라인 문자열
 char *pLine, *cur_ptr, *start_pos;  // 라인 문자열 포인터,  라인내의 현재위치 포인터, 라인내의 시작위치 포인터
 char ipAddr[20] = {0}; // IP 주소를 담기 위한 문자열
 char url[LINE_MAX_STRING_LEN] = {0}; // URL을 담기 위한 문자열
 
 // 입력 파일 스트림으로 파일 열기
 ifstream logfile("a.txt");
 
 while( logFile.getline( line, LINE_MAX_STRING_LEN, '\n') ) // 각 라인을 읽어서, line 문자열 배열에 저장
 {
  // do something 

  count = 1;  // 토큰 개수 지정, 초기화
  line_count++;  // 전체 행 저장 변수 증가

  if( logFile.fail() == 1 ) // 라인을 읽다가 실패한 경우, 에러 출력  파일내용 삭제
  {
   cout << "Line is too Long.. Just Process " << LINE_MAX_STRING_LEN << "bytes.. (" << line_count << ")" << endl;
   logFile.clear();
  }


  if( line_count % 1000000 == 0 ) // 전체 라인 행수가 100만을 넘을 때마다, 화면에 표시를 해준다.
   cout << "   Now Processing " << line_count << "th line" << endl;

  if( line[0] == '#' ) continue;  // 라인의 첫 시작문자가 # 이면, 건너뛴다.
  
  pLine = line; // 라인 문자열 포인터를 지정한다. 초기화
  cur_ptr = pLine; // 라인 문자열 처음에 현재 위치 포인터를 지정한다. 초기화

  // 라인을 분석하기 시작한다.
  while( *cur_ptr != '\0' && *cur_ptr != '\r' && *cur_ptr != '\n' ) // NULL문자, Carrage-Return문자, New Line 문자가 나올 때까지 루프를 유지한다.
  {
   len = 1;  // 라인 문자열에서 추출되는 토큰 길이를 1로 지정, 초기화 

   // 공백문자는 뛰어넘음
   while( *cur_ptr == ' ' || *cur_ptr == '\t' ) 
   { 
  if( *cur_ptr == '\0' ) break;  // 중간에 NULL 문자가 나오면 루프 종료
    cur_ptr++;
   }

   if( *cur_ptr == '\0' )  // 중간에 NULL 문자가 나오면 루프 종료
    break;

   start_pos = cur_ptr; // 토큰 시작위치를 현재로 설정, 초기화

   // 공백문자가 아닌, 실제 문자에 대해서 문자 개수를 센다.
   while( *cur_ptr != ' ' && *cur_ptr != '\t' && *cur_ptr != '\0' ) { cur_ptr++; len++; }
   
   // 원하는 토큰을 저장한다.
   if( count == gSrcIPIdx ) 
   {
    len = min( len, 18 ); 
    lstrcpyn( ipAddr, start_pos, len ); 
    ipAddr[len] = '\0';
   } else if ( count == gUrlIdx )
   {
    len = min( len, LINE_MAX_STRING_LEN - 2);
    lstrcpyn( url, start_pos, len ); 
    url[len] = '\0';
   }
   count++; // 토큰 개수 증가
  }
}
Posted by 훅크선장
, |
함수로 작성된 string 과 wstring 상호 변환

        std::string wstring2string(std::wstring wstr) {
std::string str(wstr.length(),' ');
copy(wstr.begin(),wstr.end(),str.begin());
return str;
}

std::wstring string2wstring(std::string str) {
std::wstring wstr(str.length(),L' ');
copy(str.begin(),str.end(),wstr.begin());
return wstr;
}

Posted by 훅크선장
, |
http://hugman.tistory.com/entry/C-String-Utilts
-----------------------------------------------

namespace SU   // SU represents 'String Utilities'
{
std::vector<std::string> split(std::string& text, std::string separators )
{
size_t n = text.length();
size_t start, stop;
std::vector<std::string> result;
start = text.find_first_not_of(separators);
while ((start >= 0) && (start < n)) {
stop = text.find_first_of(separators, start);
if ((stop < 0) || (stop > n)) stop = n;
result.push_back(text.substr(start, stop - start));
start = text.find_first_not_of(separators, stop+1);
}
return result;
}
std::string FindAndReplace (const std::string& source, const std::string target, const std::string replacement)
{
std::string str = source;
std::string::size_type pos = 0,  // where we are now
found;   // where the found data is
if (target.size () > 0)  // searching for nothing will cause a loop
{
while ((found = str.find (target, pos)) != std::string::npos)
{
str.replace (found, target.size (), replacement);
pos = found + replacement.size ();
}
}
return str;
};  // end of FindAndReplace

bool IsTherePattern(const std::string source, const std::string pattern)
{
// Source string 에 pattern 이 존재하는지 안하는지 boolean value를 리턴한다.
if( source.find(pattern) != std::string::npos) {  // exist?
return true;
}
else {
return false;
}
}

// Trim related methods
// Refer : http://www.codeproject.com/vcpp/stl/stdstringtrim.asp
// 약간 수정함
std::string TrimStart(std::string str, const char *delims)  // trim delims in the start of string
{
str.erase(0, str.find_first_not_of(delims));
return str;
}

std::string TrimEnd(std::string str, const char *delims)    // trim delims in the end of string
{
str.erase(str.find_last_not_of(delims) + 1);
return str;
}

std::string Trim(std::string str, const char *delims)    // trim delims in the start and end of string
{
str = TrimStart(str, delims); 
str = TrimEnd(str, delims); 
return str;
}

// 소문자 대문자 변환
int ToLower(int c)
{
if(c>='A' && c<='Z') return c-'A'+'a';
else return c;
}

std::string ToLowerStrings(std::string str)
{
std::string result = "";
for(size_t i=0; i < str.length(); i++)
result += ToLower(str[i]);
return result;
}

int ToUpper(int c)
{
if(c>='a' && c<='z') return c-'a'+'A';
else return c;
}

std::string ToUpperStrings(std::string str)
{
std::string result = "";
for(size_t i=0; i <str.length(); i++)
result += ToUpper(str[i]);
return result;
}

#ifdef FOR_WINDOWS_ONLY 
std::string CString2std_string(CString str)
{
return LPSTR(LPCTSTR(str));
}


char* CString2char_pointer(CString str)
{
return LPSTR(LPCTSTR(str));
}

CString GetCurrentPath()
{
HMODULE hModule;
hModule = ::GetModuleHandle(NULL); // handle of current module
ASSERT(hModule != 0);

CString strExeFileName;
VERIFY(::GetModuleFileName(hModule, strExeFileName.GetBuffer(_MAX_PATH), 
_MAX_PATH));
strExeFileName.ReleaseBuffer();

char Drive[_MAX_DRIVE];
char Path[_MAX_PATH];
char Filename[_MAX_FNAME];
char Ext[_MAX_EXT];

// suha, for VC++ 2005, convert to char array from CString
char CharPath[_MAX_PATH]; 
for (int it = 0 ; it < _MAX_PATH ; it++)
{
CharPath[it] = strExeFileName.GetAt(it);
if (CharPath[it] == '\0') break;
}

_splitpath(CharPath, Drive, Path, Filename, Ext);

return CString(Drive)+CString(Path); // has trailing backslash
}
#endif
}
Posted by 훅크선장
, |
C++ 표준 문자열 string 객체를 wchar_t* 타입의 문자열로 바꾸는 함수

wchar_t* string2LPWSTR(const std::string input)
{
// null-call to get the size
size_t needed = ::mbstowcs(NULL,&input[0],input.length());

// allocate
std::wstring output;
output.resize(needed);

// real call
::mbstowcs(&output[0],&input[0],input.length());

// You asked for a pointer
wchar_t *pout = output.c_str();

return pout;
}
Posted by 훅크선장
, |
CString을 특별한 문자열을 기준으로 Split 하는 함수

사용법:  
CstringArray Splitstrings;
int numofsplitedstrings = SplitString(inputstring, L" ", Splitedstrings);

구현:
int SplitString(const CString& strInputString, const CString& strDelimiter, CStringArray& arrStringArray)
{
int iPos = 0;
int newPos = -1;
int sizeS2 = strDelimiter.GetLength();
int isize = strInputString.GetLength();

CArray<INT, int> positions;

newPos = strInputString.Find (strDelimiter, 0);

if( newPos < 0 )
return 0;

int numFound = 0;

while( newPos > iPos )
{
numFound++;
positions.Add(newPos);
iPos = newPos;
newPos = strInputString.Find (strDelimiter, iPos + sizeS2);
}

for( int i=0; i <= positions.GetSize(); i++ )
{
CString s;
if( i == 0 )
s = strInputString.Mid( i, positions[i] );
else
{
int offset = positions[i-1] + sizeS2;
if( offset < isize )
{
if( i == positions.GetSize() )
s = strInputString.Mid(offset);
else if( i > 0 )
s = strInputString.Mid( positions[i-1] + sizeS2, positions[i] - positions[i-1] - sizeS2 );
}
}
arrStringArray.Add(s);
}
return numFound;
}
Posted by 훅크선장
, |
http://www.vanwensveen.nl/rants/microsoft/IhateMS_2.html

마이크로소프트를 싫어하는 이유를 프로그래머적인 입장에서 기술한 내용이다.

아직 다 읽어보지는 못했지만, 매우 타당성이 있어보인다.
Posted by 훅크선장
, |