2009년 6월 23일 화요일

프로세스 실행 경로

프로그램이 실행하는 경로를 찾아온다.

 

프로그램이 실행될때 상대 경로를 사용하게 되면 주 실행되는 프로세스에 해당하는 위치점부터 경로가 시작되게 된다.

 

이때 다른 프로세스가 실행되면 기존에 사용하던 프로세스의 경로를 잃게 된다.

 

프로세스가 실행되는 위치점부터 경로를 찾기 위해 사용한다.

 

TCHAR szBuffer[MAX_PATH];
 int nPathLengh = GetModuleFileName(NULL, szBuffer, MAX_PATH);
 CString strTemp = (LPTSTR)szBuffer;
 int nFindcount = strTemp.ReverseFind('\\');
 strTemp = strTemp.Left(nFindcount+1);

상대 경로로 설정된 파일은

 

파일을 읽고 쓸때 실행되는 프로그램의 경로에 따라 파일을 못찾는 경우가 발생한다.

 

그때는 파일이 위치하고 있는 절대경로로 바꾸어 실행하면 된다.

 

실행중인 프로그램의 절대 경로를 얻는다.

 

 

DWORD GetModuleFileName(
  HMODULE hModuleLPTSTR lpFilenmae,  DWORD nSize

);

 

TCHAR szPath[MAX_PATH]; /// 저장될 파일 경로 (실행된 프로그램의 파일 이름까지 저장)
   
    if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
    {
        printf("GetModuleFileName failed (%d)\n", GetLastError());
        return FALSE;
    }

 

 CString strTemp = (LPTSTR)szPath;

 int nFindcount = strTemp.ReverseFind('\\'); /// 뒤의 마직막에 위치한 파일명까지의 String 수

 strTemp = strTemp.Left(nFindcount+1); /// 왼쪽 부터 짤라내기 (파일 이름 제외)

 

출처 : MSDN 2006, 10


 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

2009년 6월 19일 금요일

.bat 파일 만들기

.bat 파일은 도스상의 명령어를 조합하여 간편이 실행 하도록 만든 배치 파일

 

파일 만들기

1) 파일 이름.bat 파일을 새로 만든다

2) 필요한 명령을 1)에서 만든 파일에 저장한다.

3) 파일 이름.bat 파일을 실행한다.

얼마나 간단한가

 

사용되는 명령어를 간단히 정리하면

@ 이후 내용은 내용 표시 않됨

@echo off : 실행 내용 표시 않됨

@eocho : 실행 내용 표시

 

@Net Use : 네트워크 딜렉토리 설정

