MFC ActiveX에서 매개변수로 배열 받기

Posted by 빵빵빵
2013/04/22 19:12 전산(컴퓨터)/PC-Windows



출처 : http://surfree.egloos.com/2810522

ActiveX를 만들때 매개변수로 배열을 받아야 할 필요가 있다.
많은 일련의 데이터를 한번에 받기 위해서 보통 문자열에 분리자(Separator)로 분리해서 문자열로 입력하는것이 보통인데
배열을 받는 방법은 없을까 해서 알아보았다.
일단 먼저 웹 스크립트에서 배열을 사용하는 방법을 알아보자. 배열은 다음과 같이 쓸수 있다.
자바 스크립트라면,



또는 VB Script라면,



이 배열을 ActiveX의 매개변수에 어떻게 넣느냐가 문제이다. 일단 기본 데이터 형식은 아니기 때문에, VARIANT 형식으로 받아야 하겠다.
ActiveX의 메소드는 다음과 같이 정의를 하도록 하자.
void ShowArray(VARIANT varArray)
나는 VS2003을 쓰는데, 휴.. MFC ActiveX에서 이렇게 메소드를 만들자마자 버그코드를 만들기 시작한다.
IDL의 선언은 void ShowArray(VARIANT varArray); 로 정의되고,
컨트롤 소스에는 void ShowArray(VARIANT varArray);로 정의되었다. ㅠㅠ
컨트롤 소스가 잘못 생성되어서 나왔다.

일단 void ShowArray(LPVARIANT varArray); 로 정의를 변경해야 한다.

이놈의 VS2003 버그..ㅠㅠ 너무 많다..
배열을 VARIANT값으로 입력을 받을때 Java Script(JScript)와 VB Script는 다른 형식으로 입력된다.
Java Script(이하 JScript)는 VT_DISPATCH 형식으로 들어오고,
VB Script는 VT_ARRAY | VT_BSTR | VT_BYREF 형식으로 들어온다.
VB Script 배열 형식을 받아서 처리할 수 있는 예제는 인터넷에 널려있을것이다.
문제는 JScript 배열 형식을 받아서 처리하는 예제는 찾기가 어렵다.(나만 못찾는건지.)
일단 JScript 배열을 처리하려면, JScript 배열의 길이를 알아야 하지 않는가? 다음은 배열의 값이 접근을 할 수 있어야 하고...
JScript의 배열의 길이와 값에 접근 하기위해서는 다음과 같이 코딩해야한다.



예제를 보면 JScript 배열이 어떻게 구성되어 있는지 볼 수 있다.
여기서 특이한 점은 속성값의 DISPID이다.
TRACE를 따라가다보면 알겠지만, 배열의 크기가 3이라고 할때,
length의 DISPID는 4
"0"~"2"까지의 DISPID는 1~3
이다.
그럼 DISPID 0값은 무엇일까?
DISPID 0값은 "1, 2, 3" 이런식으로 모든 배열의 데이터가 ","로 분리되어서 나온다.
DISPID 5,6 값이 VT_DISPATCH로 되어 있고, 각각 constructor, prototype이라는 속성이 지원되는데, 특별히 사용할 때는 없는 듯하다.
위의 JScript 예제에서
alert(arrArray);
라고 하면 DISPID 0값이 나오는 것으로 확인할 수 있겠다.
실제 작성한 코드는 VARIANT 형식으로
배열(JScript와 VBScript 상관없이) 또는 한개의 문자열을 받는 메소드 이지만 그중에서 JScript 처리 부분만 간추려서 올린다.
혹시나 ActiveX에서 VARIANT값으로 배열을 받아야 할 개발자들을 위해 포스팅.^^

2013/04/22 19:12 2013/04/22 19:12

우분투에서 방화벽 설정하기

Posted by 빵빵빵
2013/04/18 09:52 전산(컴퓨터)/리눅스



출처 : http://ubuntu.or.kr/wiki/doku.php?id=program:ufw%EC%84%A4%EC%A0%95

UFW는 Uncomplicated Firewall 이라구 하는데 우분투에서 사용가능하게 만들어진 것 입니다.

iptables를 설정하다 보면, 잘못 설정할 수도 있고 아주 어려운 편 입니다.

그에 비해 UFW는 매우 쉬운 편이죠. 그렇다고 마구 설정하다 보면 서버에 문제가 생길 수 도 있습니다.

UFW 설치법

  • sudo aptitude install ufw

UFW 사용법

방화벽 활성화, 비활성화(On/Off)하기

  • 사용 하기 (On) sudo ufw enable
  • 사용하지 않기 (OFF) sudo ufw disable

기본적인 룰을 적용.

  • 전부 막기 sudo ufw default deny
  • 전부 열기 sudo ufw default allow

UFW 설정 옵션들.

DENY (거부) 리스트에 더하는 방법.

거부 포트를 추가할때.

  • sudo ufw deny <port>/<optional: protocol>

–> 예를들면, sudo ufw deny 80

–> sudo ufw deny 53/tcp 아니면 udp

서비스 이름으로 거부 등록할때.

  • sudo ufw deny <service name>

–> sudo ufw deny ssh

거부 아이피를 추가할때.

  • sudo ufw deny from <ip address>

–> sudo ufw deny from 121.121.121.121

특정 아이피에서 포트 거부방법

  • sudo ufw deny from <ipaddress> to port <port number>

–> sudo ufw deny from 121.121.121.121 to port 22

–> sudo ufw deny from 121.0.0.1/24 to any port 22

   이건 121.0.0.1~121.0.0.255 까지 port 22로 접속 불가능

주) 121.0.0.1/24 인데 왜 1~255까지일까...? 누가 설명줌 해주삼...

ALLOW (허가) 리스트에 더하는 방법.

