// Api 윈도우 생성까지 대기
        if (ApiState(APISTATE_NONE))
        {
                while (ApiState(APISTATE_NONE)) { ::Sleep(10); }
        }

        // Api가 이미 사용가능함
        if (ApiState(APISTATE_USEABLE))
                return APISTATE_USEABLE;

        // Api 초기화
        PostThreadMessage(WMU_POST_STARTUP, 0, 0);
        while (ApiState(APISTATE_COMPLETE_INIT_CORE)) { ::Sleep(10); }        

        // Api 초기화 실패
        if (ApiState(APISTATE_FAIL_INIT))
        {
                _apiState.Set(APISTATE_NONE);
                return APISTATE_FAIL_INIT;
        }

        // Api 로그인
        _LoginInfo* loginInfo = new _LoginInfo(id, password, officialPassword, serverType);
        PostThreadMessage(WMU_POST_LOGIN, (WPARAM)loginInfo, 0);
        int cnt = 0;
        while (ApiState(APISTATE_COMPLETE_LOGIN)) 
        {        
                // timeout
                if (cnt > 500)
                {
                        _apiState.Set(APISTATE_NONE);
                        return APISTATE_FAIL_LOGIN;
                }

                ::Sleep(10); 
                ++cnt; 
        }

        // Api 로그인 실패
        if (ApiState(APISTATE_FAIL_LOGIN))
        {
                _apiState.Set(APISTATE_NONE);
                return APISTATE_FAIL_LOGIN;
        }

        return APISTATE_USEABLE;