2008/09/26

Popup Menu에 UpdateCommandUI Handler동작 시키기

이벤트 핸들러 없이 UpdateCommandUI Handler 만 있는 팝업 메뉴

이벤트 핸들러 없이 UpdateCommandUI Handler 만 있는 팝업 메뉴


메인 메뉴와는 다르게 팝업 메뉴에는 자동으로 UpdateCommandUI Handler 가 동작을 하지 않는다. 아래 내용을 팝업 메뉴에 UpdateCommandUI Handler 가 동작 하도록하는 코드이다.

void CtestView::OnRButtonUp(UINT nFlags, CPoint point)
{
    CMenu menu;
    menu.LoadMenu( IDR_POPUP );
    CMenu* pPopup = menu.GetSubMenu( 0 );

    // UpdateCommandUI Handler 호출
    for (UINT i = 0; i < pPopup->GetMenuItemCount(); i++) 
    { 
        CCmdUI state; 
        state.m_nIndexMax = pPopup->GetMenuItemCount(); 
        state.m_nIndex = i; 
        state.m_nID = pPopup->GetMenuItemID(i); 
        state.m_pMenu = pPopup; 
        state.DoUpdate(this, TRUE); 
    } 

    CPoint ptPopup = point;
    ClientToScreen( &ptPopup );
    pPopup->TrackPopupMenu( TPM_LEFTALIGN, ptPopup.x, ptPopup.y, this );

    CView::OnRButtonUp(nFlags, point);
}

void CtestView::OnUpdateMypopupPopup1(CCmdUI *pCmdUI)
{
    pCmdUI->Enable( TRUE );
}

void CtestView::OnUpdateMypopupPopup2(CCmdUI *pCmdUI)
{
    pCmdUI->Enable( FALSE );
}
코드적용 후 팝업 메뉴

코드적용 후 팝업 메뉴

Original Post : http://neodreamer-dev.tistory.com/175

메인메뉴 중 하나를 오른쪽 끝으로 보내기

타이틀바 아래의 메뉴바의 특정 메일을 오른쪽 끝으로 보내는 팁이다.

Visual C++ 리소스 작업 화면
Visual C++ 리소스 작업 화면
C++ Builder 폼 편집 화면
C++ Builder 폼 편집 화면

아래는 위의 화면에서 작업하는 것 중 마지막 "MyMenu" 를 오른쪽 끝으로 보내는 코드이다.


// Visual C++
CMenu* pMainMenu = GetMenu();
if ( pMainMenu )
{
  CMenu* pMyMenu = pMainMenu->GetSubMenu( 
  pMainMenu->GetMenuItemCount() - 1 );

  if ( pMyMenu )
    ModifyMenu( 
      pMainMenu->GetSafeHmenu(), 
      pMainMenu->GetMenuItemCount() - 1, 
      MF_BYPOSITION | MF_POPUP | MF_HELP, 
      (UINT_PTR)pMyMenu->m_hMenu, 
      _T("MyMenu") 
    );
}

// C++ Builder
if (MainMenu)
{
  ModifyMenu(
    MainMenu->Handle,
    MainMenu->Items->Count - 1,
    MF_BYPOSITION | MF_POPUP | MF_HELP,
    (unsigned int)MyMenu->Handle,
    "MyMenu"
  );
}



Visual C++ 결과 화면
Visual C++ 결과 화면

C++ Builder 결과 화면
C++ Builder 결과 화면
http://neodreamer-dev.tistory.com/173

2008/09/25

파일 확장자로 System Icon 가져오는 코드

#define NO_WIN32_LEAN_AND_MEAN

SHFILEINFO sfi;
DWORD ret = SHGetFileInfo(".DOC", 0, &sfi, sizeof(SHFILEINFO), 
              SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON );

Original Post : http://neodreamer-dev.tistory.com/172

리소스에 파일 넣고 실행시 파일로 추출하기

프로젝프의 리소스에 파일을 첨부시키고 실행시 필요한 시점에 파일로 추출하는 소스이다.


#include
#include

HMODULE hModule = GetModuleHandle(NULL);

TCHAR szFilename[MAX_PATH];
TCHAR Drive[_MAX_DRIVE];
TCHAR Path[_MAX_DIR];
TCHAR Filename[_MAX_FNAME];
TCHAR Ext[_MAX_EXT];
GetModuleFileName(NULL, szFilename, sizeof(szFilename));
_tsplitpath_s(szFilename, Drive, _MAX_DRIVE, Path,
_MAX_DIR, Filename, _MAX_FNAME, Ext, _MAX_EXT);

TCHAR szFile[MAX_PATH];

// Extract "file.fnt"
_stprintf_s(szFile, MAX_PATH, _T("%s%sfile.fnt"), Drive, Path);

