function OnEnd()
    string szProgram, szCmdLine;
begin
    szProgram = WINSYSDIR ^ "regsvr32.exe ";
    szCmdLine = TARGETDIR ^ "파일이름";
    //LongPathToShortPath (szCmdLine);
    LongPathToQuote (szCmdLine, TRUE);
    MessageBox(szCmdLine, INFORMATION);
    LaunchAppAndWait(szProgram, szCmdLine, WAIT/*LAAW_OPTION_CHANGEDIRECTORY |  LAAW_OPTION_FIXUP_PROGRAM /*LAAW_OPTION_WAIT*/); 
end;
u_long option = TRUE;
ioctlsocket(hClntSock, FIONBIO, &option);
// 길이를 구하고
int nMultiByteLen = WideCharToMultiByte(CP_ACP, 0, pwcName, -1, NULL, 0, NULL, NULL);

// 변환한다.
WideCharToMultiByte(CP_ACP, 0, pwcName, -1, szName, nMultiByteLen, NULL, NULL);
필터클래스 상위 부분에

// 인터페이스 선언
#ifdef __cplusplus
extern "C" {
#endif
    // {45F7E6B9-861F-46fb-9549-7F70EB5DCFF0}
        DEFINE_GUID(IID_INetworkTCP,
                0x45f7e6b9, 0x861f, 0x46fb, 0x95, 0x49, 0x7f, 0x70, 0xeb, 0x5d, 0xcf, 0xf0);
        
        
    DECLARE_INTERFACE_(INetworkTCP, IUnknown)
    {
        STDMETHOD(LoadMessageBox) (THIS_  char*  msg) PURE;
    };
        
#ifdef __cplusplus
}
#endif

//////////////////////////////////////////////////////////////////////////

위와 같이 인터페이스를 선언해주고

class CNetworkTCPStream;

인터페이스를 상속받는다.

class CNetworkTCPFilter : public CSource
, public INetworkTCP
{
        friend class CNetworkTCPStream;

public:
        CNetworkTCPFilter(LPUNKNOWN pUnk, HRESULT *phr);
        virtual ~CNetworkTCPFilter(void);

// static
public:
        static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);

// Attributes
public:

// Operations
public:

        // 이 메소드는 인터페이스의 가상함수. 구현하여준다.
        STDMETHODIMP LoadMessageBox(char* msg) {
                MessageBox(NULL, msg, NULL, NULL);
        }


// Overrides
protected:

// Implementations
protected:

        // 인터페이스를 외부에 노출시킨다
        DECLARE_IUNKNOWN;
        STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
                if(riid == IID_INetworkTCP)
                        return GetInterface((INetworkTCP*)this, ppv);
                else
                        return CSource::NonDelegatingQueryInterface(riid, ppv);
        }


// member variables
private:
};

위와 같이 하면 인터페이스를 상속받고 구현하여 노출시키면 사용할 수 있다.

사용방법은 어플리케이션에서 인터페이스 선언부분을 가져다 적어주고

인터페이스를 호출하여 사용하면 된다.

예)

INetworkTCP* pITCP;
pFilterNetworkTCPFilter->QueryInterface(IID_INetworkTCP, (void**)&pITCP);
pITCP->LoadMessageBox("Test");

SQL 2000 Server 서비스 팩 설치시 오류 대처방법

스크립트 실행 중 오류 발생 '80sp1-tools.sql (1)'



1. 쿼리분석기로 SQL Server 에 접속한다.

2. DBCC CHECKDB('dbname', NOINDEX) 로 지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사한다.

NOINDEX - 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않도록 지정한다. NOINDEX는 사용자 정의 테이블의 클러스터되지 않은 인덱스를 검사하지 않으므로 전체 실행 시간이 줄어든다. DBCC CHECKDB에서 모든 시스템 테이블 인덱스를 검사하므로 NOINDEX는 시스템 테이블에 어떤 영향도 주지 않는다.

-------------------------------------
NOINDEX 에 쓰일 수 있는 다른 옵션들 ↓

REPAIR_ALLOW_DATA_LOSS - REPAIR_REBUILD에서 수행하는 모든 복구 작업을 수행하며 할당 오류, 구조적 행 오류나 페이지 오류, 손상된 텍스트 개체 삭제를 수정하기 위한 행과 페이지의 할당 및 할당 취소가 포함된다. 이러한 복구를 할 경우 일부 데이터가 손실될 수 있다. 복구 작업은 사용자가 변경 사항을 롤백할 수 있도록 사용자 트랜잭션 내에서 수행된다. 복구가 롤백되어도 데이터베이스에는 오류가 그대로 포함되므로 백업에서 데이터베이스를 복원해야 한다. 제공된 복구 수준 때문에 오류 복구를 생략한 경우 해당 복구에 종속적인 모든 복구도 생략된다. 복구를 완료한 후 데이터베이스를 백업한다.

REPAIR_FAST - 클러스터되지 않은 인덱스의 별도 키를 복구하는 것과 같이 사소하고 시간이 소요되지 않는 복구 작업을 수행한다. 이러한 복구는 데이터 손실의 위험 없이 빨리 실행할 수 있다.

REPAIR_REBUILD - REPAIR_FAST에서 이루어지는 모든 복구 작업을 수행하고 인덱스 다시 작성과 같이 시간이 소요되는 복구를 포함한다. 이러한 복구는 데이터 손실의 위험 없이 실행할 수 있다.
-------------------------------------