연결 예 :  P: IP\D$  /User:사용자ID /Persistent:NO (연결드라이브:연결할 IP와 드라이브 패스워드/사용자  ID /

연결 해제 예 :  P: IP\D$ /delete (연결드라이브:연결한 IP와 드라이브/ 취소)

 

@Path : 환경 설정

@path = %PATH%; 패스경로명 (기존에 있던 패스 실행 후 래로운 패스경로 실행)

 

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

2009년 6월 16일 화요일

drwtsn 닥터와슨 설정

닥터와슨은 셀록홈즈를 따라 다니는 의사의 이름이다.

 

홈즈가 의문의 사건을 해결할때 옆에서 도움도 주고 조언도 해주는 ^^

 

프로그램에도 셀록홈즈의 와슨의사와 같은 역할을 해주는 프로그램이 있다.

 

이프로그램은 exe 파일내용을 검사하여 덤프 또는 오류가 난 펑션이나 파라미터를

 

정리해 파일로 보여준다..

 

약간의 설정만 하면 ^^ 쉽게 사용 가능하다..

 

우선 실행에서 와슨을 실행한다.

 

1. drwtsn32.exe 을 실행

2. 로그파일 경로 및 덤프 경로를 설정한다.

 심폼/스레드 등 선택하고 크래시 덤프 파일을 만든다.

 

3. 실행에서 drwtsn32.exe -i 을 이용하여 설정하면 끝..

 

릴리즈 모드에서도 덤프를 확인 할수 있어서 편하게 확인 할 수 있다.

 

 

 

2009년 6월 12일 금요일

Doxygen 1.5.9 한글 설정

Doxygen 을 한글로 설정하는 방법입니다..

 

기존에 사용하는 1.5.0 또는 1.5.7 버젼은 한글이 잘 나왔는데

 

1.5.9 부터는 한글이 깨지는 경우가 있습니다.

 

기본 설정이 UTF-8 로 되어 있어 그런데요.. UTF-8이 있는 부분을 EUC-KR 로 변환해주면 됩니다.

 

 

1. Export /Project 설정

Doxyfile_encodeing : UTF-8 => EUC-KR 로변경

Output_Language : Korean-en 선택

 

2. Export /Input 설정

Input_Language : EUC-KR 로변경

 

이렇게 설정하면 HTML 로 보는 내용은 한글이 않깨질 꺼여요 ^^

2009년 6월 10일 수요일

2009 부산벡스코 Raillog 물류전

회사 와서 첫번째 출장을 2009년 부산벡스코 Raillog 물류전 (20090203~20090206) 에 갔다왔다.

물론 운영요원으로 갔었다.

 

부산의 벡스코는 서울 코엑스 처럼 전시회 및 행사를 위주로 진행 하는 곳 같았다.

넓은 홀과 지하에 식당까지 ^^ 코엑스보다는 작았지만 쓰임새 있게 만들어 졌다.

 

다만 주변에 아직 공사 하는 곳이 많아 먹고 쉴 만한 곳이 많이 않았다.

 

전철을 타고 해운대 역에서 3정거장 가면 센텀시티라는 역이 있는데 그곳 1번 출구쪽으로 걸어 오면 벡스코로 들어 갈수 있다.

벡스코 전시장 입구

전시장 입구

전시장 입구는 1번 과 2번으로 나뉘어 지는데 1번은 출구 쪽이 가깝고 2번은 입구 쪽이 가깝다. 아침 8시 전에 출근하면서 전경을 찍었다.

 

설치 장비

반송선 PTS

운영 요원으로 가면 조금은 편하게 전시회를 구경할 수 있지 않을 까하는 방심을 했다. 호되게 혼이 났다. 전시회 Open 전에 시스템 점검과 끝나고 마무리 또한 전시회 중간 중간에 문의 사항 대응 ^^ 정말 화장실 갈 시간도 모자를 정도였다.

반송선 PTS

시스템 점검 완료 후

내가 운영 하던 장비가 있던 부스 ^^ Open 하기 직전 한 컷..

반송선 실장비 ^^

 

코레일 부스

코레일 부스 뒷모습

한군데 더 ^^ 회사 장비가 들어가 있는 곳..
KTX 시뮬레이터

벡스코 코레일 전시 시뮬레이터

KTX 시뮬레이터 ^^ 앞으로 내가 만들어야 할것.

코레일에 전시되어 있는 기차.. 생각보다 정교하게 잘 만들어 져있다.

해운대 6월 초의 야경 전시회 끝나고 처음 가는 부산 해운대에서 야경을 보면서

 아직 추운데 사람은 정말 많구나 ^^

마지막 부산을 떠나면서 길고긴 5박 6일의 벡스코 전시회를 떠나면서 역에서 한컷..

 

숙소를 해운대로 잡으면 바다도 구경하고 전시회도 구경하는 좋은 기회가 될거 같다.

 - 참 해운대 숙박비는 이야기 하기 나름인거 같다. 기본 모텔이 4만에서 8만언 수준이고

 - 하급은 3만5천에서 5만언 선

 - 주말에는 만언씩 더받는다고

 

해운대에 가면 해운대 시장 쪽에 꼭 먹어보라는 소고기 국밥이 있다.

전부 원조라고 써있는데 가보면 맛이 비슷비슷하다. 반찬만 틀리게 나온다.

2000 에서 투명 다이얼로그 만들기

Windows2000에서 지원되며, 먼저 아래 방법대로 해보고 안될 경우 MSDN홈페이지에서 최신 SDK를 다운 받으시면
될것입니다.(user32.dll이 최신것이면 될 것 같음)

먼저 필요한 상수들을 정의 하시고,
#define WS_EX_LAYERED 0x00080000
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
#define ULW_COLORKEY 0x00000001
#define ULW_ALPHA 0x00000002
#define ULW_OPAQUE 0x00000004

타입선언,
typedef BOOL(WINAPI *SLWA)(HWND, COLORREF, BYTE, DWORD);
위에서 선언한 함수포인터 타입은 실제 투명 윈도우를 만드는 역할을 하는
SetLayeredWindowAttributes 함수를 user32.dll에서 직접 끄집어내서 사용하기 위해서임

그리고 OnInitDialog()정도에서 아래와 같이 기술합니다.

SLWA pSetLayeredWindowAttributes = NULL;
HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL");
pSetLayeredWindowAttributes=(SLWA)GetProcAddress(hmodUSER32,"SetLayeredWindowAttributes");

HWND hwnd = this->m_hWnd;
SetWindowLong(hwnd, GWL_EXSTYLE,GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
pSetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);

-----------------------------------------

BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);

