한국 여미지식물원(yeomiji botanical garden) : 자연 속 아름다움을 만나는 힐링의 여정

한국 여미지식물원(yeomiji botanical garden) : 자연 속 아름다움을 만나는 힐링의 여정 

힐링과 자연이 주는 고마움을 얻는 시간

제주도의 날씨는 시시각각 변하기에 야외 활동에 좋은 명소가 많지만, 비오는 날은 밖에서 활동하기가 제한적인데, 여미지식물원은 맑은 날이나 비가 오는 날에도 관람하기 좋은 장소입니다. 야외 공간도 많은 식물이 있지만, 실내 온실에 꽃과 열대 과일 등 많은 볼거리가 있습니다. 혹시 제주도 여행에 비로 인하여 야외 활동에 제한적이다면, 여미지식물원을 추천합니다.

정문
여미지식물원 정문

여미지식물원의 돔형식의 전망대를 가진 외부 전경입니다.

여미지식물원
여미지식물원

여미지식물원 전망대에서 바라본 한라산 정상입니다. 한라산 정상은 1년에 몇 번 못 본다는데, 이날은 하루 종일 한라산을 볼 수 있었답니다.

한라산 정상
여미지식물원에 바라본 한라산 정상

자연이 우리에게 주는 고마움

식물원에서 우리가 느끼거나 배워야 할 사항이 있습니다. 식물이 우리 환경에 끼치는 영향이 크다는 것을 알고 보면 어떨까 합니다. 식물은 우리 지구 생태계에서 매우 중요한 역할을 수행합니다. 

  • 산소 생산: 식물은 광합성 과정을 통해 이산화탄소를 흡수하고 산소를 생산합니다. 이산화탄소를 흡수하여 대기 중의 온실가스 농도를 줄이고, 공기를 정화하여 우리가 숨 쉬는 데 필요한 산소를 공급합니다.
  • 생태학적 기능: 식물은 다양한 생물들의 서식지를 제공하며, 생태계를 안정시키고 유지하는 데 중요한 역할을 합니다. 나무의 잎, 꽃, 열매는 다양한 동물과 곤충에게 음식과 서식지를 제공합니다.

  • 토양 보호: 나무의 뿌리는 토양을 고정시키고 토사유출을 막아 토양을 보호합니다. 이로 인해 토양 침식이 줄어들고, 홍수와 지질폭발을 예방하는 데 도움이 됩니다.
  • 기후 조절: 나무들이 자라는 산림은 지구 기후를 조절하는데 기여합니다. 나무들이 일년 내내 일정한 온도와 습도를 유지하며, 지구의 기후 변화에 영향을 미칩니다.

  • 목재 및 자원 공급: 나무는 건축, 가구, 우리 일상 생활에서 사용되는 목재로 사용되어 가장 기본적이면서도 중요한 자원으로 사용됩니다. 또한 산불 예방, 휴양, 관광 등 여러 산업에 이용됩니다.
  • 미적 가치: 나무들은 우리 주변의 자연을 아름답게 꾸며주고, 풍경을 일그러뜨리는데 큰 역할을 합니다. 푸른 숲과 심록에는 우리에게 정서적인 안정감과 위안을 주는 미적 가치가 있습니다.

따라서 우리는 나무의 중요성을 이해하고 보호하여 지속 가능한 환경과 생태계를 유지하는 데 기여해야 합니다.

GetWindowThreadProcessId()의 반환값 저장하기

GetWindowThreadProcessId()의 반환값 저장하기 

GetWindowThreadProcessId(reinterpret_cast<HWND>(hInst), &processId);의 반환값을 저장하는 방법은?

GetWindowThreadProcessId 함수는 성공적으로 실행되면 0 이외의 값을 반환합니다. 반환값이 0일 경우에는 함수 호출이 실패한 것을 의미합니다. GetWindowThreadProcessId 함수의 반환값은 다음과 같은 경우에 실패할 수 있습니다.

  • 윈도우 핸들(HWND)이 유효하지 않을 때 (NULL인 경우 등).
  • 해당 윈도우에 대한 정보를 가져올 수 없는 경우 (잘못된 핸들, 다른 권한으로 실행 중인 등).