3. 검사하여 오류가 발생하는 데이터베이스를 위의 옵션으로 적절히 사용하여 복구한다.
이때 단일사용자 모드로 설정해야 한다.
sp_dboption dbname, single, true

4. 복구되면 단일사용자 모드 해제한다.
sp_dboption dbname, single, false

5. 서비스 팩을 다시 설치한다.


void CTestDlg::TrayIcon()
{
        if(!m_TaskFlag)
        {
                ShowWindow(SW_HIDE);
                NOTIFYICONDATA nid;
                nid.cbSize = sizeof(nid);
                nid.hWnd = m_hWnd;    //현재 다이얼로그의 윈도우 핸들
                nid.uID = IDR_MAINFRAME;   //아이콘의 리소스ID
                nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
                nid.uCallbackMessage = UM_ICONNOTIFY; //우리가 만든 메시지
                nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
                lstrcpy(nid.szTip,"우리가 만든 태스크바"); // 툴팁
                Shell_NotifyIcon(NIM_ADD,&nid);
                // taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
                SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);
                // taskBar 상태영역에 아이콘 설정
                m_TaskFlag = TRUE;
        }
}

이 함수를 실행하면 현재의 창이 사라지면서 트레이 아이콘이 생깁니다.


void CDetectPointDlg::TrayCallback(WPARAM wParam, LPARAM lParam)
{
    switch(lParam)
    {
        case WM_RBUTTONDOWN:
                AfxMessageBox("트레이 아이콘!");
                break;
        case WM_LBUTTONDOWN:
                ShowWindow(SW_SHOW);
                m_TaskFlag = FALSE;
                break;

        case WM_RBUTTONDBLCLK:
                CMenu menu, *pSubMenu;
                if(!menu.LoadMenu(IDR_MENU)) return 0;
                if(!(pSubMenu = menu.GetSubMenu(0))) return 0;
                CPoint pos;
                GetCursorPos(&pos);
                SetForegroundWindow();
                pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);
                menu.DestroyMenu();
                break;        
    }
}
이 함수는 오른쪽 밑에 있는 트레이 아이콘에 대한 이벤트 처리하는 부분이고요...

BEGIN_MESSAGE_MAP에 메세지 연결 해주시고...

ON_MESSAGE(UM_ICONNOTIFY,TrayCallback)  // 메시지 추가

#define UM_ICONNOTIFY WM_USER+6001
이것두 추가해 주셔야 합니다...



// 트레이 종료..
Shell_NotifyIcon(NIM_DELETE, &nid);
char szPath[MAX_PATH] = {0,};    // 경로 받아올 변수
SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, FALSE);
Oracle 10g 에서 Recycle Bin 기능이 생겼다.

9i 까지는 DROP TABLE 명령으로 잘못지운 테이블이 복구가 불가능 했었다.

10g 에서는 DROP TABLE 명령으로 지운 후 테이블을 검색해보면

BIN$........... 라는 새로운 테이블이 생성되는 것을 볼 수 있다.

이것을

SQL> SHOW RECYCLEBIN;

해보면,

ORIGINAL_NAME 을 알 수 있도록 표시된다.

이 테이블들은 FLASHBACK 기능으로 되살릴 수 있다.

만약 DROP시킨 테이블명이 TB_USER 라고 한다면, SHOW RECYCLEBIN; 으로 검색한 결과에

ORIGINAL_NAME 에 TB_USER라고 표시될 것이다.

되살리기 위해선

SQL> FLASHBACK TABLE TB_USER TO BEFORE DROP;

위와 같이 명령하면 된다.


또한, RECYCLEBIN 을 비우기 위해선,

SQL> PURGE RECYCLEBIN;


테이블을 DROP 할때 RECYCLEBIN 에 넣지 않고 바로 삭제하는 명령은,

SQL> DROP TABLE TB_USER PURGE;

위와 같이 해주면 된다.


오라클의 XDB listener 의 포트와 Apache Tomcat 의 포트가 기본적으로 8080으로 동일하다.

Apache Tomcat 의 포트를 변경하는 방법도 있겠지만,

외국사이트를 검색결과 XDB listener 의 포트를 변경하는 방법이 있드라~

명령프롬프트에서 lsnrctl status 를 입력하거나 아래의 쿼리를 사용하면,

ftp 와 http 이 각각 2100 과 8080 으로 설정된 것을 볼 수 있다.

SELECT dbms_xdb.cfg_get "xdbconfig.xsd" FROM dual;

이 설정을 바꿔보겠다.

아래의 스크립트 문장으로 각각 6010 와 6020 으로 변경할 수 있다.

이 스크립트는 auto commit 이다.

declare
newconfig XMLType;
begin
    --ftp port setting
    select updatexml(
    dbms_xdb.cfg_get(),'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',6010) into newconfig from dual;
    dbms_xdb.cfg_update(newconfig);
    --http port setting
    select updatexml(
    dbms_xdb.cfg_get(),'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',6020) into newconfig from dual;
    dbms_xdb.cfg_update(newconfig);
end;
/
리스너를 재시작한다.

lsnrctl status 로 확인하면, 변경된 것을 확인해 볼 수 있다.
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);