Requirements
Windows NT/2000: Requires Windows 2000.
Windows 95/98: Unsupported.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib

하도 오래되서 어데서 출처가 어데인지 잊어 버렸네요 ㅡ.ㅡ;;

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

2009년 6월 9일 화요일

DCom 등록하기

Windows 시작 메뉴의 관리도구 아래 구성요소 서비스를 선택한다.

 



프로그램이 시작되면 왼쪽 트리에서 "구성 요소 서비스" 를 펼쳐

 

"COM+ 응용 프로그램" 에서 오른쪽 버튼을 선택한다.

 


* 새로운 응용 프로그램을 생성한다.




 

만약 아래와 같이 대화형 사용자가 아닌 사용자를 지정하여 사용 가능하다.

다음 사용자를 선택한후 권한에 맞는 사용자를 선택하여 입력한다.


 


생성된 응용 프로그램 내에 "구성요소", 레거시 구성요소", 역할등의 폴더가 생성된다.

 

만약에 기존에 생성된 응용 프로그램에 등록할 예정이면 위 단계를 생략해도 된다.

 

등록할 DLL 파일을 드래그하여 선택한 응용 프로그램의 구성요소에 넣는다.

 



등록이 완료되면 등록된 DCom에 오른쪽 버튼을 눌러 등록 정보를 선택한다.

 


등록정보를 보면 등록한 내용에 대하여 자세히 설명되어 있다.

 

그중에 일반탭의 이미지 옆에 있는 이름은 Web에서 호출하여 사용할 이름이다.

 


이렇게 하면 등록이 완료 된다.

 

마지막으로 등록된후에 DCom을 사용할때 권한이 없다던가 제대로 실행 않되는 현상이 있는데 그거는

 

등록한 DLL의 등록 정보중 보안 탭을 선택하여 "권한 부여" 내부에 선택되어 있는 "구성 요소 수준 액세스 검사 수행"

 

선택 취소하면 된다.

 

 

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

DCom 이용하기

SAP 에서 RFC 통신을 이용하여 Web와 데이터를 공유하도록 지원한다.

 

Web와 데이터를 공유하는 방식중 jdk 를 이용하는 방법과 DCom connector 을 이용하는 방법

 

jdk를 이용하여 JAVA 또는 C#이나 .net을 이용하는 방법이 있는데

 

여기서는 DCom을 이용하는 방법을 정리한다.

 

SAP 640 이하버전은 SAP 싸이트를 이용하여 DCom connector를 다운 받아

 

