[visual studio] Bring Your MFC Application to the Web mfc 어플리케인 web 구동

Bring Your MFC Application to the Web

Rate me:
5.00/5 (6 votes)
1 Nov 2020CPOL5 min read
This is a proof of concept (POC) that C++ on desktop and Emscripten can share the same UI code.
For this demonstration, Microsoft Foundation Classes (MFC) is chosen as this is the C++ framework I am most familiar with and a pure Win32 approach is simply too much work. I only wrote the bare minimum code for three UI control wrappers and methods that I use and call.

Table of Contents

The example code is hosted at Github.

Introduction

Writing a full framework, frankly speaking, is a full-time job. The three UI control wrapper abstracts and hides away the implementation details of MFC and HTML, so that developer can write standard C++ code. Though I use MFC underneath, I strive to make my implementation to be as close as .NET Winform as possible. The reason is in terms of ease of use and elegance, MFC does not come even close to Winform. The use case is not to port existing Win32/MFC code using this approach. The intended use case is for porting a simple OpenGL demo: Emscripten has excellent support for bridging OpenGL and WebGL but none for the UI controls that exist outside the OpenGL window. At all times, I have written the C++ UI code and rewritten the same UI logic in JavaScript to control OpenGL animation. Below is a list of some caveats developer needs to be aware of before embarking on this effort.

  • This only works for simple controls that exist both on Windows and HTML. Not for composite control like CCheckListBox. Not for complicated control like CListCtrl. Not for subclassed custom-drawn controls.
  • This does not work out for Single Document Interface (SDI) and Multiple Document Interface (MDI) as these hierarchical architectures are very difficult to port to HTML. I do not see this as a problem since Winform does not have SDI/MDI architecture and it manages to do very well on desktop application and is very popular with .NET developers.
  • This approach does not work for UI layout: MFC has its UI designer and HTML5 relies on HTML/CSS to layout and style its controls. These two are very different technologies for laying out UI controls which I unable to reconcile. For the purpose of this article, I hand-wrote the HTML controls.

Qt does not have these problems as it handles the UI drawing and everything itself without using the equivalent HTML controls. For my approach, I have to settle for the lowest common denominator between Win32 and HTML. One advantage is HTML code download may be smaller for my approach as my UI work is delegated to HTML controls.

This is the UI of the MFC dialog.

MFC Dialog

This is the UI of the HTML form.

HTML Form

Let's take a closer look at the source code.

Dialog Code

Before a single line is written for the dialog header, a header for UI controls must be included, depending on the presence of __EMSCRIPTEN__ macro.

C++
#ifdef __EMSCRIPTEN__
    #include "JsUI.h"
#else
    #include "CppUI.h"
#endif

The Dialog class has different constructors for Emscripten and MFC. For the Emscripten version, it takes in the HTML control name while the MFC ones take in the pointers to MFC control. There is a OnButtonClick to handle button click. There are three controls, namely a textboxcheckbox, and button in this Dialog class.

C++
class Dialog
{
public:
#ifdef __EMSCRIPTEN__
    Dialog(const char* TextBoxName, 
           const char* CheckBoxName, 
           const char* ButtonName);
#else
    Dialog(CEdit* pTextBox, 
           CButton* pCheckBox, 
           CButton* pButton);
#endif

    void OnButtonClick();

public:
    WATextBox m_TextBox;
    WACheckBox m_CheckBox;
    WAButton m_Button;
};

This is the implementation of the Dialog constructor. The title of m_TextBox is set to "Mike". An event handler is assigned to the m_Button.Clicked event. Notice how similar it is to C# Winform 1.0 events.

C++
#include "Dialog.h"

#ifdef __EMSCRIPTEN__
Dialog::Dialog(const char* TextBoxName, 
               const char* CheckBoxName, 
               const char* ButtonName)
    : m_TextBox(TextBoxName)
    , m_CheckBox(CheckBoxName)
    , m_Button(ButtonName)
