Search

'분류 전체보기'에 해당되는 글 113건

  1. 2007.09.04 제로보드 스팸광고게시물,덧글 자동등록 방지 ZM_Crypt 2.0
  2. 2007.07.12 VC++ UNICODE Build - Configuration
  3. 2007.05.25 ActiveX 보안관련 설정
  4. 2007.05.21 Tray





※ 이전 버전에 비해 달라진 점
① 숫자만 되던 것에 영문도 가능하게 함
② 이미지의 숫자를 점 하나 하나 찍어서 만들던 것을, 비트맵 폰트파일을 이용하여 더욱 빠르고 간편하게 구현
③ 특정 게시판에는 스팸차단기능이 비활성화되도록 설정 가능
④ 기존, 3개의 파일로 쪼개져 있던 것을, 1개의 파일로 모음 (프로그램파일 1개+폰트파일 1개)
⑤ 기타, 소스를 더욱 효율적으로 정리
(도움을 주신 비혼(BiHon)님께 감사드립니다.)



※ 기존 1.5로 적용하시던 분들은, skin/ 디렉토리에 있는 3개의 파일을 지우시고,
이 2개의 파일을 올리시면 됩니다. (제로보드 관련파일 및 스킨파일 수정 불필요)

※ 본 프로그램은 서버에서 GD 라이브러리를 지원해야 가능합니다.

※ 앞으로 더 이상의 업그레이드는 하지 않을 예정입니다. (개인적인 사정으로)


ZM_Crypt 2.0 특징
적용이 쉽다
PHP 프로그램을 몰라도, HTML만 알면 쉽게 적용 가능합니다.
기본적으로 파일 4개에 1줄씩만 넣어주시면 작동합니다.
게시물 차단 + 덧글(코멘트) 차단
최근에는 덧글스팸도 많이 늘었습니다.
본 프로그램은 게시물 뿐만 아니라 덧글(코멘트)의 자동등록도 차단합니다.
디자인 변경 용이
여러 스킨을 사용해도, 각 스킨마다 원하는 위치에
예쁘게 삽입 가능합니다.
보안코드가 텍스트 아닌 이미지
보안코드가 텍스트가 아닌 이미지로 출력됩니다.
그렇다고, 기존 이미지 파일을 불러오는 것이 아닙니다.
GD 라이브러리를 이용, 자체 폰트함수로 그때마다 숫자 이미지 파일을 뿌려주고
자동 삭제됩니다.
때문에, 기존 텍스트 기반의 보안코드보다 보안성이 강합니다.
씨앗(Seed)을 바탕으로 한 자체 암호화 함수 내장여러분이 처음에 씨앗(Seed)을 설정할 수 있습니다.
암호화는 그 씨앗을 바탕으로 이루어집니다.
때문에, 더욱 더 안전합니다.
설치방법
환경설정 (zm_crypt.php 수정)
① 13째줄(씨앗) : 반드시 변경, 알파벳+숫자로 이루어진 암호 (외울 필요 없음)
② 14째줄(자릿수) : 보안코드의 자릿수 설정 (기본값:4자리)
③ 15째줄(보안코드 문자종류) : 숫자+알파벳, 또는 숫자만 설정 가능 (기본값:숫자+알파벳)
④ 스팸광고게시물 차단 필요없는 게시판 id 입력 : 게시판에 따라 차단 필요없는 게시판 이름(id)를 콤마(,)로 구분하여 입력
업로드제로보드(bbs) 디렉토리 안에 'skin' 디렉토리에 아래 두 파일 업로드.
① zm_crypt.php (zmCrypt 프로그램 파일)
② andale12.gdf (글꼴 파일)
예:
/bbs/ : 제로보드 설치 디렉토리
/bbs/skin/ (특정 스킨 디렉토리가 아님) ☜ 이 디렉토리에 설치
/bbs/skin/snowboard/ : 스노우보드 스킨 디렉토리
제로보드 파일 수정 (write_ok.php , comment_ok.php)위 두 파일을 열면 5~7째줄에 아래와 같은 코드가 똑같이 들어 있습니다.
include "_head.php";
위 코드의 바로 아랫줄에 아래 코드를 삽입합니다.
include ("./skin/zm_crypt.php" ) ;
저장 후 업로드 하여 덮어씌우시면 됩니다.
스킨 파일 수정 #1 (write.php)① <?=$hide_start?> 코드 아랫줄에 다음 코드 삽입
<? $zCryptClass='input' ; include ("./skin/zm_crypt.php" ) ; ?>
(위에서 input 는 입력 폼의 스타일 클래스(class)입니다. 이해 안 되시면 패쓰!)