Dll을 생성하여 사용할수 있다.

 

Dcom connector 생성 방법은 따로 설명할 예정이다 (알아두면 편리한것)

 

여기서는 web와의 연결 방법에 대하여 이야기 하겠다.

 

DCom Connector를 사용하기 위해 가장기본이 되는 거는 Web 서비시를 하는 곳에

 

SAP GUI가 깔려 있어야 편하다.

 

우선 Dcom connector에서 생성한 Dll 파일을 구성요소 서비스에 등록한다 (이부분도 따로 설명 하겠다 - 알아두면 편리한것)

 

등록한 Dcom connector의 이름을 이용하여 객체를 생성한다.

 

객체 생성은 기존의 방식과 동일하나 파라미터로 넘겨주는 내용만 맞추면 된다.

 

      Set obj = server.CreateObject("구성요소 서비스에 등록된 DCom connector 이름")

      obj.Destination = "연결한 SAP 서버 이름" // 또는 IP

      obj.Client = "Client 번호"

      obj.UserID = "RFC 통신을 위한 ID"

      obj.Password = "UserID 의 암호"

      obj.Language = "KO" // 사용할 언어

 

위 내용의 대부분은 SAP을 연결하기 위한 SAP GUI에 설정된 내용과 동일하다.

 

이제 생성된 객체를 이용하여 특정의 Function을 호출하는 방법을 보면

 

        Call obj.Zxxxx_xxxx(a, b, c, d, return, sA, Table) // Zxxxx_xxxx 호출 function, a, b, c, d 전송 파라미터, return, sA 구조체, Table 필요 데이터

 

Call 을 이용하여 function을 호출하면 바로 데이터를 얻을수 있다. 참 간단하지 않은가.

 

여기서 주의 할 점이 있다. Table 및 전송 또는 리턴되는 데이터 형을 어떻게 선언할 것인가.

 

Table은 RecodeSet으로 설정하여야 한다.

 

METADATA TYPE="typelib" FILE="C:\program Files\Common Files\System\ado\msado15.dll

 

RecodeSet으로 선언하기 위해서는 반듯이 METADATA TYPE가 선언되어 사용해야 한다.

 

        Dim table   // table 선언

        Set table = Server.Create("ADODB.Recordset")  // 객채 생성

        obj.DimAS "Zxxxx_xxxx", "Table", table   // 형 변환

 

DimAS라는 Function 이 나온다 이전에 생성한 Dll의 .h 파일을 보면 DimAS는 Zxxxx_xxxx Function 에서 사용하는

 

Table 이라는 형태로 table의 형을 변환하여 보내준다.

 

여기서 주의 해야할 점은 "Zxxxx_xxx" 와 "Table"은 SAP에 정의된 이름과 동일해야 한다.

 

그럼 구조체는 어떻게 정의 할 것인가. 사실 구조체는 따로 정의할 필요가 없다. Dim 으로 선언하여 사용하면 된다.

 

다만 구조체 내부의 데이터를 읽어 올때만 틀려진다.

 

위 코드 내용중 sA를 구조체를 선언하였다.

 

sA의 값을 받기 위해서는

 

         Dim sA

         ....

         ....

         response.write(sA("구조체 내부 변수명"))

 

이런식으로 받아 오면 된다.

 

전체 Code

 

      Dim table, obj, a, b, c, d, return, sA

 

     Set obj = server.CreateObject("구성요소 서비스에 등록된 DCom connector 이름")

      obj.Destination = "연결한 SAP 서버 이름"

      obj.Client = "Client 번호"

      obj.UserID = "RFC 통신을 위한 ID"

      obj.Password = "UserID 의 암호"

      obj.Language = "KO"

 

      Set table = Server.Create("ADODB.Recordset")

      obj.DimAS "Zxxxx_xxxx", "Table", table  

 

      a = "a"

      b = "b"

      c = "c"

      d = "d"

      Call obj.Zxxxx_xxxx(a, b, c, d, return, sA, table)

     

      response.write(return)

      response.write(sA("aa"))

      response.write(sA("bb"))

      response.write(sA("cc"))

      response.write(table("aa"))

      response.write(table("bb"))

      response.write(table("cc"))

 