허가 포트를 추가할때.

  • sudo ufw allow <port>/<optional: protocol>

–> sudo ufw allow 80

–> sudo ufw allow 80/udp 아니면 tcp

서비스 이름으로 허가 추가할때.

  • sudo ufw allow <service name>

–> sudo ufw allow ssh

허가 아이피를 추가할때.

  • sudo ufw allow from <ip address>

–> sudo ufw allow from 121.121.121.121

특정 아이피에서 포트 허용방법

  • sudo ufw allow from <ipaddress> to port <port number>

–> sudo ufw allow from 121.121.121.121 to port 22

–> sudo ufw allow from 121.0.0.1/24 to any port 22

추가한 Rule들을 보고 싶을 때.

  • sudo ufw status

적용한 Rule들 삭제하는 방법.

  • sudo ufw delete <rule type> from <ip address> to any port <port number>

–> sudo ufw delete deny from 121.121.121.121

–> sudo ufw delete allow 80/tcp

–> sudo ufw delete deny from 121.121.121.121 to port 22

Example.

이렇게 설정할때,

sudo ufw deny from 192.168.0.1 to any port 22

sudo ufw deny from 192.168.0.7 to any port 22

sudo ufw allow from 192.168.0.0/24 to any port 22

sudo ufw status 치면.

To Action From

– —— —-

22:tcp DENY 192.168.0.1

22:udp DENY 192.168.0.1

22:tcp DENY 192.168.0.7

22:udp DENY 192.168.0.7

22:tcp ALLOW 192.168.0.0/24

22:udp ALLOW 192.168.0.0/24

2013/04/18 09:52 2013/04/18 09:52

콜스택 로그 남기기

Posted by 빵빵빵
2013/03/19 19:17 전산(컴퓨터)/PC-Windows



출처 : http://www.codeproject.com/Articles/12949/A-Simple-C-Function-Call-Stack-Trace-Utility

<code>
// trace.hpp #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdarg.h> #include <string>
#define CM_TRACE_FILE(trace_file) cm::Trace::LogToFile(trace_file)

#define CM_TRACE_FUNC(func_name)    cm::Trace __CM_TRACE__(func_name, "()")
#define CM_TRACE_FUNC_ARG1(func_name, argfmt, arg)   \
            cm::Trace __CM_TRACE__(func_name, argfmt, arg)
#define CM_TRACE_FUNC_ARG2(func_name, argfmt, arg1, arg2)   \
            cm::Trace __CM_TRACE__(func_name, argfmt, arg1, arg2)
// more macros define....
namespace cm
{
    class Trace
    {
    public:
    explicit Trace(char *func_name, const char* argsfmt, ...)
    {
            char fmt[256] ={0};
            sprintf(fmt, "%s%s", func_name, argsfmt);
       va_list arglist;
       va_start(arglist, argsfmt);
    LogMsg(depth_, depth_ * 2, fmt,  arglist);
    va_end(arglist);
    ++depth_;
    }

    ~Trace()
    {
    --depth_;
    }

    /// special the global log file.     void static LogToFile(const char *trace_file)
    {
    trace_file_ = trace_file;
    }

    private:
    void LogMsg(int depth, int align, const char *fmt, va_list args)
    {
    FILE *fp = fopen(trace_file_.c_str(), "a+");
    if (fp == NULL)
    {
    return;
    }


    time_t curTime;
    time(&curTime);

    char timeStamp[32] = { 0 };
    strftime(timeStamp, sizeof(timeStamp),
"%Y%m%d.%H%M%S", localtime(&curTime));

    // only log the timestamp when the time changes     unsigned int len = fprintf( fp, "%s %*.*s> (%d)",
    (last_invoke_time_ != curTime) ?
timeStamp : " ",
    2 * depth,
    2 * depth,
    nest_,
    depth);
    last_invoke_time_ = curTime;
    len += vfprintf(fp, fmt, args);
    len += fwrite("\n", 1, 1, fp);
    fflush(fp);
    fclose(fp);
    }

    private:
    // the debug trace filename     static std::string trace_file_;

    // function call stack depth     static int depth_;
    static const char*  nest_;
    static time_t       last_invoke_time_;
    };

    std::string Trace::trace_file_  = "";
    int         Trace::depth_       = 0;

    // arbitrarily support nesting 34 deep for no particular reason     const char* Trace::nest_        =
"| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ";
    time_t      Trace::last_invoke_time_ = 0;
} // end namespace cm #endif // CM_TRACE_20060209_HPP
</code>

<code>
#include "cm/trace.hpp"
void foo()
{
CM_TRACE_FUNC("foo");
}

void bar(int x)
{
CM_TRACE_FUNC_ARG1("bar", "(%d)", x);
foo();
}

void foobar(int x, const char* s)
{
    CM_TRACE_FUNC_ARG2("foobar", "(%d, %s)", x, s);
    bar(789);
}

void foobar3(int x, int y, double z)
{
    CM_TRACE_FUNC_ARG3("foobar3", "(%d, %d, %f)", x, y, z);
    foobar(123, "4546");
}

int main()
{
    CM_TRACE_FILE("./trace.log");
    CM_TRACE_FUNC("main");
    foo();
    bar(23);
    foobar(33, "char");
    foobar3(12, 23, 34.45);
    return 0;
}
</code>


20060211.132431 > (0)main()
                | > (1)foo()
                | > (1)bar(23)
                | | > (2)foo()
                | > (1)foobar(33, char)
                | | > (2)bar(789)
                | | | > (3)foo()
                | > (1)foobar3(12, 23, 34.450000)
                | | > (2)foobar(123, 4546)
                | | | > (3)bar(789)
                | | | | > (4)foo()

2013/03/19 19:17 2013/03/19 19:17