따라서 반환값을 저장하는 방법은 다음과 같이 GetWindowThreadProcessId 함수의 반환값을 확인하여 처리하는 것입니다.


HINSTANCE hInst;

DWORD processId = 0; // 기본적으로 0으로 초기화


hInst = ShellExecute(NULL, "open", strPath, NULL, NULL, SW_SHOW);


if (reinterpret_cast<int>(hInst) > 32) // ShellExecute 함수가 성공하면 반환값은 32보다 큼

{

    // ShellExecute 함수가 성공적으로 실행되었다면, 윈도우 핸들로부터 프로세스 ID를 가져온다.

    if (GetWindowThreadProcessId(reinterpret_cast<HWND>(hInst), &processId) != 0)

    {

        // GetWindowThreadProcessId 함수가 성공적으로 실행되었으며, processId 변수에 프로세스 ID가 저장됨.

        // 추가로 프로세스와 상호작용하는 로직을 작성할 수 있음.

    }

    else

    {

        // GetWindowThreadProcessId 함수 호출이 실패한 경우에 대한 오류 처리

    }

}

else

{

    // ShellExecute 함수 호출이 실패한 경우에 대한 오류 처리

}

위의 코드에서는 GetWindowThreadProcessId 함수가 성공적으로 실행되면 processId 변수에 프로세스 ID가 저장됩니다. 호출 결과가 0인 경우(실패)에는 적절한 오류 처리를 수행할 수 있습니다. 주의해야 할 점은 ShellExecute 함수와 GetWindowThreadProcessId 함수가 모두 성공했을 때만 processId에 올바른 값을 가지게 됩니다.

GetWindowThreadProcessId(reinterpret_cast<HWND>(hInst), &processId) 코드가 실패로 나오는 이유는?

GetWindowThreadProcessId 함수가 실패하는 경우는 일반적으로 다음과 같은 이유들이 있을 수 있습니다.

  • 올바르지 않은 윈도우 핸들(HWND): GetWindowThreadProcessId 함수는 윈도우 핸들을 사용하여 해당 윈도우가 속한 프로세스의 ID를 가져옵니다. 윈도우 핸들이 NULL인 경우나 유효하지 않은 핸들인 경우에는 함수가 실패하게 됩니다.

  • 해당 윈도우에 대한 정보를 가져올 수 없는 경우: GetWindowThreadProcessId 함수는 윈도우 핸들이 유효하더라도, 해당 윈도우에 대한 정보를 가져올 수 없는 상황에서 실패할 수 있습니다. 예를 들어, 윈도우가 이미 종료되었거나 윈도우를 소유한 프로세스의 권한이 부족한 경우에는 함수가 실패할 수 있습니다.
  • 적절한 권한이 없는 경우: 프로세스 정보를 가져오기 위해서는 관리자 권한으로 실행되는 경우가 일반적입니다. 관리자 권한으로 실행되지 않았을 경우, 일부 윈도우에 대한 정보에 접근할 수 없어 함수가 실패할 수 있습니다.

따라서 GetWindowThreadProcessId 함수가 실패한 경우, 위와 같은 상황들을 확인해봐야 합니다. 예를 들어, ShellExecute 함수가 반환한 hInst 변수에 올바른 윈도우 핸들이 들어있는지, 해당 윈도우에 대한 정보를 가져올 수 있는 권한이 있는지, 프로세스가 이미 종료되었는지 등을 확인하여 문제를 파악해야 합니다.

이를 위해 디버깅을 활용하여 윈도우 핸들과 프로세스 ID 값을 출력하거나, GetLastError 함수를 사용하여 추가적인 오류 정보를 확인하는 등의 방법을 사용하여 실패 원인을 찾을 수 있습니다.

ShellExecute()에서 윈도우 핸들(Window handle)을 저장하는 코드

ShellExecute()에서 윈도우 핸들(Window handle)을 저장하는 코드 

hInst = ShellExecute(NULL, "open", strPath, NULL, NULL, SW_SHOW); 의 코드에서 윈도우 핸들을 저장하는 코드는?

ShellExecute 함수는 새로운 프로세스를 실행하는데 사용되며, 해당 프로세스를 실행한 후 새로 생성된 프로세스의 핸들을 반환하지는 않습니다. 따라서 ShellExecute 함수 자체로는 직접 실행한 프로세스의 핸들을 얻을 수 없습니다.