이후, 원하시는 위치에 아래와 같이 넣으시면 됩니다.
<?=$zCrypt_Img?> : 보안코드 이미지
<?=$zCrypt_Form?> : 보안코드 입력폼
(<?=$hide_start?> ~ <?=$hide_start?> 안에 넣어야 로그인한 회원에게는 숨길 수 있습니다.)
스킨 파일 수정 #2 (view_write_comment.php)① <?=$hide_c_password_start?> 코드 아랫줄에 다음 코드 삽입
<? $zCryptClass='input' ; include ("./skin/zm_crypt.php" ) ; ?>
(위에서 input 는 입력 폼의 스타일 클래스(class)입니다. 이해 안 되시면 패쓰!)

이후, 원하시는 위치에 아래와 같이 넣으시면 됩니다.
<?=$zCrypt_Img?> : 보안코드 이미지
<?=$zCrypt_Form?> : 보안코드 입력폼
(<?=$hide_c_password_start?> ~ <?=$hide_c_password_end?> 안에 넣어야 로그인한 회원에게는 숨길 수 있습니다.)
설치 완료설치완료되었습니다. 테스트해 보시기 바랍니다.
로그아웃 후 테스트해 보시는 것, 잊지 마세요.
고급 환경설정
환경설정 (zm_crypt.php 수정)20~17줄에는 고급 환경설정 코드가 있습니다.
보안코드 글자색, 바탕색 등을 변경할 수 있습니다.
주석이 자세히 되어 있으므로 쉽게 변경 가능합니다.
기타 문의사항 및 정보
이메일 : ZnMee@naver.com (지앤미)
블로그 : blog.naver.com/ZnMee (知&美 : 앎과 앎다움)
프로그램 : ZM_Crypt 2.0 (2007.07.18. Released)

VC++ UNICODE Build - Configuration

Program Visual C++ 2007. 7. 12. 09:40 Posted by HisPark
1.
메뉴의 Build - Configuration을 선택하면
대화상자가 나오는데 여기서 Add를 눌러줍니다.
그러면 새 설정 이름과 어떤 설정을 복사해서 새 설정을 만들지 선택하게 됩니다.
여기서 적당한 이름을 주세요.

2. Project Settings에서
C/C++ 탭을 선택하신 다음에
Preprocessor Definitions에 _UNICODE를 추가해주세요.

project setting - link - catagory : output - entrypoint symbol -> wWinMainCRTStartup 입력하시면 됩니다..

'Program Visual C++' 카테고리의 다른 글

Microsoft Platform SDK  (0) 2009.02.25
RichEdit 관련  (0) 2008.02.29
ActiveX 보안관련 설정  (0) 2007.05.25
Tray  (0) 2007.05.21
COblist is not safe on Thread  (0) 2007.04.16

ActiveX 보안관련 설정

Program Visual C++ 2007. 5. 25. 14:36 Posted by HisPark
안정성을 보장하는 ActiveX 컨트롤 제작



  일반적인 방식으로(ActiveX 컨트롤 제작에서 설명한 방식) ActiveX 컨트롤을 작성하면, 웹에서 ActiveX 사용의 마지막 부분에 ActiveX 컨트롤과 Html 객체와의 연동 시에 보안 문제가 있다는 것을 설명했다. 이제 그 해결법을 설명하고자 한다.