if( (_waccess( szFile, 0 )) == -1 ) // 파일이 존재하지 않을 경우
{
HRSRC hrsrc = FindResource(hModule,
(LPCTSTR)IDR_MY_FONT, _T("MyFILE"));
DWORD dwSize = SizeofResource(hModule, hrsrc);
HGLOBAL hGlobal = LoadResource(hModule, hrsrc);

CHAR *pData = (CHAR *) LockResource(hGlobal);

CFile file;
CFileException e;
if (file.Open(szFile,
CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &e))
{
file.Write(pData, dwSize);
file.Close();
}
else
{
TCHAR szErr[1024];
e.GetErrorMessage(szErr, 1024);

AfxMessageBox(szErr);
}

DeleteObject(hGlobal);
}


// Extract "file.dat"
_stprintf_s(szFile, MAX_PATH, _T("%s%sfile.dat"), Drive, Path);

if( (_waccess( szFile, 0 )) == -1 ) // 파일이 존재하지 않을 경우
{
HRSRC hrsrc = FindResource(hModule,
(LPCTSTR)IDR_MY_DATA, _T("MyFILE"));
DWORD dwSize = SizeofResource(hModule, hrsrc);
HGLOBAL hGlobal = LoadResource(hModule, hrsrc);

CHAR *pData = (CHAR *) LockResource(hGlobal);

CFile file;
CFileException e;
if (file.Open(szFile,
CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &e))
{
file.Write(pData, dwSize);
file.Close();
}
else
{
TCHAR szErr[1024];
e.GetErrorMessage(szErr, 1024);

AfxMessageBox(szErr);
}

DeleteObject(hGlobal);
}

Original Post : http://neodreamer-dev.tistory.com/171

2008/09/24

VisualSVN 1.5.3 Release

Visual Studio 의 IDE subversion 플러그 인인 VisualSVN 이 버전 업을 하였다.

사용자 삽입 이미지

Version 1.5.3 (September 24, 2008) [Download]

    * Updated to Subversion 1.5.2. For further details please see:
      http://svn.collab.net/repos/svn/tags/1.5.2/CHANGES
    * Support for Windows 2000 added.
    * Support for Vs.Php projects added.
    * Support for Intel Fortran projects added.
    * Fixed: changes are shown in editor for a file from another working copy

Original Post : http://neodreamer-dev.tistory.com/170

2008/09/23

예제 코드를 모아 놓은 사이트

프로그래밍에 관련된 예제 코드를 잘 정리해 놓은 사이트 이다.

http://www.java2s.com/Code/Cpp/CatalogCpp.htm

위의 사이트에 정리된 언어들
    C++
    Java
    Java Tutorial
    Java Source Code / Java Documentation
    Java Open Source
    Jar File Download
    Java Articles
    Java Products
    Java by API
    C# / C Sharp
    C# / CSharp Tutorial
    ASP.Net
    JavaScript DHTML
    JavaScript Tutorial
    JavaScript Reference
    HTML / CSS
    HTML CSS Reference
    C / ANSI-C
    C Tutorial
    C++ Tutorial
    PHP
    Python
    SQL Server / T-SQL
    SQL Server / T-SQL Tutorial
    Oracle PL / SQL
    Oracle PL/SQL Tutorial
    PostgreSQL
    SQL / MySQL
    MySQL Tutorial
    VB.Net
    VB.Net Tutorial
    Flash / Flex / ActionScript
    VBA / Excel / Access / Word
    Microsoft Office PowerPoint 2007 Tutorial
    Microsoft Office Excel 2007 Tutorial
    Microsoft Office Word 2007 Tutorial
Original Post : http://neodreamer-dev.tistory.com/169

MySQL++ 3.0.6 Library for VC2005

MySQL C API 의 C++ Wrapper 이다. 질의등의 처리를 쉽게 할 수 있도록 도와주며 STL 컨테이너로 구성되어있다.


MySQL 을 사용함에 있어 보다 쉽게 API를 활용할 수 있도록 하기위해 테스트를 하는 과정에서 만든 라이브러리이다. Visual C++ 2005 를 이용하여 컴파일 하였다.























Original Post : http://neodreamer-dev.tistory.com/168

2008/09/22

SQLite 3.6.3 Released!!


새로운 SQLite 가 공개 되었다.

SELECT DISTINCT 관련 문제를 수정하였다 하니 DISTINCT 를 사용한다면 업그레이드가 필요하다.
SQLite official webpage
C++ Builder 용 SQLite3.lib
sqlite3.lib
Original Post : http://neodreamer-dev.tistory.com/167

MySQL++ 과 MySQL Connector/C++ 의 차이점

MySQL Connector/C++ MySQL++
API
  • Follows JDBC 3.0 API
  • Non-standard API
  • The MySQL++ API is "C++-ish" and rich of C++ specific goodies