#else
Dialog::Dialog(CEdit* pTextBox, 
               CButton* pCheckBox, 
			   CButton* pButton)
    : m_TextBox(pTextBox)
    , m_CheckBox(pCheckBox)
    , m_Button(pButton)
#endif
{
    m_TextBox.SetText("Mike");
    m_Button.Clicked += EventHandler(&Dialog::OnButtonClick, this);
}

Inside OnButtonClick(), "Hello" is prepended to the text depending whether the checkbox is checked. And a MessageBox with the text is shown.

C++
void Dialog::OnButtonClick()
{
    std::string text = m_TextBox.GetText();
    if (m_CheckBox.GetCheck())
        text = std::string("Hello ") + text;

    WAMessageBox(text);
}

CppUI.h Setter and Getter

This section gives a glimpse of how setter and getter are implemented in CppUI.h in general. Only the setter and getter for the checkbox is shown.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

C++
bool GetCheck() const
{
    return (m_pCheckBox->GetCheck() == BST_CHECKED);
}

void SetCheck(bool check)
{
    int v = check ? BST_CHECKED : BST_UNCHECKED;
    m_pCheckBox->SetCheck(check);
}

JsUI.h Setter and Getter

The setter and getter for the checkbox for JavaScript are implemented via calls to EM_ASM family of functions that allow JavaScript code to be embedded inside the C++ source code. The general idea is the same for accessing other type of controls.