하지만 ShellExecuteEx 함수를 사용하면 프로세스의 핸들을 얻을 수 있습니다. ShellExecuteEx 함수는 SHELLEXECUTEINFO 구조체를 인자로 받아 해당 프로세스를 실행하고, 그 결과로 새로 생성된 프로세스의 핸들을 얻을 수 있습니다.


다음은 ShellExecuteEx 함수를 사용하여 윈도우 핸들을 얻는 방법의 예시 코드입니다.


#include <Windows.h>

#include <Shellapi.h>


int main()

{

    SHELLEXECUTEINFO info = { sizeof(SHELLEXECUTEINFO) };

    info.lpVerb = _T("open");

    info.lpFile = _T("YOUR_PROGRAM.EXE"); // 실행할 프로그램의 경로

    info.nShow = SW_SHOW;


    if (ShellExecuteEx(&info))

    {

        // 프로세스 실행 성공

        // info.hProcess 변수에 새로 실행된 프로세스의 핸들이 저장됨

        // 이 핸들을 사용하여 해당 프로세스와 상호작용할 수 있음

        HANDLE hProcess = info.hProcess;


        // 프로세스와 상호작용을 위한 추가 로직 작성

        // ...


        // 프로세스 종료

        CloseHandle(hProcess);

    }

    else

    {

        // 프로세스 실행 실패

        // 오류 처리

    }


    return 0;

}

위의 코드에서 info.hProcess 변수에 새로 생성된 프로세스의 핸들이 저장되며, 이를 사용하여 해당 프로세스와 상호작용할 수 있습니다. 주의해야 할 점은, ShellExecuteEx 함수가 프로세스를 실행한 후에는 적절히 해당 프로세스와 상호작용을 처리해야 하며, 마지막에 CloseHandle 함수를 사용하여 프로세스 핸들을 닫아야 합니다.

GetWindowThreadProcessId()에서 processId에 값이 안 들어오는 이유

GetWindowThreadProcessId()에서 processId에 값이 안 들어오는 이유는? 


HINSTANCE hInstance;

DWORD processId;

hInstance = m_arHinstanceList.GetAt(i);

GetWindowThreadProcessId(reinterpret_cast<HWND>(hInstance), &processId); 

의 코드에서 processId에 값이 안 들어오는 이유는?


GetWindowThreadProcessId 함수를 사용하여 processId에 값이 들어오지 않는 이유는 hInstance 변수에 올바른 윈도우 핸들이 전달되지 않았기 때문입니다.

GetWindowThreadProcessId 함수는 윈도우 핸들을 사용하여 해당 윈도우가 속한 프로세스의 ID를 가져오는 함수입니다. 하지만 주어진 코드에서는 hInstance 변수에는 HINSTANCE 타입의 값이 전달되고 있습니다.

HINSTANCE는 윈도우 핸들이 아닌, 모듈 핸들을 의미하는 데이터 타입입니다. 일반적으로 HINSTANCE는 응용 프로그램의 인스턴스 핸들로 사용되며, 윈도우 핸들과는 다른 개념입니다.

따라서 hInstance 변수에는 윈도우 핸들이 아닌 모듈 핸들이 저장되어 있기 때문에 GetWindowThreadProcessId 함수는 윈도우 핸들이 필요한데 윈도우 핸들이 아니므로 정상적으로 프로세스 ID를 얻어올 수 없는 것입니다.

올바른 윈도우 핸들을 사용하여 processId에 값을 가져오려면, hInstance 변수에 윈도우 핸들을 저장해야 합니다. 윈도우 핸들은 일반적으로 CreateWindow 또는 FindWindow와 같은 함수를 사용하여 생성하거나 검색하여 얻어올 수 있습니다.

정확한 수정 방법은 주어진 코드의 맥락과 사용하는 HINSTANCE 값을 알아야 하기 때문에, 이를 보완한 코드는 다음과 같이 될 수 있습니다.


// 예제: 윈도우 핸들을 얻어서 processId에 저장하는 방법

HINSTANCE hInstance;

HWND hWnd;

DWORD processId;