간단히 설명하면 ActiveX 컨트롤 루틴에 안정성을 보장하는 루틴(안정성을 보장하는 clsid를 레지스트리에 등록하는 루틴)을 추가해야 한다. 먼저 레지스트리에 clsid를 등록하는 함수를 작성하고 실제 ActiveX 컨트롤 제작에서 작성한 컨트롤에 추가를 해보기로 한다.



함수 작성

다음과 같은 내용의 cathelp.h라는 파일을 작성한다.
  

#if !defined(__CATHELP_H)
#define __CATHELP_H

#include "comcat.h"

// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);

// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

#endif



다음과 같은 내용의 cathelp.cpp라는 파일을 작성한다.

#include "stdafx.h"
#include "comcat.h"

// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
        ICatRegister* pcr = NULL ;
        HRESULT hr = S_OK ;

        hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                           NULL,
                                           CLSCTX_INPROC_SERVER,
                                           IID_ICatRegister,
                                           (void**)&pcr);
        if (FAILED(hr))
                return hr;

        // Make sure the HKCR\Component Categories\{..catid...}
        // key is registered
        CATEGORYINFO catinfo;
        catinfo.catid = catid;
        catinfo.lcid = 0x0409 ; // english

        // Make sure the provided description is not too long.
        // Only copy the first 127 characters if it is
        int len = wcslen(catDescription);
        if (len>127)
                len = 127;
        wcsncpy(catinfo.szDescription, catDescription, len);
        // Make sure the description is null terminated
        catinfo.szDescription[len] = '\0';

        hr = pcr->RegisterCategories(1, &catinfo);
        pcr->Release();

        return hr;
}

// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
        ICatRegister* pcr = NULL ;
        HRESULT hr = S_OK ;
        hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                           NULL,
                                           CLSCTX_INPROC_SERVER,
                                           IID_ICatRegister,
                                           (void**)&pcr);
        if (SUCCEEDED(hr))
        {
                // Register this category as being "implemented" by
                // the class.
                CATID rgcatid[1] ;
                rgcatid[0] = catid;
                hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
        }

        if (pcr != NULL)
                pcr->Release();

        return hr;
}



  위의 루틴의 내용을 이해하기 위해서 노력할 필요는 없다. 단지 "레지스트리에 clsid를 등록하는 함수구나"라고만 이해하고 넘어가기 바란다.



Test Control에 추가

App 파일(여기서는 Test.cpp)를 열어 다음과 같이 위에서 작성한 cathelp.h를 include한다.

#include "cathelp.h"

조금 아래에 다음과 같이 _tlid가 선언되어 있는 것을 볼 수 있을 것이다(_tlid에 할당된 값은 프로그램 마다 다르다).

const GUID CDECL BASED_CODE _tlid =
                { 0x9b548709, 0xc3df, 0x4956, { 0x9f, 0x65, 0x29, 0x28, 0xca, 0xbb, 0x6e, 0xc8 } };

바로 아래에 비슷한 3개를 더 등록해야 한다.

두 개는 다음과 같이 안정성을 보장하기 위해 예약된(고정된) clsid이고,