C++
bool GetCheck() const
{
    int check = EM_ASM_INT({
        var ctrl = document.getElementById(UTF8ToString(

[visual studio] Bring Your MFC Application to the Web mfc 어플리케인 web 구동

Bring Your MFC Application to the Web

Rate me:
5.00/5 (6 votes)
1 Nov 2020CPOL5 min read
This is a proof of concept (POC) that C++ on desktop and Emscripten can share the same UI code.
For this demonstration, Microsoft Foundation Classes (MFC) is chosen as this is the C++ framework I am most familiar with and a pure Win32 approach is simply too much work. I only wrote the bare minimum code for three UI control wrappers and methods that I use and call.

Table of Contents

The example code is hosted at Github.

Introduction

Writing a full framework, frankly speaking, is a full-time job. The three UI control wrapper abstracts and hides away the implementation details of MFC and HTML, so that developer can write standard C++ code. Though I use MFC underneath, I strive to make my implementation to be as close as .NET Winform as possible. The reason is in terms of ease of use and elegance, MFC does not come even close to Winform. The use case is not to port existing Win32/MFC code using this approach. The intended use case is for porting a simple OpenGL demo: Emscripten has excellent support for bridging OpenGL and WebGL but none for the UI controls that exist outside the OpenGL window. At all times, I have written the C++ UI code and rewritten the same UI logic in JavaScript to control OpenGL animation. Below is a list of some caveats developer needs to be aware of before embarking on this effort.

  • This only works for simple controls that exist both on Windows and HTML. Not for composite control like CCheckListBox. Not for complicated control like CListCtrl. Not for subclassed custom-drawn controls.
  • This does not work out for Single Document Interface (SDI) and Multiple Document Interface (MDI) as these hierarchical architectures are very difficult to port to HTML. I do not see this as a problem since Winform does not have SDI/MDI architecture and it manages to do very well on desktop application and is very popular with .NET developers.
  • This approach does not work for UI layout: MFC has its UI designer and HTML5 relies on HTML/CSS to layout and style its controls. These two are very different technologies for laying out UI controls which I unable to reconcile. For the purpose of this article, I hand-wrote the HTML controls.

Qt does not have these problems as it handles the UI drawing and everything itself without using the equivalent HTML controls. For my approach, I have to settle for the lowest common denominator between Win32 and HTML. One advantage is HTML code download may be smaller for my approach as my UI work is delegated to HTML controls.

This is the UI of the MFC dialog.

MFC Dialog

This is the UI of the HTML form.

HTML Form

Let's take a closer look at the source code.

Dialog Code

Before a single line is written for the dialog header, a header for UI controls must be included, depending on the presence of __EMSCRIPTEN__ macro.

C++
#ifdef __EMSCRIPTEN__
    #include "JsUI.h"
#else
    #include "CppUI.h"
#endif

The Dialog class has different constructors for Emscripten and MFC. For the Emscripten version, it takes in the HTML control name while the MFC ones take in the pointers to MFC control. There is a OnButtonClick to handle button click. There are three controls, namely a textboxcheckbox, and button in this Dialog class.

C++
class Dialog
{
public:
#ifdef __EMSCRIPTEN__
    Dialog(const char* TextBoxName, 
           const char* CheckBoxName, 
           const char* ButtonName);
#else
    Dialog(CEdit* pTextBox, 
           CButton* pCheckBox, 
           CButton* pButton);
#endif

    void OnButtonClick();

public:
    WATextBox m_TextBox;
    WACheckBox m_CheckBox;
    WAButton m_Button;
};

This is the implementation of the Dialog constructor. The title of m_TextBox is set to "Mike". An event handler is assigned to the m_Button.Clicked event. Notice how similar it is to C# Winform 1.0 events.

C++
#include "Dialog.h"

#ifdef __EMSCRIPTEN__
Dialog::Dialog(const char* TextBoxName, 
               const char* CheckBoxName, 
               const char* ButtonName)
    : m_TextBox(TextBoxName)
    , m_CheckBox(CheckBoxName)
    , m_Button(ButtonName)
#else
Dialog::Dialog(CEdit* pTextBox, 
               CButton* pCheckBox, 
			   CButton* pButton)
    : m_TextBox(pTextBox)
    , m_CheckBox(pCheckBox)
    , m_Button(pButton)
#endif
{
    m_TextBox.SetText("Mike");
    m_Button.Clicked += EventHandler(&Dialog::OnButtonClick, this);
}

Inside OnButtonClick(), "Hello" is prepended to the text depending whether the checkbox is checked. And a MessageBox with the text is shown.

C++
void Dialog::OnButtonClick()
{
    std::string text = m_TextBox.GetText();
    if (m_CheckBox.GetCheck())
        text = std::string("Hello ") + text;

    WAMessageBox(text);
}

CppUI.h Setter and Getter

This section gives a glimpse of how setter and getter are implemented in CppUI.h in general. Only the setter and getter for the checkbox is shown.

C++
bool GetCheck() const
{
    return (m_pCheckBox->GetCheck() == BST_CHECKED);
}

void SetCheck(bool check)
{
    int v = check ? BST_CHECKED : BST_UNCHECKED;
    m_pCheckBox->SetCheck(check);
}

JsUI.h Setter and Getter

The setter and getter for the checkbox for JavaScript are implemented via calls to EM_ASM family of functions that allow JavaScript code to be embedded inside the C++ source code. The general idea is the same for accessing other type of controls.

C++
bool GetCheck() const
{
    int check = EM_ASM_INT({
        var ctrl = document.getElementById(UTF8ToString($0));
        return ctrl.checked;
    }, m_CheckBoxID.c_str());
    
    return (check > 0);
}

void SetCheck(bool check)
{
    EM_ASM_({
        var ctrl = document.getElementById(UTF8ToString($0));
        ctrl.checked = $1;
    }, m_CheckBoxID.c_str(), check);
}

OnButtonClick Call

Dialog::OnButtonClick() in C++ is called by MFC's OnBnClickedBtnSayHello():

C++
void CTestMFCWebAssemblyDlg::OnBnClickedBtnSayHello()
{
    m_pDialog->m_Button.CallClickHandler();
}

Dialog::OnButtonClick() in JavaScript is called by C function of the same name. Care must be taken that C++ does not mangle this name so this function is surrounded by extern "C". Right now, I manually connect the HTML5 button to call this OnButtonClick() but I expected to be done transparently by a wizard or IDE or helper in the future.

C++
extern "C" {

    void EMSCRIPTEN_KEEPALIVE OnButtonClick()
    {
        g_pDialog->m_Button.CallClickHandler();
    }

};

Building in Emscripten

This section is for the reader who desires to build the demo code using Emscripten on Windows Subsystem for Linux 2 (WSL2). Refer to this article on how to install Emscripten on Ubuntu WSL2. Assuming the source files and Makefile are in /mnt/c/temp2/ folder, this is how make command is called.

 
(cd /mnt/c/temp2/ && make)

/mnt/c/temp2/ folder on WSL2 refers to my C:\temp2 on Windows.

This is the command to delete the built binary, wa_dialog.js.

 
(cd /mnt/c/temp2/ && make clean)

In the Makefile, please remember to change the SRCFOLDER and OUTPUT accordingly, if your folder is not /mnt/c/temp2/ and the output file is not wa_dialog.js.

 
SRCFOLDER=/mnt/c/temp2
...
OUTPUT=/mnt/c/temp2/wa_dialog.js

Conclusion

Reader may notice the Dialog code is concise. However, the three control wrappers for each platform (MFC and HTML) that has to be written and much plumbing code to get everything working perfectly. I do not expect anyone to write all this mind-numbing code by hand. Hopefully, in the future, there is some wizard/automation tools to alleviate and lessen the amount of manual work and focus on writing the business logic. Readers may feel that this toy example is easy but actually useless in the real world. The original plan for the article is to write a non-trivial dialog application involving canvas or OpenGL. In the end, I decided against it and keep the demo simple: as the old saying goes, learn how to walk before you run. Hope you have enjoyed reading this article!

History

  • 1st November, 2020: First release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

 

Written By
Software Developer (Senior)
Singapore Singapore
Shao Voon is from Singapore. His interest lies primarily in computer graphics, software optimization, concurrency, security, and Agile methodologies. His hobby is writing a free C++/DirectX photo slideshow application which can be viewed here.

 

[출처] https://www.codeproject.com/Articles/5284114/Bring-Your-MFC-Application-to-the-Web

 

)); return ctrl.checked; }, m_CheckBoxID.c_str()); return (check > 0); } void SetCheck(bool check) { EM_ASM_({ var ctrl = document.getElementById(UTF8ToString(

[visual studio] Bring Your MFC Application to the Web mfc 어플리케인 web 구동

Bring Your MFC Application to the Web

Rate me:
5.00/5 (6 votes)
1 Nov 2020CPOL5 min read
This is a proof of concept (POC) that C++ on desktop and Emscripten can share the same UI code.
For this demonstration, Microsoft Foundation Classes (MFC) is chosen as this is the C++ framework I am most familiar with and a pure Win32 approach is simply too much work. I only wrote the bare minimum code for three UI control wrappers and methods that I use and call.

Table of Contents

The example code is hosted at Github.

Introduction

Writing a full framework, frankly speaking, is a full-time job. The three UI control wrapper abstracts and hides away the implementation details of MFC and HTML, so that developer can write standard C++ code. Though I use MFC underneath, I strive to make my implementation to be as close as .NET Winform as possible. The reason is in terms of ease of use and elegance, MFC does not come even close to Winform. The use case is not to port existing Win32/MFC code using this approach. The intended use case is for porting a simple OpenGL demo: Emscripten has excellent support for bridging OpenGL and WebGL but none for the UI controls that exist outside the OpenGL window. At all times, I have written the C++ UI code and rewritten the same UI logic in JavaScript to control OpenGL animation. Below is a list of some caveats developer needs to be aware of before embarking on this effort.

  • This only works for simple controls that exist both on Windows and HTML. Not for composite control like CCheckListBox. Not for complicated control like CListCtrl. Not for subclassed custom-drawn controls.
  • This does not work out for Single Document Interface (SDI) and Multiple Document Interface (MDI) as these hierarchical architectures are very difficult to port to HTML. I do not see this as a problem since Winform does not have SDI/MDI architecture and it manages to do very well on desktop application and is very popular with .NET developers.
  • This approach does not work for UI layout: MFC has its UI designer and HTML5 relies on HTML/CSS to layout and style its controls. These two are very different technologies for laying out UI controls which I unable to reconcile. For the purpose of this article, I hand-wrote the HTML controls.

Qt does not have these problems as it handles the UI drawing and everything itself without using the equivalent HTML controls. For my approach, I have to settle for the lowest common denominator between Win32 and HTML. One advantage is HTML code download may be smaller for my approach as my UI work is delegated to HTML controls.

This is the UI of the MFC dialog.

MFC Dialog

This is the UI of the HTML form.

HTML Form

Let's take a closer look at the source code.

Dialog Code

Before a single line is written for the dialog header, a header for UI controls must be included, depending on the presence of __EMSCRIPTEN__ macro.

C++
#ifdef __EMSCRIPTEN__
    #include "JsUI.h"
#else
    #include "CppUI.h"
#endif

The Dialog class has different constructors for Emscripten and MFC. For the Emscripten version, it takes in the HTML control name while the MFC ones take in the pointers to MFC control. There is a OnButtonClick to handle button click. There are three controls, namely a textboxcheckbox, and button in this Dialog class.

C++
class Dialog
{
public:
#ifdef __EMSCRIPTEN__
    Dialog(const char* TextBoxName, 
           const char* CheckBoxName, 
           const char* ButtonName);
#else
    Dialog(CEdit* pTextBox, 
           CButton* pCheckBox, 
           CButton* pButton);
#endif

    void OnButtonClick();

public:
    WATextBox m_TextBox;
    WACheckBox m_CheckBox;
    WAButton m_Button;
};

This is the implementation of the Dialog constructor. The title of m_TextBox is set to "Mike". An event handler is assigned to the m_Button.Clicked event. Notice how similar it is to C# Winform 1.0 events.

C++
#include "Dialog.h"

#ifdef __EMSCRIPTEN__
Dialog::Dialog(const char* TextBoxName, 
               const char* CheckBoxName, 
               const char* ButtonName)
    : m_TextBox(TextBoxName)
    , m_CheckBox(CheckBoxName)
    , m_Button(ButtonName)
#else
Dialog::Dialog(CEdit* pTextBox, 
               CButton* pCheckBox, 
			   CButton* pButton)
    : m_TextBox(pTextBox)
    , m_CheckBox(pCheckBox)
    , m_Button(pButton)
#endif
{
    m_TextBox.SetText("Mike");
    m_Button.Clicked += EventHandler(&Dialog::OnButtonClick, this);
}

Inside OnButtonClick(), "Hello" is prepended to the text depending whether the checkbox is checked. And a MessageBox with the text is shown.

C++
void Dialog::OnButtonClick()
{
    std::string text = m_TextBox.GetText();
    if (m_CheckBox.GetCheck())
        text = std::string("Hello ") + text;

    WAMessageBox(text);
}

CppUI.h Setter and Getter

This section gives a glimpse of how setter and getter are implemented in CppUI.h in general. Only the setter and getter for the checkbox is shown.

C++
bool GetCheck() const
{
    return (m_pCheckBox->GetCheck() == BST_CHECKED);
}

void SetCheck(bool check)
{
    int v = check ? BST_CHECKED : BST_UNCHECKED;
    m_pCheckBox->SetCheck(check);
}

JsUI.h Setter and Getter

The setter and getter for the checkbox for JavaScript are implemented via calls to EM_ASM family of functions that allow JavaScript code to be embedded inside the C++ source code. The general idea is the same for accessing other type of controls.

C++
bool GetCheck() const
{
    int check = EM_ASM_INT({
        var ctrl = document.getElementById(UTF8ToString($0));
        return ctrl.checked;
    }, m_CheckBoxID.c_str());
    
    return (check > 0);
}

void SetCheck(bool check)
{
    EM_ASM_({
        var ctrl = document.getElementById(UTF8ToString($0));
        ctrl.checked = $1;
    }, m_CheckBoxID.c_str(), check);
}

OnButtonClick Call

Dialog::OnButtonClick() in C++ is called by MFC's OnBnClickedBtnSayHello():

C++
void CTestMFCWebAssemblyDlg::OnBnClickedBtnSayHello()
{
    m_pDialog->m_Button.CallClickHandler();
}

Dialog::OnButtonClick() in JavaScript is called by C function of the same name. Care must be taken that C++ does not mangle this name so this function is surrounded by extern "C". Right now, I manually connect the HTML5 button to call this OnButtonClick() but I expected to be done transparently by a wizard or IDE or helper in the future.

C++
extern "C" {

    void EMSCRIPTEN_KEEPALIVE OnButtonClick()
    {
        g_pDialog->m_Button.CallClickHandler();
    }

};

Building in Emscripten

This section is for the reader who desires to build the demo code using Emscripten on Windows Subsystem for Linux 2 (WSL2). Refer to this article on how to install Emscripten on Ubuntu WSL2. Assuming the source files and Makefile are in /mnt/c/temp2/ folder, this is how make command is called.

 
(cd /mnt/c/temp2/ && make)

/mnt/c/temp2/ folder on WSL2 refers to my C:\temp2 on Windows.

This is the command to delete the built binary, wa_dialog.js.

 
(cd /mnt/c/temp2/ && make clean)

In the Makefile, please remember to change the SRCFOLDER and OUTPUT accordingly, if your folder is not /mnt/c/temp2/ and the output file is not wa_dialog.js.

 
SRCFOLDER=/mnt/c/temp2
...
OUTPUT=/mnt/c/temp2/wa_dialog.js

Conclusion

Reader may notice the Dialog code is concise. However, the three control wrappers for each platform (MFC and HTML) that has to be written and much plumbing code to get everything working perfectly. I do not expect anyone to write all this mind-numbing code by hand. Hopefully, in the future, there is some wizard/automation tools to alleviate and lessen the amount of manual work and focus on writing the business logic. Readers may feel that this toy example is easy but actually useless in the real world. The original plan for the article is to write a non-trivial dialog application involving canvas or OpenGL. In the end, I decided against it and keep the demo simple: as the old saying goes, learn how to walk before you run. Hope you have enjoyed reading this article!

History

  • 1st November, 2020: First release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

 

Written By
Software Developer (Senior)
Singapore Singapore
Shao Voon is from Singapore. His interest lies primarily in computer graphics, software optimization, concurrency, security, and Agile methodologies. His hobby is writing a free C++/DirectX photo slideshow application which can be viewed here.

 

[출처] https://www.codeproject.com/Articles/5284114/Bring-Your-MFC-Application-to-the-Web

 

)); ctrl.checked = 91663; }, m_CheckBoxID.c_str(), check); }