여기서 주의할 점은 Table 에 데이터가 하나도 없으면 table에는 NULL 이 넘어오기 때문에

 

table에 대이터가 있는지 없는지 먼져 Check 하도록 return 에 Table 데이터의 유무 또는 데이터 수량을 리턴하여 사용하는 것이 편하다.

 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

2009년 6월 1일 월요일

CSplitterWnd 분할 윈도우 만들기

다시 개발을 시작했다.

개발 않할때는 손가락이 근질 거려 뭐라도 하고 싶었는데 ^^

막상 시작하니 ㅋㅋ 여전이 IT 개발은 빡세게 돌아가고 있구나... 후회가 된다. ㅋㅋㅋ

 

CFormView 에서 CSplitterWnd 사용 화면 분할

/// 물론 h 파일에는

///  CSplitterWnd m_wndSplit;
///  CSplitterWnd m_wndBottomSplit;

/// 분할 Wnd 선언

/// CMainFrame에서 생성
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{

   m_wndSplit.CreateStatic(this, 6, 1); ///  가로 6개 분할

  m_wndBottomSplit.CreateStatic(&m_wndSplit, 1,2, WS_CHILD|WS_VISIBLE|WS_BORDER, m_wndSplit.IdFromRowCol(5, 0) );

  /// 마지막 6번째 화면을 가로로 분할 (화면은 0부터 Count)

 

m_wndSplit.CreateView(0,0,pContext->m_pNewViewClass, CSize(rect.Width(), 60), pContext);
 m_wndSplit.CreateView(1,0,RUNTIME_CLASS(CMiddileFrameWnd), CSize(rect.Width(), 200), pContext);

 m_wndSplit.CreateView(2,0,RUNTIME_CLASS(CKillorFormView), CSize(rect.Width(), 60), pContext);
 m_wndSplit.CreateView(3,0,RUNTIME_CLASS(CKillorFormView), CSize(rect.Width(), 60), pContext);
 m_wndSplit.CreateView(4,0,RUNTIME_CLASS(CKillorFormView), CSize(rect.Width(), 60), pContext);

 

 m_wndBottomSplit.CreateView(0,0, RUNTIME_CLASS(CKillorFormView), CSize(rect.Width()/2, nHight), pContext);

 m_wndBottomSplit.CreateView(0,1, RUNTIME_CLASS(CKillorFormView), CSize(rect.Width()/2, nHight), pContext);

 

 SetActiveView((CView *) m_wndSplit.GetPane(0,0));

 return TRUE; // 완료 반환

// return CFrameWnd::OnCreateClient(lpcs, pContext); 주석처리

}

 

//// 어케 이쁘게 분할 되었나? ^^ CSize를 수정하면 초기 크기 조절도 가능 ^^

/// RUNTIME_CLASS 에서 View Class  뿐 아니라 CFrameWnd 를 생성하여 Toolbar도 사용


/// CFrameWnd  사용시

/// CFrameWnd의 Client 생성시 view point 생성

BOOL CMiddileFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 CMiddileFormView *pview;

 // Create a context.
 CCreateContext context;
 pContext = &context;

 // Assign custom view.
 pContext->m_pNewViewClass = RUNTIME_CLASS(CMiddileFormView);

 // Create the view.
 pview = (CMiddileFormView *) CreateView(pContext, AFX_IDW_PANE_FIRST);
 if (pview == NULL)
  return FALSE;

 // Notify the view.
 pview->SendMessage(WM_INITIALUPDATE);
 SetActiveView(pview, FALSE);

 return TRUE;//CFrameWnd::OnCreateClient(lpcs, pContext);
}

 

출처 - http://www.codeproject.com/