License
  • GPL (+FLOSS License Exception)
  • Commercial license upon request
  • LGPL
Status
  • Preview only
  • Stable GA (General Availability) release

출처 : http://blog.ulf-wendel.de/?p=185

MySQL Connector/C++
MySQL++


Original Post : http://neodreamer-dev.tistory.com/166

2008/09/18

프로세스 아이디로 윈도우 핸들 찾기

STARTUPINFO sInfo;
memset( &sInfo, 0, sizeof(sInfo) );
sInfo.cb = sizeof(sInfo);

PROCESS_INFORMATION pInfo;
memset( &pInfo, 0, sizeof(pInfo) );

if ( !CreateProcess( _T("C:\Windows\
otepad.exe"), 
        NULL, NULL, NULL, FALSE, 
        NULL, NULL, NULL, &sInfo, &pInfo ) )
{
    CString strMsg;
    strMsg.Format( _T("Create Failed\n\nLast Error : %d"), 
        GetLastError() );

    AfxMessageBox( strMsg );
}
else
{
//     HWND h = ::GetTopWindow(0 );
//     while ( h )
//     {
//         DWORD pid;
//         DWORD dwTheardId = ::GetWindowThreadProcessId( h,&pid);
// 
//         if ( pid == pInfo.dwProcessId )
//         {
//             AfxMessageBox( _T("Finded!!") );
// 
//             HWND hParent = ::GetParent( h );
//             break;
//         }
//         h = ::GetNextWindow( h , GW_HWNDNEXT);
//     }

    HWND hWnd = ::GetDesktopWindow();
    HWND hTmpWnd = NULL;
    BOOL bFoundWnd = FALSE;
    DWORD dwPID;

    while ( hWnd != NULL && !bFoundWnd )
    {
        hTmpWnd = hWnd;
        hWnd = ::GetWindow( hWnd, GW_CHILD );
        if ( hWnd )
        {
            ::GetWindowThreadProcessId( hWnd, &dwPID );

            if ( dwPID == pInfo.dwProcessId )
                if ( ::IsWindow( hWnd ) && 
                    ::IsWindowVisible( hWnd ) )
                    bFoundWnd = TRUE;
        }
        else
        {
            hWnd = hTmpWnd;
            hWnd = ::GetWindow( hWnd, GW_HWNDNEXT );

            if ( hWnd )
            {
                ::GetWindowThreadProcessId( hWnd, &dwPID );

                if ( dwPID == pInfo.dwProcessId )
                    if ( ::IsWindow( hWnd ) && 
                        ::IsWindowVisible( hWnd ) )
                        bFoundWnd = TRUE;
            }
            else
            {
                hWnd = hTmpWnd;
                hWnd = ::GetParent( hWnd );
                if ( hWnd )
                {
                    BOOL bFoundBranch = FALSE;

                    while ( !bFoundBranch && !bFoundWnd && hWnd )
                    {
                        hTmpWnd = hWnd;
                        hWnd = ::GetWindow( hWnd, GW_HWNDNEXT );
                        if ( hWnd )
                        {
                            bFoundBranch = TRUE;

                            ::GetWindowThreadProcessId( hWnd, &dwPID );
                            if ( dwPID == pInfo.dwProcessId )
                                if ( ::IsWindow( hWnd ) && 
                                    ::IsWindowVisible( hWnd ) )
                                    bFoundWnd = TRUE;
                        }
                        else
                        {
                            hWnd = hTmpWnd;
                            hWnd = ::GetParent( hWnd );
                        }
                    }
                }
            }
        }
    }

    if ( bFoundWnd )
    {
        HWND myWnd;
        if ( ::GetParent( hWnd ) )
            myWnd = ::GetParent( hWnd );
        else
            myWnd = hWnd;
    }
}

ProcessID로 Window Handle 을 찾는 방법이다.

위의 코드는 완벽한 코드는 아니다. 프로세스 아이디 한개에 여러개의 핸들이 연결되어 있기때문에 원하는 윈도우 핸들을 정확하게 찾기 위해서는 동일한 프로세스 아이디를 갖는 여러개의 핸들 중에서 하나를 골라내는 방법이 개선 되어야 한다. 위의 코드는 단순히 윈도우 핸들인가와 윈도우가 Visible 인가만을 체크해서 골라내고 있다.
동일한 프로세스 아이디를 갖는 핸들들

동일한 프로세스 아이디를 갖는 핸들들

Original Post : http://neodreamer-dev.tistory.com/165

Indy Client로 인터넷상의 파일 존재 유무 파악하기

// 파일 존재 여부 테스트
try
{
    IdHTTP->Head( strURL );
}
catch(Exception &e)
{
    ShowMessage( "파일이 존재하지 않습니다.\n\n" + strURL );
}
TidHTTP 컴포넌트의 Head 메소드를 이용해 인터넷상의 파일이 존재 하는지 확인하는 방법이다.
이는 Head를 가져오기를 시도하면서 예외사항이 발생하는지를 보고 판단하는 것인데 엄밀히 말하면 인터넷이 안될 경우도 있기때문에 파일의 존재 유무 보다는 파일에 접근이 가능한지를 판단하는 것으로 보는게 옳을 듯 하다.
정확한 에러 원인은 Exception 개체의 에러를 분석하면 가능하다.

Original Post : http://neodreamer-dev.tistory.com/164

굿모닝 팝스 mp3 재생 및 다운로더 v7 build 17

사용자 삽입 이미지

재생만 된다면 더이상의 버전업을 하지 않으려 했는데 또 하게 되었다.
단팥 사이트가 유료화가 진행중으로 쉽게 데이터에 접근을 할 수 없게 만들어서 프로그램 수정이 불가피해졌다.
rss에서 보여지는 mp3의 경로가 옳바르지 않고 단팥플레이어로 접근을해서 다운 받아야 하는데 하루에 무료로 다군 받을 수 있는 개수가 제한 되어 있다.
간단한 URL 치환으로 다운로드 받을 수 있지만 이러한 방법이 언제 또 바뀔지 모르겠다. 일단 다운로드를 받을 수 있도록 수정을 하였다.
다운로드
Original Post : http://neodreamer-dev.tistory.com/163

VCL 문자열 치환 함수 - StringReplace

// Declaration
// Delphi
type TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S: string;
const OldPattern: string;
const NewPattern: string;
Flags: TReplaceFlags): string;

// C++ Builder
typedef Set<SysUtils__94, rfReplaceAll, rfIgnoreCase> TReplaceFlags;
AnsiString __fastcall StringReplace(const AnsiString S,
const AnsiString OldPattern,
const AnsiString NewPattern,
TReplaceFlags Flags);

// C++ Builder Example
TReplaceFlags flag = TReplaceFlags() << rfReplaceAll << rfIgnoreCase;
strURL = StringReplace( strURL, m_strUrlFind, m_strUrlReplace, flag );

VCL의 StringReplace는 문자열에서 특정 문자열을 찾아서 원하는 문자열로 바꾸어 주는 함수이다.
간단한 함수 이며 소스 문장, 찾을 문자열, 바꿀 문자열 그리고 바꾸는 형식을 지정해 주면 된다.

StringReplace에 사용되는 TReplaceFlags는 바꾸는 형식을 지정하는 것으로
rfRepalceALL을 지정하면 모든 문자를 찾아서 바꾸어 주고 그렇지 않으면 처음 나타나는 문자열에 대해서만 치환을 한다.
rfIgnoreCase는 문자열을 찾을때 대소문자를 구분할 것인지 정하는 flag 이다

Original Post : http://neodreamer-dev.tistory.com/162

2008/09/17

무료 SVN Client - TortoiseSVN 1.5.3 Released

사용자 삽입 이미지

1.5.2 버전에서 버그를 수정하여 1.5.3 버전을 공개하였다.

Version 1.5.3 수정사항
- CHG: paths in error messages are nor truncated to 80 chars anymore. (Stefan)
- CHG: enabled rc4 encryption for the sasl dlls. (Stefan)
- CHG: linked against neon 0.28.3
- BUG: some context menu entries were shown if multiple items were
       selected even if they only work on single items. (Stefan)
- BUG: the move/copy right-drag menus were not shown if the target
       folder was added but not yet committed. (Stefan)
- BUG: fixed missing typecasts. This lead among others to "show log" not
       working from the check-for-modifications dialog on x64. (Stefan)
- BUG: Reverting multiple selected paths only showed the files from the first
       selected path in the revert dialog. (Stefan)
- BUG: the right-drag context menu did not show all commands for old
       working copies (fresh checkout would fix this too). (Stefan)
- BUG: Starting external applications (e.g., the diff tool) could fail if
       the working copy is on the same drive as TSVN was installed to. (Stefan)
- BUG: Upgrading could fail under certain circumstances which then required
       an uninstall, reboot, reinstall cycle. (Stefan)
- BUG: Sometimes conficts were shown as 'add's in the progress dialog. (Stefan)
- BUG: Moving a file to the "ignore-on-commit" changelist removed the check
       but the file would still get committed. (Stefan)
- BUG: When starting TortoiseProc with '*' separated, relative file paths, the
       commit dialog would either just flash and exit or not show all the
       files from all specified paths. (Stefan)
- BUG: TSVN would not use ssh clients set in the svn config file, only those
       set in the TSVN settings dialog. (Stefan)
- BUG: Moving files from one changelist to another by dragging them in the
       commit and CfM dialog could hang. (Stefan)
- BUG: If the commit dates were not in sequence with the revision numbers
       which can happen when a repository is converted from other version
       control systems, the statistics dialog would show a wrong 'by date'
       graph. (Stefan)
- BUG: internal properties like bugtraq:, tsvn:, ... which had non-ascii
       chars in their values got garbled on newly added folders where those
       properties are automatically added. (Stefan)
- BUG: Dragging files from the progress dialog didn't work if the paths had
       spaces in them. (Stefan)
- BUG: The file diff dialog (compare revisions) could use the wrong
       peg revision in certain situations. (Stefan)
- BUG: the shift-diff to use TortoiseMerge instead of the configured diff
       tool didn't work for the filediff dialog. (Stefan)
- BUG: The "add folder" in the repository browser only added the folder
       itself without the files in it. (Stefan)
- BUG: When changing the overlay icon set, the deleted overlay did not
       show up anymore. (Stefan)


Download TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi
Download TortoiseSVN-1.5.3.13783-x64-svn-1.5.2.msi

Original Post : http://neodreamer-dev.tistory.com/161

무료 SVN Server - VisualSVN Server 1.5.3 Released!

사용자 삽입 이미지

무료 SVN Server 가 얼마전 업데이트를 하였다.

Version 1.5.3 (September 08, 2008)

    * Updated to Subversion 1.5.2. For further details please see:
    http://svn.collab.net/repos/svn/tags/1.5.2/CHANGES

Visual SVN Server 1.5.3 Download
Original Post :
http://neodreamer-dev.tistory.com/160

ModelRight 3 Community Editor Updated

무료 데이터베이스 모델링 프로그램인 ModelRight 3 Community Edition 이 업데이트 되었다.

2008/09/09 - [Com. Story/Apps] - 무료 데이터베이스 모델링 툴 - ModelRight3 Community Edition


사용자 삽입 이미지

ModelRIght 3 webpage
ModelRight 3 Community Edition Download
Original Post :
http://neodreamer-dev.tistory.com/159

Boost Library 쉽게 설치하기

사용자 삽입 이미지

2008/09/17 - [Dev Story/Tips] - VC++ 2005 에 boost library 32bit & 64bit 설치하기


위 글을 포스팅하면서 찾은 정보로 boost library 를 쉽게 설치할 수 있도록 구성한 설치 프로그램이 있다.

BoostPro 라는 이름의 이 프로그램은 작은 설치 파일 형태로 배포되어 인터넷을 통하여 라이브러리를 다운받아 설치되도록 지원하는 프로그램이다.

이미 컴파일된 파일을 다운로드하여 설치하기 때문에 몇가지 제약을 갖고있다.
현재 1.35버전이 가장 최근 버전이며 컴파일러 선택을 Visual C++ 2003, 2005, 2008 만 선택할 수 있으며 다른 부가적인 옵션을 선택할 수 없다(32bit 만 지원함.). 그래서 설치가 간단하다.

먼저 프로그램을 실행하고 다운로드 받을 위치를 선택한다. 설치 경로와 컴파일러 그리고 Variants를 설정을 해 주면 된다.

아래 슬라이드는 설치되는 과정을 갈무리한 화면이다.










설치를 완료하고 Visual C++ IDE 의 도구->옵션 메뉴에서 포함경로와 라이브러리 경로를 지정해 주면 된다.

BoostPro webpage
Original Post :
http://neodreamer-dev.tistory.com/158

C++ Builder 2009에 포함된 Boost Library 버전 확인

사용자 삽입 이미지

C++ 표준 라이브러리로 등록을 코앞에 둔 boost library 가 C++ Builder 2009 에는 기본으로 포함되어 있다.

이 라이브러리의 버전을 확인해 보았다.

설치를 마치고 간단하게 설치 경로(C:\Program Files\CodeGear\RAD Studio\6.0\include\boost_1_35)를 보면 확인할 수 있지만 소스 코드를 이용하여 확인을 해 보았다.
#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
//----------------------------------------------------------------------
#include <boost/version.hpp>
#include <iostream>
#include <string>

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    int minor = BOOST_VERSION / 100 % 1000;
    int major = BOOST_VERSION / 10000;

    std::cout << "Boost library version : " << BOOST_LIB_VERSION << "
\n";
    std::cout << "Boost major version : " << major << "
\n";
    std::cout << "Boost minor version : " << minor << "
\n";

    return 0;
}
//----------------------------------------------------------------------

결과 화면
C++ Builder 2009에 포함된 Boost 버전

Original Post : http://neodreamer-dev.tistory.com/157

VC++ 2005 에 boost library 32bit & 64bit 설치하기