const CATID CATID_SafeForScripting     =
                {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
const CATID CATID_SafeForInitializing  =
                {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};

나머지 하나는 ctrl 파일(여기서는 testctrl.cpp)에 있는 다음과 같은 내용을 복사해 와서,

IMPLEMENT_OLECREATE_EX(CTestCtrl, "TEST.TestCtrl.1",
        0xd886696, 0xc7ce, 0x11d3, 0xa1, 0x75, 0x8, 0, 0x2b, 0xf1, 0x75, 0x7)

다음과 같이 변경(_ctlid 선언)하면 된다.

const GUID CDECL BASED_CODE _ctlid =
        {0xd886696, 0xc7ce, 0x11d3, 0xa1, 0x75, 0x8, 0, 0x2b, 0xf1, 0x75, 0x7}



이제 App 파일에 있는 다음과 같은 함수에 레지스트리 등록 루틴을 추가하면된다.
  

STDAPI DllRegisterServer(void)
{
        AFX_MANAGE_STATE(_afxModuleAddrThis);

        if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
                return ResultFromScode(SELFREG_E_TYPELIB);

        if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
                return ResultFromScode(SELFREG_E_CLASS);

        return NOERROR;
}




추가한 루틴은 다음과 같다.


  

STDAPI DllRegisterServer(void)
{
        AFX_MANAGE_STATE(_afxModuleAddrThis);

        if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
                return ResultFromScode(SELFREG_E_TYPELIB);

        if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
                return ResultFromScode(SELFREG_E_CLASS);

        if (FAILED( CreateComponentCategory(CATID_SafeForScripting, L"Controls that are safely scriptable") ))
                return ResultFromScode(SELFREG_E_CLASS);

        if (FAILED( CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data") ))
                return ResultFromScode(SELFREG_E_CLASS);

        if (FAILED( RegisterCLSIDInCategory(_ctlid, CATID_SafeForScripting) ))
                return ResultFromScode(SELFREG_E_CLASS);

        if (FAILED( RegisterCLSIDInCategory(_ctlid, CATID_SafeForInitializing) ))
                return ResultFromScode(SELFREG_E_CLASS);

        return NOERROR;
}




위 내용 또한 그대로 사용하면 되므로 이해하기 위해서 너무 많은 노력을 들이지는 말기 바란다.

컴파일을 하고 실행을 하면 보안 대화 상자가 생성되지 않고 잘 동작된다는 것을 알 수 있다.

'Program Visual C++' 카테고리의 다른 글

RichEdit 관련  (0) 2008.02.29
VC++ UNICODE Build - Configuration  (0) 2007.07.12
Tray  (0) 2007.05.21
COblist is not safe on Thread  (0) 2007.04.16
GetPrivateProfileString() WritePrivateProfileString()  (0) 2007.04.03

Tray

Program Visual C++ 2007. 5. 21. 16:06 Posted by HisPark
고수닷넷에 있는 내용입니다.(회원가입을 해야 해서...)

http://www.gosu.net/GosuWeb/Article-detail.aspx?ArticleCode=368

1. 트레이 통지와 관련된 함수와 파라미터
BOOL WINAPI Shell_NontifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);

dwMessage로는 다음과 같은 값을 입력할 수 있습니다.
NIM_ADD : 트레이에 새로운 아이콘 추가
NIM_DELETE : 트레이 영역의 아이콘 제거
NIM_MODIFY : 트레이 영역에 있는 아이콘 수정
typedef struct _NOTIFYICONDATA
{
    DWORD    cbSize;
    HWND    hWnd;
    UINT    uID;
    UINT    uFlags;
    UINT    uCallbackMessage;
    HICON    hIcon;
    char    szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

cbSize: 구조체의 크기
hWnd: 윈도우 핸들
uID: 아이콘 식별자, 호출한 애플리케이션의 아이콘을 다른것과 구ㅕㄹ해서 식별할수 있게 해주는 사용자 정의값
uFlags: NIF_MESSAGE : uCallbackMessage 사용 NIF_ICON : hIcon 사용 NIF_TIP : szTip 사용
uCallbackMessage: 아이콘이 hWnd윈도우와 통신하기 위해서 사용할 메시지 ID. 메시지는 WM_APP의 오프셋으로 선언되는 사용자 정의 메시지이다.
hIcon: 화면에 그릴 아이콘의 핸들.
szTip: 아이콘의 툴팁을 위한 텍스트.
2. 트레이에 아이콘 추가
NOTIFYICONDATA    nid;

// 구조체 초기화
ZeroMemory(&nid, sizeof nid);

// 구조체 설정
nid.cbSize = sizeof nid;
nid.hWnd = hWnd;
nid.uID = ICON_ID;
nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE;
nid.uCallbackMessage = WM_MESSAGE;
nid.hIcon = hSmallIcon;
lstrcpy(nid.szTip, "Sample");

// 트레이 영역에 추가
Shell_NotifyIcon(NIM_ADD, &nid);

3. 트레이 아이콘 제거
제거시에는 hWnd와 uID멤버만 셋팅하면 됩니다.

NOTIFYICONDATA    nid;

ZeroMemory(&nid, sizeof nid);

nid.cbSize = sizeof nid;
nid.hWnd = hWnd;
nid.uID = ICON_ID;

Shell_NotifyIcon(NIM_DELETE, &nid);

4. 트레이로 부터의 메시지 수신
마우스와 관련된 메시지만 통지합니다.

wParam : 등록시에 설정한 ID(nid.uID).
lParam : 메시지 종류 (WM_LBUTTONUP, ...).
case WM_MESSAGE:
    if(wParam == ICON_ID)
    {
        switch(lParam)
        {
            case WM_RBUTTONUP:
                // 처리
                break;
        }
    }

    break;

5. Context메뉴
일반적으로 트레이에서 오른쪽 버튼을 누르면 context 메뉴를 화면에 표시합니다. 아래는 그러한 일을 하는 코드의 일부입니다.

POINT pt;
GetCursorPos(&pt);

SetForegroundWindow(hWnd);
TrackPopupMenu(menu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);

주의할 점은 TrackPopupMenu 앞에 SetForegroundWindow API 를 호출해 주고, 후에 WM_NULL 메시지를 포스트 해주어야 합니다. 그렇지 않을 경우 메뉴가 화면에서 사라지지 않는 버그 현상이 생기게 됩니다.

6. For MFC.
아래는 MFC에서 일반적으로 하게 되는 트레이 작업 영역에 추가 및 삭제를 위한 코드의 일부입니다.

6.1 추가
#define WM_TRAYNOTIFY WM_APP + 1

NOTIFYICONDATA    nid;

::ZeroMemory(&nid, sizeof nid);

nid.cbSize        = sizeof nid;
nid.hIcon        = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nid.hWnd        = this->m_hWnd;
nid.uID            = IDR_MAINFRAME;
nid.uFlags        = NIF_TIP | NIF_ICON | NIF_MESSAGE;
nid.uCallbackMessage    = WM_TRAYNOTIFY;

lstrcpy(nid.szTip, "Test");

::Shell_NotifyIcon(NIM_ADD, &nid);

6.2 제거
NOTIFYICONDATA    nid;

::ZeroMemory(&nid, sizeof nid);

nid.cbSize    = sizeof nid;
nid.uID        = IDR_MAINFRAME;
nid.hWnd    = this->m_hWnd;

::Shell_NotifyIcon(NIM_DELETE, &nid);

6.3 메시지 처리
ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)

LONG TestDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
    CMenu    menu, *pTrayMenu;
    CPoint    pt;

    if(wParam == IDR_MAINFRAME)
    {
        switch(lParam)
        {
        case WM_RBUTTONUP:
            menu.LoadMenu(IDR_TRAYMENU);
            pTrayMenu = menu.GetSubMenu(0);

            ::GetCursorPos(&pt);

            SetForegroundWindow();
            pTrayMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this, NULL);
            SetForegroundWindow();

            pTrayMenu->DestroyMenu();
            menu.DestroyMenu();
            break;

        case WM_LBUTTONDBLCLK:
            if(!IsWindowVisible())
                ShowWindow(SW_SHOW);

            SetForegroundWindow();
            break;
        }
    }

    return 0;
}

'Program Visual C++' 카테고리의 다른 글

VC++ UNICODE Build - Configuration  (0) 2007.07.12
ActiveX 보안관련 설정  (0) 2007.05.25
COblist is not safe on Thread  (0) 2007.04.16
GetPrivateProfileString() WritePrivateProfileString()  (0) 2007.04.03
Invoke 오버라이드  (0) 2007.03.29