hInstance = m_arHinstanceList.GetAt(i);  // 윈도우 핸들이 아닌 모듈 핸들이 저장된다고 가정


// 모듈 핸들로 윈도우 핸들을 얻어온다 (예제에서는 모듈 핸들로부터 윈도우 핸들을 찾는 것으로 가정)

hWnd = FindWindow(NULL, _T("윈도우 타이틀")); // 윈도우 타이틀을 변경하여 실제 윈도우 핸들을 찾아야 합니다.


if (hWnd != NULL)

{

    GetWindowThreadProcessId(hWnd, &processId); // 올바른 윈도우 핸들로 프로세스 ID를 얻어온다.

}

이와 같이 올바른 윈도우 핸들을 사용하여 GetWindowThreadProcessId 함수를 호출하면 processId 변수에 올바른 값을 얻을 수 있습니다. 하지만 정확한 수정 방법은 코드가 사용하는 HINSTANCE의 의미와 m_arHinstanceList의 내용에 따라 다를 수 있으므로 주의해서 구현해야 합니다.

MFC에서 GetLastError() 함수의 오류 코드

MFC에서 GetLastError() 함수의 오류 코드

MFC에서 GetLastError() 함수는 Windows API 함수를 호출한 후 발생한 오류 코드를 반환합니다. 오류 코드는 DWORD 형식으로 반환되며, 이 값은 주로 16진수로 표현됩니다. GetLastError() 함수는 특정 API 함수 호출의 성공 여부를 확인하거나 발생한 오류를 분석하는 데 사용됩니다.

MFC에서 GetLastError() 함수를 호출하기 전에 오류가 발생한 API 함수를 호출해야 합니다. 호출된 API 함수가 오류를 발생시키면 GetLastError() 함수를 호출하여 오류 코드를 얻을 수 있습니다. 오류 코드는 WinError.h 헤더 파일에 정의되어 있으며, 다양한 종류의 오류 코드가 있습니다.

주요한 오류 코드 몇 가지는 다음과 같습니다.

  • ERROR_SUCCESS (0x0): 작업이 성공적으로 완료되었습니다.
  • ERROR_INVALID_FUNCTION (0x1): 잘못된 함수 번호가 지정되었습니다.
  • ERROR_FILE_NOT_FOUND (0x2): 지정된 파일이나 경로를 찾을 수 없습니다.
  • ERROR_ACCESS_DENIED (0x5): 액세스가 거부되었습니다.
  • ERROR_INVALID_HANDLE (0x6): 잘못된 핸들이 지정되었습니다.
  • ERROR_NOT_ENOUGH_MEMORY (0x8): 메모리가 부족합니다.
  • ERROR_INVALID_PARAMETER (0x57): 잘못된 매개변수가 지정되었습니다.

위의 오류 코드 외에도 다양한 오류 코드가 있으며, 더 자세한 오류 코드 목록은 Microsoft의 공식 문서를 참조하시기 바랍니다. GetLastError() 함수를 사용하여 오류 코드를 얻은 후에는 FormatMessage() 함수를 사용하여 오류 메시지를 가져오는 것이 좋습니다. 이를 통해 오류를 더 자세히 파악하고 사용자에게 적절한 오류 메시지를 표시할 수 있습니다.

GetLastError()의 결과가 1400인 의미는?

GetLastError() 함수는 오류가 발생한 경우, 해당 오류의 에러 코드를 반환하는 Windows API 함수입니다. 오류 코드를 이해하려면 오류 코드를 16진수로 변환한 후, Windows SDK의 winerror.h 헤더 파일을 참조하여 해당 오류의 의미를 확인할 수 있습니다.

오류 코드 1400은 16진수로 0x578입니다. 이는 ERROR_INVALID_WINDOW_HANDLE(윈도우 핸들이 잘못되었습니다.) 오류를 나타냅니다. 즉, GetWindowThreadProcessId() 함수가 잘못된 윈도우 핸들(HWND)을 사용하여 프로세스 ID를 가져오려고 시도했을 때 발생하는 오류입니다.

이 오류가 발생하는 경우, 윈도우 핸들(HWND)이 올바른지 확인하고, 윈도우 핸들에 대한 적절한 조치를 취해야 합니다. 윈도우 핸들이 NULL이거나 유효하지 않은 경우, 해당 핸들을 사용하기 전에 유효성 검사를 수행하거나, 해당 윈도우 핸들이 유효한 상태에서 사용되는지 확인하는 것이 중요합니다.

GetLastError()의 반환값이 5인 결과는?

GetLastError() 함수는 오류가 발생한 경우 해당 오류의 에러 코드를 반환합니다. 오류 코드 5는 16진수로 0x5로 표현되며, 이는 ERROR_ACCESS_DENIED(액세스가 거부되었습니다.) 오류를 나타냅니다.

이 오류 코드는 주로 프로세스나 스레드가 특정 작업을 수행하는 데 필요한 적절한 권한이 부족한 경우 발생합니다. 즉, 해당 작업을 수행하기 위해서는 더 높은 권한이 필요한 경우에 ERROR_ACCESS_DENIED 오류가 반환됩니다.

예를 들어, 프로그램이 관리자 권한으로 실행되어야 하는데 일반 사용자 권한으로 실행되는 경우나 파일에 쓰기 권한이 없는 경우 등에 해당 오류가 발생할 수 있습니다. 이러한 상황에서는 적절한 권한을 부여하거나 프로그램을 관리자 권한으로 실행하는 등의 조치가 필요합니다.

mfc에서 프로그램 상태(program status)를 읽어오는 코드

mfc에서 프로그램 상태를 읽어오는 코드는?

MFC에서 현재 프로그램의 상태를 읽어오는 방법은 상황에 따라 다양합니다. 프로그램 상태는 보통 변수, 플래그 또는 상태를 나타내는 멤버 변수 등으로 관리될 수 있습니다.

여기서는 간단한 예시로 프로그램 상태를 나타내는 클래스를 만들고, 해당 클래스의 멤버 변수를 사용하여 상태를 읽어오는 방법을 보여드리겠습니다.


#include <afxwin.h>


// 프로그램 상태를 나타내는 클래스

class CProgramState

{

public:

    CProgramState()

    {

        // 초기화

        m_bIsRunning = false;

        m_nProgress = 0;

        // 추가적인 상태 변수들 초기화

        // ...

    }


    bool IsRunning() const { return m_bIsRunning; }

    int GetProgress() const { return m_nProgress; }

    // 추가적인 상태 정보를 반환하는 멤버 함수들 추가

    // ...


private:

    bool m_bIsRunning;

    int m_nProgress;

    // 추가적인 상태 변수들 선언

    // ...

};


int main()

{

    CProgramState programState; // 프로그램 상태 클래스 인스턴스 생성


    // 프로그램 상태 변경 예시:

    programState.IsRunning(); // 현재 프로그램이 실행 중인지 확인

    programState.GetProgress(); // 프로그램의 진행 상태를 얻음

    // 추가적인 상태 정보를 얻는 멤버 함수들 호출

    // ...


    return 0;

}

위의 코드에서 CProgramState 클래스는 프로그램의 상태를 나타내는 클래스로 선언되었습니다. CProgramState 클래스는 m_bIsRunning과 m_nProgress와 같은 멤버 변수들을 가지며, 이러한 변수들을 사용하여 프로그램의 상태를 읽어올 수 있습니다.

실제로 프로그램 상태는 프로그램이 실행되는 동안 동적으로 변할 수 있으며, 이러한 변화를 반영하기 위해 CProgramState 클래스의 멤버 함수들을 사용하여 상태를 읽어오면 됩니다. 실제 프로그램에서는 이러한 상태 정보를 특정 시점에 업데이트하고, 필요에 따라 해당 상태를 읽어와서 프로그램의 동작을 제어하는 방식으로 사용될 수 있습니다.

mfc 프로그램에서 FindWindow() 사용 코드

mfc 프로그램에서 FindWindow() 사용 코드는?

MFC 프로그램에서 FindWindow() 함수를 사용하여 윈도우를 찾는 방법은 다음과 같습니다. FindWindow() 함수는 해당 윈도우의 클래스 이름과 윈도우 제목을 기반으로 윈도우를 찾습니다.


#include <afxwin.h>

int main()

{

    // 찾을 윈도우의 클래스 이름과 윈도우 제목

    CString classNameToFind = _T("YourClassName");

    CString windowTitleToFind = _T("YourWindowTitle");


    // 윈도우 찾기

    HWND hWnd = ::FindWindow(classNameToFind, windowTitleToFind);


    if (hWnd != NULL)

    {

        // 윈도우를 찾은 경우

        // 추가로 필요한 작업 수행

        // 예: 윈도우 핸들을 사용하여 윈도우 조작, 메시지 보내기 등

        AfxMessageBox(_T("윈도우를 찾았습니다."));

    }

    else

    {

        // 윈도우를 찾지 못한 경우

        AfxMessageBox(_T("윈도우를 찾지 못했습니다."));

    }


    return 0;

}

위의 코드에서 FindWindow() 함수는 지정한 클래스 이름과 윈도우 제목을 가진 윈도우를 찾습니다. 만약 원하는 윈도우를 찾으면 해당 윈도우의 핸들(HWND)을 반환하고, 찾지 못하면 NULL을 반환합니다.

classNameToFind 변수에는 찾을 윈도우의 클래스 이름을, windowTitleToFind 변수에는 윈도우 제목을 입력합니다. 이렇게 지정한 클래스 이름과 윈도우 제목을 가진 윈도우가 존재한다면 해당 윈도우의 핸들이 hWnd 변수에 저장됩니다.

프로그램에서 필요한 윈도우를 찾고 나면, 해당 윈도우의 핸들(hWnd)을 사용하여 원하는 작업을 수행할 수 있습니다. 예를 들어, 찾은 윈도우로부터 메시지를 보내거나 윈도우를 조작하는 등의 작업을 할 수 있습니다.

mfc에서 HWND에서 CWnd*로 변환

MFC에서 HWND를 CWnd*로 변환하려면 FromHandle 함수를 사용하면 됩니다. FromHandle 함수는 윈도우 핸들(HWND)을 CWnd*로 변환하는 역할을 합니다. CWnd*는 MFC에서 윈도우를 나타내는 클래스의 포인터입니다.

아래는 HWND를 CWnd*로 변환하는 예시 코드입니다:


#include <afxwin.h>


int main()

{

    // HWND로 변환할 윈도우 핸들

    HWND hWnd = ::FindWindow(_T("YourClassName"), _T("YourWindowTitle"));


    if (hWnd != NULL)

    {

        // CWnd*로 변환

        CWnd* pWnd = CWnd::FromHandle(hWnd);


        if (pWnd != NULL)

        {

            // 변환 성공: CWnd*를 사용하여 윈도우 조작 등의 작업 수행

            // 예: pWnd->ShowWindow(SW_HIDE);

            AfxMessageBox(_T("윈도우를 성공적으로 변환했습니다."));

        }

        else

        {

            // 변환 실패: CWnd*로 변환하지 못한 경우

            AfxMessageBox(_T("윈도우를 변환하지 못했습니다."));

        }

    }

    else

    {

        // 윈도우 핸들을 찾지 못한 경우

        AfxMessageBox(_T("윈도우를 찾지 못했습니다."));

    }


    return 0;

}

위의 코드에서 ::FindWindow(_T("YourClassName"), _T("YourWindowTitle"))으로 원하는 윈도우의 핸들을 얻어옵니다. 그리고 CWnd::FromHandle(hWnd)을 사용하여 해당 HWND를 CWnd*로 변환합니다. 성공적으로 변환한 경우 CWnd* 포인터를 사용하여 윈도우를 조작하거나 작업을 수행할 수 있습니다.

CWnd*을 사용하면 MFC에서 제공하는 다양한 멤버 함수를 활용하여 윈도우 조작이나 메시지 처리 등을 더 편리하게 수행할 수 있습니다.

영국여행 오쏘몰 위탁수하물 반입 가능 여부와 규정

영국 여행 시 오쏘몰 위탁수하물 반입 가능 여부와 규정 영국 여행을 계획하면서, 부모님과 함께 오쏘몰과 같은 영양제를 챙겨가려는 여행객이 많습니다. 특히 히드로 공항과 같은 국제공항에서는 수하물에 대한 규정이 까다로울 수 있기 때문에 위탁수하물과 기내...