사용자 삽입 이미지
정규식 라이브러리도 포함되어있고 그 외에 많은 라이브러리가 포함되어 있다는 boost library가 어떤건지 확인을 하고 싶어서 설치를 해보았다. boost library는 헤더파일만 필요로하는 라이브러리와 몇몇의 컴파일이 필요한 라이브러리로 구성되어 있다. 단순 헤더파일만 이용하는 라이브러리를 사용할 경우 컴파일까지 필요가 없고 그냥 Include 경로만 지정해 주면 사용할 수 있다. Boost.Regex 를 사용하려면 컴파일을 해야한다. 우선 준비물로 boost library 와 boost jam 을 다운로드한다. Boost Library 1.36 http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041&release_id=619445 Boost Jam 3.1.6 https://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941&release_id=558771 Boost Library 를 임의의 경로에 풀어 놓고 Boost Jam 을 Boost Library의 루트에 압축을 푼다. "Visual Studio 2005 x64 Cross Tools 명령 프롬프트" 을 실행하여 도스창을 열고 boost library 루트 경로로 간다.
사용자 삽입 이미지
x64 Cross Tools 명령 포롬프드 단축키
설치 자료를 보면 boost root folder\tools\jam\src\build.bat 을 실행하라고 나오지만 32bit XP에서 실행을 해서인지 에러 메세지가 출력이 되어서 그냥 건너 뛰었다. boost root folder 에서 복사해 놓은 bjam.exe 를 실행하였다. F:\Dev\boost_1_36_0>bjam.exe -sTOOLS=vc-8_0 -sICU_PATH=F:\dev\icu threading=mult i --build-type=complete --prefix=f:\dev\boost32 --without-python --without-mpi install F:\Dev\boost_1_36_0>bjam.exe -sTOOLS=vc-8_0 -sICU_PATH=F:\dev\icu threading=mult i address-model=64 --build-type=complete --prefix=f:\dev\boost64 --without-python  --without-mpi install 32bit 와 64bit를 따로 생성하였는데 각각의 소요시간이 상당히 걸린다.  32bit의 경우 별다른 에러를 발생하지 않았는데 64bit의 경우 중간에 몇몇 64bit 실행화일을 실행함에 있어 실행할 수 없다는 에러메세지가 출력되었다. 이 에러가 최종 라이브러리 생성에 영향을 미치는지는 아직 확인 하지 않았다. 설치를 마치고 Visual C++ 2005 의 환경설정을 바꾸어 주었다. 설치와 환경 설정을 마치고 32bit에서 Boost.Regex 라이브러리를 테스트 해 보았다. 테스트 소스는 인터넷이서 구한 것으로 입력되는 글 중 Subject: 를 찾아 출력하는 내용이다.
#include "stdafx.h"
#include <boost/regex.hpp>
#include <iostream>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
std::string line;
boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

while (std::cin)
{
std::getline(std::cin, line);
boost::smatch matches;
if (boost::regex_match(line, matches, pat))
std::cout << matches[2] << std::endl;
}

return 0;
}
사용자 삽입 이미지
Boost.Regex 테스트 결과 화면
Original Post : http://neodreamer-dev.tistory.com/156

2008/09/15

Delphi Distiller v1.44 released

델파이툴의 여러가지 트윅을 설정 할 수 있는 프로그램이다.

한동안 뜸 했다가 델파이 2009 버전의 발표로 다시 활성화 되었다.

백업 파일 설정및 기타 패키지 관련 설정을 할 수 있다.

Delphi Distiller Site

Tip. Ctrl + Alt + L 을 누르면 멋진 걸 볼 수 있다

Original Post : http://neodreamer-dev.tistory.com/155

2008/09/12

Delphi & C++ Builder 2009 ISO download

얼마전 ESD 형식으로 발표한 Delphi & C++ Builder 2009 Trial 버전이 ISO 버전으로도 공개가 되었다.

ESD의 경우 설치될 파일의 용량이 130MB 에 불과했는데 이는 도움말을 빼고 주요기능만을 테스트 하기 위한 버전으로 생각이 되는데 이번에 공개된 ISO 버전은 1.9G에 달한다.

Trial 버전으로 공개된 이 버전은 모든 기능을 포함하고 있는 것으로 생각된다.
Trial 등록시에 받은 Serial Key로 Trial 사용이 가능하다 한다.

출처:
Nick Hodges's Blog
www.delphi.org

다운로드
CodeGear Download Page
Delphi & C++ Builder 2009 Trial ISO 다운로드
Original Post :
http://neodreamer-dev.tistory.com/154

2008/09/10

Delphi and C++Builder 2009 Trial 이 공개되었다!!

Delphi & C++ Builder 2009 설치 화면

Delphi & C++ Builder 2009 설치 화면