OnButtonClick Call

Dialog::OnButtonClick() in C++ is called by MFC's OnBnClickedBtnSayHello():

C++
void CTestMFCWebAssemblyDlg::OnBnClickedBtnSayHello()
{
    m_pDialog->m_Button.CallClickHandler();
}

Dialog::OnButtonClick() in JavaScript is called by C function of the same name. Care must be taken that C++ does not mangle this name so this function is surrounded by extern "C". Right now, I manually connect the HTML5 button to call this OnButtonClick() but I expected to be done transparently by a wizard or IDE or helper in the future.

C++
extern "C" {

    void EMSCRIPTEN_KEEPALIVE OnButtonClick()
    {
        g_pDialog->m_Button.CallClickHandler();
    }

};

Building in Emscripten

This section is for the reader who desires to build the demo code using Emscripten on Windows Subsystem for Linux 2 (WSL2). Refer to this article on how to install Emscripten on Ubuntu WSL2. Assuming the source files and Makefile are in /mnt/c/temp2/ folder, this is how make command is called.

 
(cd /mnt/c/temp2/ && make)

/mnt/c/temp2/ folder on WSL2 refers to my C:\temp2 on Windows.

This is the command to delete the built binary, wa_dialog.js.

 
(cd /mnt/c/temp2/ && make clean)