얼마전 Borland 에서 Embarcadero 로 소속을 바꾼 CodeGear 에서 새로운 개발툴을 발표하였는데 드디어 시험판이 공개 되었다.

이번 버전의 가장 큰 점은 유니코드에 대한 지원이며 이번 시험판은 14일간의 시험 기간이 주어지니 개발 툴에 대해 간단히 맛볼 수 있는 기간이라 생각된다.

다음은 Embarcadero 홈페이지에서 소개한 글이다.
14-day trial of Delphi 2009 and C++Builder 2009 Architect edition
English, French, German and Japanese

During the install process, you can choose to install Delphi, C++Builder or both.

To install the Delphi and C++Builder Trial:

- Request a trial serial number using the Send Activation button on the left side of this page
- Click the download button to download the installer .zip file
- Unzip the installer .zip file to an empty directory on your hard drive
- Run install.exe
- The install launcher will appear with buttons to install multiple items that are part of the product
- When prompted, enter the serial number for the product that you received via email after clicking the "Send Activation" button on the left side of the trial download page
- To install the online help, you need to return to the install launcher and select the online help button in a separate operation from the product install

The trial is a multi-part download. You download and run the install launcher which will in turn download additional files based on your feature selection. The total download size may be up to 1GB including up to 500MB for prerequisites like the Microsoft Windows Platform SDK and Internet Explorer (if you don't already have them installed) and up to 500MB for the Delphi and C++Builder install files, depending on the features you select.

You will be prompted to enter your serial number during the process. An Internet connection is required during installation. After installation, you must register your trial version before you can use the product.

정식 제품은 10월경에 출시 된다 한다.

다운로드 및 Activation 신청 페이지


Original Post : http://neodreamer-dev.tistory.com/153

MySQL Connector/C++ 프리뷰 공개

오늘 MySQL 뉴스레터에서 MySQL Connector/C++ 에 대한 소식을 접하였다.

지금까지 C++ 프로그래밍시 mysql을 컨트롤 하기 위해서는 MySQL C API 를 사용해 왔는데

이제는 그럴 필요가 없을 듯 보인다.

아래는 MySQL Connector/C++ 에대한 기사 내용이다.

MySQL Connetor/C++ 이라는 새로운 커넥터 사용이 가능해졌습니다.  MySQL Connector/C++은 MySQL
서버에 클라이언트 어플리케이션 연결을 위한 C++API를 제공합니다. MySQL Connector/C++은 JDBC 3.0
API와 매우 흡사합니다. MySQL C API(MySQL 클라이언트 라이브러리) 대신 MySQL Connector/C++을
사용하시면 다음과 같은 C++사용자들의 이점을 제공받을 수 있습니다.



- 별도의 C 함수 호출없이, 순수하게 C++ 만을 사용함으로 얻는 편리함

- 잘 디자인된 API – JDBC 3.0지원

- 일반적으로 알려져 있고 잘 문서화된 API-JDBC 3.0 지원

- 객체 지향적 프로그래밍의 패러다임을 지원

- 더욱 짧아진 개발 시간



문서:

 http://forge.mysql.com/wiki/Connector_C++

지금 다운로드:

 http://downloads.mysql.com/forge/connector_cpp_preview


문서 페이지를 열어보면 Connector C++ 에대한 소개와 간단한 사용법이 나온다.

여러가지 면에서 객체화된 MySQL Connector 로 간단 명료하게 작업을 할 수 있게 되어 좋지만 그 중에서도 PreparedStatement 기능을 간단하게 사용할 수 있어서 많이 편리해 졌다.

기존 C API 를 그대로 사용할 때는 바인딩 변수를 만들어 형식과 값을 할당하고 실행 해야 했지만 MySQL Connector C++ 에서는 PreparedStatement 객체를 직접 사용할 수 있어 상당히 편리해 졌다.


//////////////////////////////////////////////
// C API 를 이용한 Prepared Statement

m_pMySQL = mysql_init( NULL );
mysql_real_connect( m_pMySQL, "localhost", "root", "",
NULL, 3306, NULL, NULL);

MYSQL_BIND bind[4];
my_bool mybool[4];
MYSQL_STMT *pStmt = mysql_stmt_init( m_pMySQL );

char szName[20];
int nAge;
char szAlias[20];
char szAddr[255];

sprintf_s( szQuery, "INSERT INTO speedtest ( name, age, alias, addr ) "
"VALUES ( ?, ?, ?, ? )");

mysql_stmt_prepare( pStmt, szQuery, (unsigned long)strlen( szQuery ) );
mysql_stmt_bind_param( pStmt, bind );

for (int nRow = 0 ; nRow < 10000; ++nRow)
{
sprintf_s( szName, "123" );
bind[0].buffer_type = MYSQL_TYPE_VAR_STRING;
bind[0].buffer_length = (unsigned long)strlen( szName);
bind[0].is_null = &mybool[0];
bind[0].buffer = szName;

nAge = 10;
bind[1].buffer_type = MYSQL_TYPE_LONG;
bind[1].is_null = &mybool[1];
bind[1].buffer = &nAge;

sprintf_s( szAlias, "456" );
bind[2].buffer_type = MYSQL_TYPE_VAR_STRING;
bind[2].buffer_length = (unsigned long)strlen( szAlias);
bind[2].is_null = &mybool[2];
bind[2].buffer = szAlias;

sprintf_s( szAddr, "123456" );
bind[3].buffer_type = MYSQL_TYPE_VAR_STRING;
bind[3].buffer_length = (unsigned long)strlen( szAddr);
bind[3].is_null = &mybool[3];
bind[3].buffer = szAddr;

nRst = mysql_stmt_execute( pStmt );
}

mysql_stmt_close( pStmt );
mysql_close( m_pMySQL );



//////////////////////////////////////////////////////
// MySQL Connector C++ 를 이용한 Prepared Statement

sql::mysql::MySQL_Driver *driver;
sql::Connection *con;
sql::PreparedStatement *prep_stmt

driver = sql::mysql::MySQL_Driver::get_mysql_driver_instance();
con = driver->connect(EXAMPLE_HOST, EXAMPLE_PORT,
EXAMPLE_USER, EXAMPLE_PASS);

prep_stmt = con->prepareStatement(
"INSERT INTO speedtest ( name, age, alias, addr )"
"VALUES ( ?, ?, ?, ? )"
);

for (int nRow = 0 ; nRow < 10000; ++nRow)
{
prep_stmt->setString(1, "123");
prep_stmt->setInt( 2, 10);
prep_stmt->setString(3, "456");
prep_stmt->setString(4, "123456");

prep_stmt->execute();
}

delete prep_stmt;
delete con;


Original Post : http://neodreamer-dev.tistory.com/152

2008/09/09

무료 데이터베이스 모델링 툴 - ModelRight3 Community Edition

데이터베이스 모델링을 자주 하는 건 아니지만 가끔 하더라도 입맛에 맞는 툴을 사용하는 것이 작어 능률을 높이는 방법일 것이다.

모델링 작업을 하면서 몇몇 툴을 사용해 보았지만 무료이면서 나의 요구를 충족시켜주는 툴은 ModelRight3 이다.

Professional 버전에서는 다양한 종류의 데이터베이스(Oracle 8i, 9i, 10g, 11g, SQL Server 2000, 2005, 2008, MySQL 5.x, 6, ODBC)를 지원하지만 고가의 댓가를 지불 해야 한다. 그리고 데이터베이스 종류마다 지원하는 버전도 있지만 이역시 개인이 사용하기에는 다소 부담 스러운 금액이다. 개별 툴 중 가장 저렴한 툴이 ModelRight3 for MySQL 인데 현재 카피당 $195 이다.

가난한 개인 사용자를 위한 Community Edition 이 오늘 소개할 툴인데, Community Edition 은 MySQL 5.0, 5.1, 6.0 그리고 ODBC를 지원하다. 약간의 기능적 제약이 따르지만 무료로 사용할 수 있다.

Community Edition 이 갖는 제약 사항은 다음과 같다.
        Database and Model Compare
        ALTER Script Generation
        Reporting
        Undo/Redo
        Find
        Model Validation
        Transaction History
        Export to XML
        Export to JPG

단순 모델링 작업에서는 크게 영향을 미칠만한 제약 사항은 아니다.










이 툴의 가장 큰 장점은 객체(Table) 드로잉시 속성과 제약 사항의 출력이 깔끔하며 많은 내용을 보여 준다는 것이다.
이와 대조 적으로 MySQL Workbench 의 경우 무료로 사용할 수 있는 툴이고 UI도 깔끔하지만 객체를 표현함에 있어 포맷이 일정치 않아 산만하고 가독성이 떨어진다.
사용자 삽입 이미지

MySQL Workbench Screenshot


객체 드로잉에 대한 설정을 보다 유연하고 정형화된 형식을 지정할 수 있다면 MySQL Workbench 를 보다 더 선호하였을 것이다.

위의 툴 이전에는 Toad Data Modeler 3 를 사용하였는데 객체에 대한 깔끔한 보기는 좋은나 무료 버전의 제약이 다른 툴에 비해서 심한 편이라 바꾸게 되었다.
사용자 삽입 이미지

Toad Data Modeler 3 Screenshot


ModelRight 3 초기에는 Community Edition 을 지원하지 않아 무료로 사용할 수 없었는데 얼마전부터


ModelRight3 Official Website
ModelRight3 Community Edition Download
Original Post :
http://neodreamer-dev.tistory.com/151