In the Makefile, please remember to change the SRCFOLDER and OUTPUT accordingly, if your folder is not /mnt/c/temp2/ and the output file is not wa_dialog.js.

 
SRCFOLDER=/mnt/c/temp2
...
OUTPUT=/mnt/c/temp2/wa_dialog.js

Conclusion

Reader may notice the Dialog code is concise. However, the three control wrappers for each platform (MFC and HTML) that has to be written and much plumbing code to get everything working perfectly. I do not expect anyone to write all this mind-numbing code by hand. Hopefully, in the future, there is some wizard/automation tools to alleviate and lessen the amount of manual work and focus on writing the business logic. Readers may feel that this toy example is easy but actually useless in the real world. The original plan for the article is to write a non-trivial dialog application involving canvas or OpenGL. In the end, I decided against it and keep the demo simple: as the old saying goes, learn how to walk before you run. Hope you have enjoyed reading this article!

History

  • 1st November, 2020: First release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

 

Written By
Software Developer (Senior)
Singapore Singapore
Shao Voon is from Singapore. His interest lies primarily in computer graphics, software optimization, concurrency, security, and Agile methodologies. His hobby is writing a free C++/DirectX photo slideshow application which can be viewed here.

 

[출처] https://www.codeproject.com/Articles/5284114/Bring-Your-MFC-Application-to-the-Web

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
28 [Linux programming][turbo c] The libXbgi Library file 졸리운_곰 2023.02.05 254
27 [unix][linux][compiler] Yacc와 Lex 시작하기 file 졸리운_곰 2021.09.08 261
26 [Visual Studio 2019] Visual Studio로 Linux 원격 개발하기(Ubuntu 설치부터 SSH 서버접속까지) file 졸리운_곰 2021.08.29 265
25 [unix][emacs] 이맥스와 함께하는 개발환경 . emacs 튜토리얼 file 졸리운_곰 2021.08.18 319
24 [Linux][C/C++] cmake 사용법과 활용 file 졸리운_곰 2020.11.08 554
23 [CMake] Linux C/C++ cmake 시작하기 졸리운_곰 2020.11.08 398
22 [C++] CMake Build System file 졸리운_곰 2020.11.08 328
21 Windows 10에 한국어 입출력이 가능한 리눅스 데스크톱 설치하기 file 졸리운_곰 2020.06.29 290
20 wxwidgets 과 codeblock 설치(리눅스) 졸리운_곰 2019.12.25 229
19 ubuntu 18.04.2 LTS 개발환경 세팅 졸리운_곰 2019.12.25 224
18 Ubuntu 16.04 개발환경 세팅하기! 졸리운_곰 2017.03.21 360
17 tcl/tk 자료 secret 졸리운_곰 2017.02.23 0
16 CentOS xrdp 설정 (원격데스크탑) 졸리운_곰 2017.02.01 453
15 Five lightweight Linux desktop worlds for extreme open-sourcers file 졸리운_곰 2016.05.12 1023
14 Logging every shell command 졸리운_곰 2016.05.11 581
13 How to keep a detailed audit trail of what’s being done on your Linux systems file 졸리운_곰 2016.05.11 467
12 Docker의 소개와 간단한 사용법 file 졸리운_곰 2015.11.24 804
11 Make Self-Extracting Archives with makeself.sh 졸리운_곰 2015.11.07 367
10 리눅스 간단 배포 Linux simple deploy 제작 : make self file 졸리운_곰 2015.11.07 352
9 Joinc: Linux 커널에서의 디바이스 드라이버 작성 졸리운_곰 2015.06.16 837
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED