

#include <vcl.h>
#pragma hdrstop


//[BuildTool 정의]
//{
    //[2022.09.14.수][추가]{------------------------------------------------------------------
    //[맷돌-IDE] 제작도구가 <TC++2006> 인지 <ECB/CE> 인지 구분하는 값을 정의한다.
    //
    //이 <BuildToolDefine.h> 는 아래와 같이 내용이 다르므로 <TC++2006> 으로 빌드하는 묶음과
    //<ECB/CE> 로 빌드하는 묶음에서 각각 고유하게 가지고 있어야 한다.
    //
    //#define  d_BuildTool_TC2006    true   <=== <TC++2006> 으로 빌드되는 묶음안의 정의 내용.
    //#define  d_BuildTool_TC2006    false  <=== <ECB/CE> 로 빌드되는 묶음안의 정의 내용.
    //
    //[참고]----------------------------------------------------------------------------------
    //<TC++2006> : Turbo C++ 2006 Explorer
    //<ECB/CE>   : Embarcadero C++Builder/Community Edition
    //}---------------------------------------------------------------------------------------

    #include "BuildToolDefine.h"

//}

#include  "API_File.h"                                                            

#include  "vmos_def.h"
#include  "vmos.h"

#include  "c_define.h"

#include  "ide_library.h"

//[열기/저장 대화상자] 에 접근하기 위한것.
#include  "main.h"

#include  "file.h"

//[2020.09.25.금][추가]{------------------------------------------------------
//<_API_File_Dir_SelectDialog()> 에서 <SelectDirectory()> 를 사용하는데 필요.
#include "FileCtrl.hpp"
//}---------------------------------------------------------------------------


//[2011.11.30.수][중요수정!!!]{*******
//신형 API 방식으로 전부 새롭게 수정.
//}***********************************


void __fastcall _API_File_OpenDialog(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------
  //unsigned char _File_열기대화상자_(void);
  //}----------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[명령처리]
  //{
      //[열기 대화상자] 를 보여준다.
      rReturn = main_Form->vmos_OpenDialog->Execute();

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_OpenDialog_Ext(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileExtList;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //void _File_열기대화상자_확장자_(char  *p확장자목록);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p확장자목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileExtList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileExtList, &pFileExtList);

  //}

  //[명령처리]
  //{
      //[열기 대화상자] 의 [확장자] 를 설정한다.
      main_Form->vmos_OpenDialog->Filter = (AnsiString)((char *)pFileExtList);

  //}

  return;

}

void __fastcall _API_File_OpenDialog_FileName(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //
  //[2020.11.01.일][수정]--------
  //[반환형:int] 로 수정.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  rPathNameExt;

          //[2020.11.01.일][추가]
          DTS4  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------------------
  //int _File_열기대화상자_문서이름_(char  *r문서이름);
  //}---------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *r문서이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rPathNameExt, &rPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[!]{------------------------------------
      //[다중/단일:선택:형식] 을 구분해서 처리.
      //}---------------------------------------

      if(main_Form->vmos_OpenDialog->Options.Contains(ofAllowMultiSelect) == true)
      {
        //[!]{-----------------------------------------------------------------------------
        //[다중선택:형식] 인 경우.
        //1 개를 선택했을수도 있으나 무조건 행단위 문자열로 반환한다.
        //<main_Form->vmos_OpenDialog->Files->Text> 는 항상 [행단위문자열] 로 구성돼 있다.
        //}--------------------------------------------------------------------------------

        //[시뮬레이션] 기능으로 사용시에는 [문자열] 은 반환하지 않는다.
        if(rPathNameExt != NULL)
        {
		  //현재 [대화상자] 의 [문서이름] 을 반환한다.
		  STR_Assign((char *)rPathNameExt, ((AnsiString)(main_Form->vmos_OpenDialog->Files->Text)).c_str());

        }

        rReturn = ((AnsiString)(main_Form->vmos_OpenDialog->Files->Text)).Length();

      }
      else
      {
        //[!]{--------------------------------------------
        //[단일선택:형식] 인 경우.
        //<main_Form->vmos_OpenDialog->FileName> 을 반환.
        //}-----------------------------------------------

        //[시뮬레이션] 기능으로 사용시에는 [문자열] 은 반환하지 않는다.
        if(rPathNameExt != NULL)
        {
          //현재 [대화상자] 의 [문서이름] 을 반환한다.
          STR_Assign((char *)rPathNameExt, ((AnsiString)(main_Form->vmos_OpenDialog->FileName)).c_str());

        }

        rReturn = ((AnsiString)(main_Form->vmos_OpenDialog->FileName)).Length();

      }

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_OpenDialog_InitDir(void)
{
  //[2018.08.11.토][생성!!!]{--------------
  //[열기:대화상자] 의 [초기경로] 를 지정.
  //}--------------------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pInitDir;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------------------
  //void _File_열기대화상자_경로지정_(char  *p경로);
  //}------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pInitDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pInitDir, &pInitDir);
      
      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[!]{------------------------------------------------
      //[열기 대화상자] 의 [초기경로] 를 설정.
      //
      //[주의!!!]*******************************************
      //<InitialDir> 가 아니라 <FileName> 에 설정해야 된다.
      //[경로] 가 아니라 [경로이름확장자] 로 설정해도 무방.
      //}---------------------------------------------------

      //[2022.01.05.수][중요수정]{*********************************************
      //[초기경로설정] 이므로 <InitialDir> 를 사용하는 것이 정확하다.
      //main_Form->vmos_OpenDialog->FileName = (AnsiString)((char *)pInitDir);
      main_Form->vmos_OpenDialog->InitialDir = (AnsiString)((char *)pInitDir);
      //}**********************************************************************

  //}

}

void __fastcall _API_File_SaveDialog(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------
  //unsigned char _File_저장대화상자_(void);
  //}----------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[명령처리]
  //{
      //[저장 대화상자] 를 보여준다.
      rReturn = main_Form->vmos_SaveDialog->Execute();

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_SaveDialog_Ext(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileExtList;

      //}    

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //void _File_저장대화상자_확장자_(char  *p확장자목록);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p확장자목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileExtList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileExtList, &pFileExtList);

  //}

  //[명령처리]
  //{
      //[열기 대화상자] 의 [확장자] 를 설정한다.
      main_Form->vmos_SaveDialog->Filter = (AnsiString)((char *)pFileExtList);

  //}

  return;

}

void __fastcall _API_File_SaveDialog_FileName(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   rFileName;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //void _File_저장대화상자_문서이름_(char  *r문서이름);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *r문서이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rFileName, &rFileName);

  //}

  //[명령처리]
  //{
      //현재 대화상자의 [문서이름] 을 반환한다.
      STR_Assign((char *)rFileName, ((AnsiString)(main_Form->vmos_SaveDialog->FileName)).c_str());

  //}

}

void __fastcall _API_File_SaveDialog_InitDir(void)
{
  //[2018.08.11.토][생성!!!]{--------------
  //[저장:대화상자] 의 [초기경로] 를 지정.
  //}--------------------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pInitDir;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------------------
  //void _File_저장대화상자_경로지정_(char  *p경로);
  //}------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pInitDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pInitDir, &pInitDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[!]{------------------------------------------------
      //[저장 대화상자] 의 [초기경로] 를 설정.
      //
      //[주의!!!]*******************************************
      //<InitialDir> 가 아니라 <FileName> 에 설정해야 된다.
      //[경로] 가 아니라 [경로이름확장자] 로 설정해도 무방.
      //}---------------------------------------------------

      //[2022.01.05.수][중요수정]{*********************************************
      //[초기경로설정] 이므로 <InitialDir> 를 사용하는 것이 정확하다.
      //main_Form->vmos_SaveDialog->FileName = (AnsiString)((char *)pInitDir);
      main_Form->vmos_SaveDialog->InitialDir = (AnsiString)((char *)pInitDir);
      //}**********************************************************************

  //}

}

void __fastcall _API_File_Open(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.10.19.수][수정!!!]
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileName;
          DTU8   pBuf;
          DTU8   rSize;

          //주소는 전부 MCU 상의 주소다.
          DTU1   rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{------------------------------------------
  //unsigned char _File_열기_(char           *p이름,
  //                          unsigned char  *p저장소,
  //                          unsigned int   *r크기);
  //}--------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  *p저장소]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBuf)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBuf, &pBuf);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned int   *r크기]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rSize)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rSize, &rSize);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[2011.10.19.수][수정!!!]{--------------------------------------------------------
      //<FILE_Open_inBUF()> 에서<File_Open_Bin_inBuf()> 로 교체한다.
      //이는 범용으로 사용시 주로 문자열을 열기 위하여 만든 <FILE_Open_inBUF()> 함수에서
      //'\0' 를 뒤에 붙이기 때문에 <bin> 형 문서를 열때 오류가 발생하기 때문이다.
      //해당 함수안의 설명을 참고한다.
      //
      //[맷돌 C] 로 AVR-ISP 제작중 이 문제를 발견하고 수정한다.
      //}--------------------------------------------------------------------------------
      
      rReturn = File_Open_Bin_inBuf((AnsiString)((char *)pFileName),
                                    (unsigned char *)pBuf,
                                    (int *)rSize);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Save(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileName;
          DTU8   pBuf;

          DTU4   pSize;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------
  //void _File_저장_(char           *p이름,
  //                 unsigned char  *p저장소,
  //                 unsigned int    p크기);
  //}-----------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  *p저장소]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBuf)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBuf, &pBuf);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned int  p크기]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pSize)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

  //[명령처리]
  //{
      FILE_Save((AnsiString)((char *)pFileName),
                (unsigned char *)pBuf,
                pSize);

  //}

}

void __fastcall _API_File_Size(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.18.금][중요수정!!!]
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileName;
          DTU8   rSize;

          //주소는 전부 MCU 상의 주소다.
          DTU1   rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //unsigned char _File_크기얻기_(char          *p이름,
  //                              unsigned int  *r크기);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned int  *r크기]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rSize)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rSize, &rSize);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[2011.11.18.금][중요수정!!!]{----------------------------------------------
      //<_API_File_Open()> 수정의 경우처럼, 표준의 경우는 문서그대로의 크기를 얻는
      //<FILE_Size()> 를 사용하는 것으로 한다.
      //<File_GetSize()> 는 [<TXT> 형 문서] 를 열때 자동으로 뒤에 '\0' 까지 붙여서
      //<+1> 을 한 크기를 반환하므로 [2진문서] 를 열때 문제가 된다.
      //즉, 있는 그대로의 [순수한 크기] 를 구하는 것으로 수정한다.
      //}--------------------------------------------------------------------------

      rReturn = FILE_Size((AnsiString)((char *)pFileName),
                          (int *)rSize);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Exist(void)
{
  //[2010.06.19.토][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pFileName;

          //주소는 전부 MCU 상의 주소다.
          DTU1   rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{------------------------------------
  //unsigned char _File_존재확인_(char  *p이름);
  //}--------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      rReturn = FileExists((AnsiString)((char *)pFileName));

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Copy(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDst_FullFileName;
          DTU8  pSrc_FullFileName;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------
  //void _File_복사_(char  *p복사본_경로이름확장자,
  //                 char  *p원본_경로이름확장자);
  //}-----------------------------------------------
  //File_Copy()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p복사본_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDst_FullFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDst_FullFileName, &pDst_FullFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p원본_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrc_FullFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrc_FullFileName, &pSrc_FullFileName);

  //}

  //[명령처리]
  //{
      File_Copy((AnsiString)((char *)pDst_FullFileName),
                (AnsiString)((char *)pSrc_FullFileName));

  //}

}

void __fastcall _API_File_ReName(void)
{
  //[2018.10.09.화][생성!!!]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pFileName;
          DTU8  pNewNameExt;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------
  //unsigned char _File_이름변경_(char  *p경로이름확장자,
  //                              char  *p변경_이름확장자);
  //}-------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p변경_이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pNewNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pNewNameExt, &pNewNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      rReturn = File_ReName((char *)pFileName, (char *)pNewNameExt);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Delete(void)
{
  //[2018.10.09.화][생성!!!]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pFileName;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{------------------------------------------
  //unsigned char _File_삭제_(char  *p경로이름확장자);
  //}--------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFileName, &pFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      rReturn = File_Delete((char *)pFileName);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Dir_CreateDirectory(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pPath;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------
  //void _Dir_경로생성_(char  *p경로);
  //}----------------------------------
  //File_CreateDirectory()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

  //}

  //[명령처리]
  //{
      File_CreateDirectory((char *)pPath);

  //}

}

void __fastcall _API_File_Dir_Copy(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDst_Path;
          DTU8  pSrc_Path;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------
  //void _Dir_복사_(char  *p복사본_경로,
  //                char  *p원본_경로);
  //}------------------------------------
  //Dir_Copy()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p복사본_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDst_Path)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDst_Path, &pDst_Path);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p원본_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrc_Path)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrc_Path, &pSrc_Path);

  //}

  //[명령처리]
  //{
      Dir_Copy((AnsiString)((char *)pDst_Path),
               (AnsiString)((char *)pSrc_Path));

  //}

}

void __fastcall _API_File_Dir_Get_FileList_BoundDir(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pPath;      //char           *p경로
          DTU8  pExt;       //char           *p확장자
          DTU1  pLowFolder; //unsigned char   p하위폴더검사여부 //bool
          DTS4  pOption;    //int             p검사조건
          DTU8  rList;      //char           *r목록

      //}

      //[특수]
      //{
          //맷돌C 에 없는 <형> 이므로 일단 <TStringList> 로 처리후 <char *> 로 변환한다.
          TStringList  *list;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------------------------------------------
  //void _Dir_폴더안의_문서전체이름목록_얻기_(char           *p경로,
  //                                          char           *p확장자,
  //                                          unsigned char   p하위폴더검사여부, //bool
  //                                          int             p검사조건,
  //                                          char           *r목록);
  //}-----------------------------------------------------------------------------------
  //Dir_Get_FileList_BoundDir()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pExt, &pExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p하위폴더검사여부]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pLowFolder)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[int  p검사조건]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pOption)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[char  *r목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rList, &rList);

  //}

  //[명령처리]
  //{
      //[생성]
      //{
          list = new TStringList;
          list->Clear();

      //}    

      Dir_Get_FileList_BoundDir((AnsiString)((char *)pPath),
                                (AnsiString)((char *)pExt),
                                !pLowFolder, //원본함수와 반대로 적용.
                                pOption,
                                //반환 목록.
                                list);

      //<TStringList> 로 얻은 것을 <char *> 로 변환하여 돌려준다.
      STR_Assign((char *)rList, ((AnsiString)(list->Text)).c_str());

  //}

  //[후처리]
  //{
      //동적 생성된것 삭제. 
      if(list != NULL) { delete list; list = NULL; }

  //}

}

void __fastcall _API_File_Dir_Get_FileNameList_BoundDir(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pPath;      //char           *p경로
          DTU8  pExt;       //char           *p확장자
          DTU1  pLowFolder; //unsigned char   p하위폴더검사여부 //bool
          DTS4  pOption;    //int             p검사조건
          DTU8  rList;      //char           *r목록

      //}

      //[특수]
      //{
          //맷돌C 에 없는 <형> 이므로 일단 <TStringList> 로 처리후 <char *> 로 변환한다.
          TStringList  *list;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------------------------------------------
  //void _Dir_폴더안의_문서내부이름목록_얻기_(char           *p경로,
  //                                          char           *p확장자,
  //                                          unsigned char   p하위폴더검사여부, //bool
  //                                          int             p검사조건,
  //                                          char           *r목록);
  //}-----------------------------------------------------------------------------------
  //Dir_Get_FileNameList_BoundDir()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pExt, &pExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p하위폴더검사여부]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pLowFolder)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[int  p검사조건]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pOption)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[char  *r목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rList, &rList);

  //}

  //[명령처리]
  //{
      //[생성]
      //{
          list = new TStringList;
          list->Clear();

      //}

      Dir_Get_FileNameList_BoundDir((AnsiString)((char *)pPath),
                                    (AnsiString)((char *)pExt),
                                    !pLowFolder, //원본함수와 반대로 적용.
                                    pOption,
                                    //반환 목록.
                                    list);

      //<TStringList> 로 얻은 것을 <char *> 로 변환하여 돌려준다.
      STR_Assign((char *)rList, ((AnsiString)(list->Text)).c_str());

  //}

  //[후처리]
  //{
      //동적 생성된것 삭제. 
      if(list != NULL) { delete list; list = NULL; }

  //}
  
}

void __fastcall _API_File_Compose(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pList_FullFileName;
          DTU8  pSave_FullFileName;

      //}     

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------
  //void _File_합성_(char  *p경로이름확장자_목록,
  //                 char  *p저장_경로이름확장자);
  //}----------------------------------------------
  //File_Compose2()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로이름확장자_목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pList_FullFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pList_FullFileName, &pList_FullFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p저장_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSave_FullFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSave_FullFileName, &pSave_FullFileName);

  //}

  //[명령처리]
  //{
      File_Compose2((char *)pList_FullFileName,
                    (char *)pSave_FullFileName);

  //}

}

void __fastcall _API_File_HexToBin_InBuf(void)
{
  //[2011.10.12.수][생성!!!]{----
  //[2011.11.30.수][중요수정!!!]
  //새로운 방식으로 API 를 처리.
  //}----------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pFullFileName;
          DTU8  rBuf;
          DTU8  rStartAdr;
          DTU8  rEndAdr;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{------------------------------------------------------
  //bool
  //unsigned char _File_HexToBin_(char           *p경로이름확장자,
  //                              unsigned char  *r저장소,
  //                              int            *r시작주소,
  //                              int            *r끝주소);
  //}--------------------------------------------------------------
  //HEXFILE_Open_InBuffer()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pFullFileName)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pFullFileName, &pFullFileName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  *r저장소]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rBuf)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rBuf, &rBuf);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[int  *r시작주소]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rStartAdr)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rStartAdr, &rStartAdr);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[int  *r끝주소]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rEndAdr)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rEndAdr, &rEndAdr);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      rReturn = HEXFILE_Open_InBuffer((AnsiString)((char *)pFullFileName),
                                      (unsigned char *)rBuf,
                                      (int *)rStartAdr,
                                      (int *)rEndAdr);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Search(void)
{
  //[2018.10.11.목][생성!!!]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDir;             //char           *p지정경로,
          DTU8  pSrchName;        //char           *p찾을이름,
          DTU8  pSrchExt;         //char           *p찾을확장자,
          DTU1  pLowFolder;       //unsigned char   p하위폴더찾기유무,
          DTU1  pOptCls_Dir;      //unsigned char   p조건_폴더찾기
          DTU1  pOptCls_File;     //unsigned char   p조건_문서찾기,
          DTU1  pOptLst_NameExt;  //unsigned char   p조건_이름확장자만수집,
          DTU1  pOptLst_Name;     //unsigned char   p조건_이름만수집,
          DTU1  pInnerPathOnly;   //unsigned char   p조건_내부경로만수집,
          DTU8  rList;            //char           *r목록

          DTS4  rReturn;          //int

      //}

      //[특수]
      //{
          //[맷돌 C] 에 없는 <형> 이므로 일단 <TStringList> 로 처리후 <char *> 로 변환.
          TStringList  *list = new TStringList;

          list->Clear();

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------------------------------
  //int _File_찾기_(//지정 경로(반드시 뒤에 "\" 이 붙어 있어야 함).
  //                char           *p지정경로,
  //                //찾을 [이름(대/소문자 구분 없음)]("*" 인 경우는 전체 대상).
  //                char           *p찾을이름,
  //                //찾을 [확장자(대/소 문자 구분 없음)]("*" 인 경우는 전체 대상).
  //                char           *p찾을확장자,
  //                //--------------------
  //                //[하위폴더검사 유/무]
  //                //--------------------
  //                //하위 폴더까지 찾기(true).
  //                unsigned char   p하위폴더찾기유무,
  //                //---------------
  //                //[검사조건:대상]
  //                //---------------
  //                //[폴더] 를 대상으로 찾기(true).
  //                unsigned char   p조건_폴더찾기,
  //                //[문서] 를 대상으로 찾기(true).
  //                unsigned char   p조건_문서찾기,
  //                //둘다 사용 가능.
  //                //-------------------
  //                //[검사조건:수집종류]
  //                //-------------------
  //                //[이름확장자] 만 수집.
  //                unsigned char   p조건_이름확장자만수집,
  //                //[이름] 만 수집.
  //                unsigned char   p조건_이름만수집,
  //                //둘다 (false) : 전체 [경로이름확장자] 수집.
  //                //둘다 (true)  : [이름] 만 수집.
  //                //-------------
  //                //[후처리 조건]
  //                //-------------
  //                //[내부경로이름확장자] 만 수집(<p지정경로> 경로가 제외된 것).
  //                unsigned char   p조건_내부경로만수집,
  //                //----------
  //                //[반환목록]
  //                //----------
  //                //[행:단위] 로 정리된 목록.
  //                char           *r찾은목록);
  //}-------------------------------------------------------------------------------

  //Dir_Search_File();

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p지정경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDir)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDir, &pDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p찾을이름]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrchName)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrchName, &pSrchName);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p찾을확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrchExt)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrchExt, &pSrchExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p하위폴더찾기유무]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pLowFolder)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p조건_폴더찾기]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOptCls_Dir)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p조건_문서찾기]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOptCls_File)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p조건_이름확장자만수집]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOptLst_NameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p조건_이름만수집]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOptLst_Name)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p조건_내부경로만수집]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pInnerPathOnly)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[char  *r찾은목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rList)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rList, &rList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      rReturn = Dir_Search_File((char *)pDir,
                                (char *)pSrchName,
                                (char *)pSrchExt,
                                !pLowFolder,
                                pOptCls_Dir,
                                pOptCls_File,
                                pOptLst_NameExt,
                                pOptLst_Name,
                                pInnerPathOnly,
                                list);

      //<TStringList> 로 얻은 것을 <char *> 로 변환하여 반환.
      STR_Assign((char *)rList, ((AnsiString)(list->Text)).c_str());

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; goto lbEnd; }

  //}

  lbEnd:

  //[후처리]
  //{
      //동적 생성된것 삭제.
      if(list != NULL) { delete list; list = NULL; }

  //}

}

void __fastcall _API_File_Dir_Delete(void)
{
  //[2018.10.13.토][생성!!!]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDir;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------
  //unsigned char _Dir_삭제_(char  *p경로);
  //}---------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDir, &pDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      rReturn = Dir_Delete((char *)pDir);

  //}

  //[반환]
  //{
      //[값] 쓰기.
	  if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Dir_SelectDialog(void)
{
  //[2020.09.25.금][생성]{-------------------------------------------------------
  //[경로 선택 대홧상자] 를 보여주고 [선택된 경로] 를 반환.
  //
  //이는 [파일대화상자] 의 경우, 반드시 [파일] 을 선택하는 경우만
  //[경로] 를 얻을수 있기 때문.
  //
  //<SelectDirectory()> 는 순수하게 [경로] 만 선택할수 있는 대화상자를 보여준다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pStartDir;
          DTU8  rSelDir;

          DTU1  rReturn;

      //}

      AnsiString   dir;

      char        *path;

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------------
  //unsigned char _Dir_선택대화상자_(char  *p시작경로,
  //                                 char  *r선택된경로);
  //}-----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p시작경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStartDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStartDir, &pStartDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *r선택된경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rSelDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rSelDir, &rSelDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[경로만 추출]
      //{
          //[주의]{---------------------------------------------------------------------
          //<SelectDirectory()> 는 초기 경로 설정 문자열에 [이름.확장자] 가 있는 경우는
          //문제가 없으나, "...\이름" 만 기록하는 경우는 [치명적인 오류] 가 발생한다.
          //따라서, 내부적으로 아예 [경로] 만 사용될수 있도록 [이름.확장자] 제거 처리.
          //}---------------------------------------------------------------------------

          //[저장소 만들기]
          //{
              //[!]{-----------------------------------------------------------------------------------
              //[이름.확장자] 를 제거하여 지정 경로 문자열 보다 길수는 없으므로 지정 경로 길이로 생성.
              //단, 뒷부분에서 "\" 를 추가하므로 +1 을 더한다.
              //}--------------------------------------------------------------------------------------

              //'\0' 저장을 위한것----------------------------v
              //path = new char[STR_Length((char *)pStartDir) + 1];
              //[동적생성단위적용][2021.01.24.일][수정]
              path = new char[UnitX(1024, STR_Length((char *)pStartDir) + 1)];

          //}

          //[경로 추출/할당]
          //{
              //[경로] 까지만 추출.
              STR_GetFilePathOnly((char *)pStartDir, path);

              //시작 경로 할당.
              dir = path;

          //}    

          //[저장소 삭제]
          //{
              delete [] path; path = NULL;

          //}

	  //}

      //[경로 선택 대화상자]
      //{
          //[주의]{**************************************************************
          //<SelectDirectory()> 의 결과는 뒤에 "\" 이 붙어 있지 않다.
          //즉, "c:\A\B\C\" 에서 "C" 폴더를 지정한 경우 "c:\A\B\C" 가 된다.
          //기계닉스 모든 API 는 [경로] 처리시 결과에 항상 "\" 이 붙어 있는 것을
          //원칙으로 하므로 여기서도 뒤에 "\" 을 하나 붙여 준다.
          //}********************************************************************

          #if d_BuildTool_TC2006
          //{
              //[!]{---------------------------
              //<TC++2006> 으로 제작하는 경우.
              //}------------------------------

              rReturn = SelectDirectory(dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 1000);

          //}
          #else
          //{
              //[!]{-----------------------
              //<ECB/CE> 로 제작하는 경우.
              //}--------------------------

              //[2022.09.12.월][추가]{*********************************************
              //TC++2006 의 것을 C++Builder 10 에서 빌드하면서 발생한 문제를 수정.
              //<SelectDirectory()> 의 인수가 <UnicodeString> 로 수정됐으므로,
              //"UnicodeString  uDir" 임시 변수를 만들고 이를 사용하여 처리한다.
              //}******************************************************************

              //(AnsiString) <=> (UnicodeString) 사이의 변환을 위한 임시 변수.
              UnicodeString  u_dir = dir;

              rReturn = SelectDirectory(u_dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 1000);

              //처리 결과를 다시 (AnsiString) 변수로 변환.
              dir = (AnsiString)u_dir;

          //}
          #endif

          //["\" 붙이기]
          //{
              //[2022.09.20.화][중요수정]{***************************************************************************
              //<SelectDirectory()> 에서 은 경로는 [드라이브] 자체인 경우는 "Z:\" 와 같이 뒤에 "\" 이 붙어서 나온다.
              //일반 경로인 경우는 "Z:\@My" 로 뒤에 "\" 이 붙어 있지 않다.
              //그러므로, 뒤에 "\" 이 붙어 있는 경우는 추가로 "\" 를 붙이지 않는다.
              //[문서 검색기] 에 고급 기능을 추가하는 중 발견하고 수정한다.
              //}****************************************************************************************************

              if(STR_WordLastChar(((AnsiString)dir).c_str()) == '\\')
              {
                //드라이브 자체를 지정한 경우는 "Z:\" 로 뒤에 "\" 이 붙어 나오므로, 추가로 붙이지 않는다.
              }
              else
              {
                //드라이브 자체가 아닌 [폴더] 인 경우는 "Z:\@My" 처럼 끝에 "\" 이 붙어 있지 않으므로 붙여준다.
                dir = dir + "\\";

              }

          //}

          //[경로 반환]
          //{
              STR_Assign((char *)rSelDir, dir.c_str());

          //}

	  //}

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Dir_Get_FileList_BoundDir2(void)
{
  //[2020.10.02.금][생성]{-------------------------------------------------------
  //
  //[2020.10.17.토][중요수정]****************************************************
  //
  //[목록] 문자열의 [길이] 를 반환하도록 [반환형] 추가.
  //
  //1) <rList==NULL> => [목록] 을 반환하지 않고 [목록의 총 문자열 길이] 만 반환.
  //
  //2) <rList!=NULL> => [목록] 을 반환하고 [목록의 총 문자열 길이] 도 반환.
  //
  //[폼디자이너] 첫 작품인 [중복폴더추출기] 에서 [목록] 을 저장할 [저장소] 를
  //동적생성하는데 [정확한크기] 를 알 필요가 있어서 기능을 추가한다.
  //
  //즉, 한번은 [목록] 을 저장할 저장소 크기를 얻기위하여 <rList==NULL> 로
  //[시뮬레이션] 후 [저장소크기] 만 얻고, 다음에 다시 <rList!=NULL> 로 사용하여
  //[목록] 을 얻는 방식으로 사용하기 위한것.
  //
  //BCB 원본 함수는 이 기능이 없고 [맷돌:API] 용으로 여기서 직접 처리한다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pPath;      //char           *p경로
          DTU8  pExt;       //char           *p확장자
          DTU1  pLowFolder; //unsigned char   p하위폴더검사여부 //bool
          DTS4  pOption;    //int             p검사조건
          DTU8  rList;      //char           *r목록

          //[2020.10.17.토][추가]
          DTS4  rReturn;    //int 반환값.

      //}

      //[특수]
      //{
          //맷돌C 에 없는 <형> 이므로 일단 <TStringList> 로 처리후 <char *> 로 변환한다.
          TStringList  *list;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------------------------------------------
  //int _Dir_폴더안의_문서전체이름목록_얻기2_(char           *p경로,
  //                                          char           *p확장자,
  //                                          unsigned char   p하위폴더검사여부, //bool
  //                                          int             p검사조건,
  //                                          char           *r목록);
  //}-----------------------------------------------------------------------------------
  //Dir_Get_FileList_BoundDir2()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pExt, &pExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p하위폴더검사여부]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pLowFolder)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[int  p검사조건]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pOption)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[char  *r목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rList, &rList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[생성]
      //{
          list = new TStringList;
          list->Clear();

      //}

      Dir_Get_FileList_BoundDir2((AnsiString)((char *)pPath),
                                 (AnsiString)((char *)pExt),
                                 !pLowFolder, //원본함수와 반대로 적용.
                                 pOption,
                                 //반환 목록.
                                 list);

      //[길이얻기]
      //{
          //[2020.10.17.토][추가]{--------------
          //[목록] 의 [문자열총길이] 를 구한다.
          //}-----------------------------------

          rReturn = ((AnsiString)(list->Text)).Length();

      //}

      //[목록 반환]
      //{
          //[2020.10.17.토][추가]{--------------------------------------
          //<rList == NULL> 인 경우는 [목록문자열크기] 를 얻기 위한
          //[시뮬레이션기능] 으로만 사용하고 [목록] 은 반환하지 않는다.
          //}-----------------------------------------------------------

          if((char *)rList != NULL)
          {
            //<TStringList> 로 얻은 것을 <char *> 로 변환하여 돌려준다.
            STR_Assign((char *)rList, ((AnsiString)(list->Text)).c_str());

          }

      //}

      //[삭제]
      //{
          //동적 생성된것 삭제.
          if(list != NULL) { delete list; list = NULL; }

      //}

  //}

  //[반환]
  //{
      //[2020.10.17.토][추가]{------
      //[목록문자열총길이] 를 반환.
      //}----------------------------

      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Dir_Get_FileNameList_BoundDir2(void)
{
  //[2020.10.02.금][생성]{-------------------------------------------------------
  //
  //[2020.10.17.토][중요수정]****************************************************
  //
  //[목록] 문자열의 [길이] 를 반환하도록 [반환형] 추가.
  //
  //1) <rList==NULL> => [목록] 을 반환하지 않고 [목록의 총 문자열 길이] 만 반환.
  //
  //2) <rList!=NULL> => [목록] 을 반환하고 [목록의 총 문자열 길이] 도 반환.
  //
  //[폼디자이너] 첫 작품인 [중복폴더추출기] 에서 [목록] 을 저장할 [저장소] 를
  //동적생성하는데 [정확한크기] 를 알 필요가 있어서 기능을 추가한다.
  //
  //즉, 한번은 [목록] 을 저장할 저장소 크기를 얻기위하여 <rList==NULL> 로
  //[시뮬레이션] 후 [저장소크기] 만 얻고, 다음에 다시 <rList!=NULL> 로 사용하여
  //[목록] 을 얻는 방식으로 사용하기 위한것.
  //
  //BCB 원본 함수는 이 기능이 없고 [맷돌:API] 용으로 여기서 직접 처리한다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pPath;      //char           *p경로
          DTU8  pExt;       //char           *p확장자
          DTU1  pLowFolder; //unsigned char   p하위폴더검사여부 //bool
          DTS4  pOption;    //int             p검사조건
          DTU8  rList;      //char           *r목록

          //[2020.10.17.토][추가]
          DTS4  rReturn;    //int 반환값.

      //}

      //[특수]
      //{
          //맷돌C 에 없는 <형> 이므로 일단 <TStringList> 로 처리후 <char *> 로 변환한다.
          TStringList  *list;

      //}

  //}
  
  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------------------------------------------------------
  //int _Dir_폴더안의_문서내부이름목록_얻기2_(char           *p경로,
  //                                          char           *p확장자,
  //                                          unsigned char   p하위폴더검사여부, //bool
  //                                          int             p검사조건,
  //                                          char           *r목록);
  //}-----------------------------------------------------------------------------------
  //Dir_Get_FileNameList_BoundDir2()

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pExt, &pExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p하위폴더검사여부]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pLowFolder)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[int  p검사조건]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pOption)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[char  *r목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rList, &rList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[생성]
      //{
          list = new TStringList;
          list->Clear();
          
      //}

      Dir_Get_FileNameList_BoundDir2((AnsiString)((char *)pPath),
                                     (AnsiString)((char *)pExt),
                                     !pLowFolder, //원본함수와 반대로 적용.
                                     pOption,
                                     //반환 목록.
                                     list);

      //[길이얻기]
      //{
          //[2020.10.17.토][추가]{--------------
          //[목록] 의 [문자열총길이] 를 구한다.
          //}-----------------------------------

          rReturn = ((AnsiString)(list->Text)).Length();

      //}

      //[목록 반환]
      //{
          //[2020.10.17.토][추가]{--------------------------------------
          //<rList == NULL> 인 경우는 [목록문자열크기] 를 얻기 위한
          //[시뮬레이션기능] 으로만 사용하고 [목록] 은 반환하지 않는다.
          //}-----------------------------------------------------------

          if((char *)rList != NULL)
          {
            //<TStringList> 로 얻은 것을 <char *> 로 변환하여 돌려준다.
            STR_Assign((char *)rList, ((AnsiString)(list->Text)).c_str());

          }

      //}

      //[삭제]
      //{
          //동적 생성된것 삭제.
          if(list != NULL) { delete list; list = NULL; }

      //}

  //}

  //[반환]
  //{
      //[2020.10.17.토][추가]{------
      //[목록문자열총길이] 를 반환.
      //}----------------------------

      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}
  
}

void __fastcall _API_File_Dir_Delete_Inner(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDir;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{------------------------------------
  //unsigned char _Dir_내부_삭제_(char  *p경로);
  //}--------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDir, &pDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      rReturn = Dir_Delete_Inner((char *)pDir);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_Dir_IsEmpty(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pDir;

          DTU1  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------------------
  //unsigned char _Dir_비었는지_확인_(char  *p경로);
  //}------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDir)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDir, &pDir);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      rReturn = Dir_IsEmpty((char *)pDir);

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

class _API_FILE_COPYEX
{
  //[2020.l2.19.토][생성]

  private:
  public:

  __fastcall _API_FILE_COPYEX(char  *pSrcPathNameExt,
                              char  *pDstPathNameExt,
                              bool   pOverWrite,
                              bool   pViewDialog,
                              bool  *pStop,
                              int   *rResult);
                              
  __fastcall ~_API_FILE_COPYEX(void);

  //[인수]
  //{
      //[!]{--------------------------------------------------------
      //<_API_File_CopyEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}-----------------------------------------------------------
      
      char  *srcPathNameExt;
      char  *dstPathNameExt;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_FILE_COPYEX::_API_FILE_COPYEX(char  *pSrcPathNameExt,
                                              char  *pDstPathNameExt,
                                              //[덮어쓰기] 의 경우는 <true>.
                                              bool   pOverWrite,
                                              //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                              bool   pViewDialog,
                                              //사용하지 않는 경우는 NULL.
                                              bool  *pStop,
                                              //처리 결과 반환.
                                              // 0 : false.
                                              // 1 : true.
                                              // 2 : 취소.
                                              //-1 : 처리중.
                                              int   *rResult)
{
  //[2020.12.19.토][생성]

  //[인수 저장]
  //{
      srcPathNameExt = pSrcPathNameExt;
      dstPathNameExt = pDstPathNameExt;
      overWrite      = pOverWrite;
      viewDialog     = pViewDialog;
      stop           = pStop;
      result         = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1; 

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_FILE_COPYEX::~_API_FILE_COPYEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_FILE_COPYEX::TimerEvent(TObject *Sender)
{
  //[2020.12.19.토][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리. 
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = File_CopyEx(srcPathNameExt,
                              dstPathNameExt,
                              overWrite,
                              viewDialog,
                              stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_CopyEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcPathNameExt;  //char           *p출발지_경로이름확장자
          DTU8  pDstPathNameExt;  //char           *p도착지_경로이름확장자
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무

          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.19.토][수정]
          DTU8  rResult;          //int            *r처리결과

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------------
  //void _File_고급_복사_(char           *p출발지_경로이름확장자,
  //                      char           *p도착지_경로이름확장자,
  //                      unsigned char   p덮어쓰기유무,
  //                      unsigned char   p진행대화상자유무,
  //                      unsigned char  *p중단요청,
  //                      int            *r처리결과);
  //}-------------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcPathNameExt, &pSrcPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstPathNameExt, &pDstPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[int  *r처리결과]
  //{
      //[2020.12.19.토][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[2020.12.19.토][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_FILE_COPYEX  *fileProc;

      //}

      fileProc = new _API_FILE_COPYEX((char *)pSrcPathNameExt,
                                      (char *)pDstPathNameExt,
                                      pOverWrite,
                                      pViewDialog,
                                      (bool *)pStop,
                                      (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

      //[설명][2021.01.01.금]{***********************************************************
      //
      //이 함수가 종료된 뒤에도 생성된 개체는 계속 [HEAP] 상에 존재한다.
      //이는 <delete> 로 삭제하기 전까지는 해제되지 않기 때문.
      //
      //1) 이 점을 활용하여 이 API 함수는 인수만 넘겨주고 종료하고,
      //
      //2) 생성된 개체의 [타이머] 안에서 실제 파일 처리가 별도 [쓰레드] 로 이루어 지며,
      //
      //3) 결과는 넘겨준 포인터(실제는 [맷돌-C] 상에 존재)로 전달 한 뒤,
      //
      //4) 파일 처리후 [타이머] 내부에서 생성된 개체는 스스로를 삭제한다.
      //
      //5) 모든 파일 처리 완료.
      //
      //이런 방식은 파일처리 API 에 [맷돌-C] 전체가 묶이지 않도록 하는 것에 목적이 있다.
      //즉,
      //
      //1) 파일처리 API 에 인수 전달.
      //
      //2) 파일처리 완료 대기(처리 결과값을 감시).
      //   이 부분의 [무한반목문] 안에서 외부 이벤트를 처리 할수 있다.
      //
      //3) 파일 처리 종료 후 처리.
      //
      //의 과정을 분리하기 위한것.
      //
      //이렇게 하지 않으면 파일처리 API 함수가 종료될때 까지 외부 이벤트 처리 등
      //다른 처리를 할수 없게 된다(API 는 한개 명령어와 동일하므로).
      //
      //이를 방지하기 위하여 위와 같이 [타이머] 를 사용한 별도 [쓰레드] 처리하는 것.
      //}********************************************************************************

  //}

}

class _API_FILE_MOVEEX
{
  //[2020.l2.20.일][생성]

  private:
  public:

  __fastcall _API_FILE_MOVEEX(char  *pSrcPathNameExt,
                              char  *pDstPathNameExt,
                              bool   pOverWrite,
                              bool   pViewDialog,
                              bool  *pStop,
                              int   *rResult);

  __fastcall ~_API_FILE_MOVEEX(void);

  //[인수]
  //{
      //[!]{--------------------------------------------------------
      //<_API_File_MoveEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}-----------------------------------------------------------

      char  *srcPathNameExt;
      char  *dstPathNameExt;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_FILE_MOVEEX::_API_FILE_MOVEEX(char  *pSrcPathNameExt,
                                              char  *pDstPathNameExt,
                                              //[덮어쓰기] 의 경우는 <true>.
                                              bool   pOverWrite,
                                              //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                              bool   pViewDialog,
                                              //사용하지 않는 경우는 NULL.
                                              bool  *pStop,
                                              //처리 결과 반환.
                                              // 0 : false.
                                              // 1 : true.
                                              // 2 : 취소.
                                              //-1 : 처리중.
                                              int   *rResult)
{
  //[2020.12.20.일][생성]

  //[인수 저장]
  //{
      srcPathNameExt = pSrcPathNameExt;
      dstPathNameExt = pDstPathNameExt;
      overWrite      = pOverWrite;
      viewDialog     = pViewDialog;
      stop           = pStop;
      result         = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1;

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_FILE_MOVEEX::~_API_FILE_MOVEEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_FILE_MOVEEX::TimerEvent(TObject *Sender)
{
  //[2020.12.20.일][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리.
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = File_MoveEx(srcPathNameExt,
                              dstPathNameExt,
                              overWrite,
                              viewDialog,
                              stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_MoveEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcPathNameExt;  //char           *p출발지_경로이름확장자
          DTU8  pDstPathNameExt;  //char           *p도착지_경로이름확장자
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무
          
          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.20.일][수정]
          DTU8  rResult;          //int            *r처리결과

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------------
  //void _File_고급_이동_(char           *p출발지_경로이름확장자,
  //                      char           *p도착지_경로이름확장자,
  //                      unsigned char   p덮어쓰기유무,
  //                      unsigned char   p진행대화상자유무,
  //                      unsigned char  *p중단요청,
  //                      int            *r처리결과);
  //}-------------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcPathNameExt, &pSrcPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstPathNameExt, &pDstPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[int  *r처리결과]
  //{
      //[2020.12.20.일][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      //[2020.12.20.일][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_FILE_MOVEEX  *fileProc;

      //}

      fileProc = new _API_FILE_MOVEEX((char *)pSrcPathNameExt,
                                      (char *)pDstPathNameExt,
                                      pOverWrite,
                                      pViewDialog,
                                      (bool *)pStop,
                                      (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

  //}
    
}

class _API_FILES_COPYEX
{
  //[2020.l2.20.일][생성]

  private:
  public:

  __fastcall _API_FILES_COPYEX(char  *pSrcList,
                               char  *pDstList,
                               bool   pOverWrite,
                               bool   pViewDialog,
                               bool  *pStop,
                               int   *rResult);
                              
  __fastcall ~_API_FILES_COPYEX(void);

  //[인수]
  //{
      //[!]{---------------------------------------------------------
      //<_API_Files_CopyEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}------------------------------------------------------------
      
      char  *srcList;
      char  *dstList;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_FILES_COPYEX::_API_FILES_COPYEX(char  *pSrcList,
                                                char  *pDstList,
                                                //[덮어쓰기] 의 경우는 <true>.
                                                bool   pOverWrite,
                                                //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                                bool   pViewDialog,
                                                //사용하지 않는 경우는 NULL.
                                                bool  *pStop,
                                                //처리 결과 반환.
                                                // 0 : false.
                                                // 1 : true.
                                                // 2 : 취소.
                                                //-1 : 처리중.
                                                int   *rResult)
{
  //[2020.12.20.일[생성]

  //[인수 저장]
  //{
      srcList    = pSrcList;
      dstList    = pDstList;
      overWrite  = pOverWrite;
      viewDialog = pViewDialog;
      stop       = pStop;
      result     = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1; 

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_FILES_COPYEX::~_API_FILES_COPYEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_FILES_COPYEX::TimerEvent(TObject *Sender)
{
  //[2020.12.20.일][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리. 
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = Files_CopyEx(srcList,
                               dstList,
                               overWrite,
                               viewDialog,
                               stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_Files_CopyEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcList;         //char           *p출발지_목록
          DTU8  pDstList;         //char           *p도착지_목록
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무

          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.20.일][수정]
          DTU8  rResult;          //int            *r처리결과

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------------------------
  //void _Files_고급_복사_(char           *p출발지_목록,
  //                       char           *p도착지_목록,
  //                       unsigned char   p덮어쓰기유무,
  //                       unsigned char   p진행대화상자유무,
  //                       unsigned char  *p중단요청,
  //                       int            *r처리결과);
  //}---------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcList, &pSrcList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstList, &pDstList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}
  
  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[int  *r처리결과]
  //{
      //[2020.12.20.일][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      //[2020.12.20.일][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_FILES_COPYEX  *fileProc;

      //}

      fileProc = new _API_FILES_COPYEX((char *)pSrcList,
                                       (char *)pDstList,
                                       pOverWrite,
                                       pViewDialog,
                                       (bool *)pStop,
                                       (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

  //}
  
}

class _API_FILES_MOVEEX
{
  //[2020.l2.20.일][생성]

  private:
  public:

  __fastcall _API_FILES_MOVEEX(char  *pSrcList,
                               char  *pDstList,
                               bool   pOverWrite,
                               bool   pViewDialog,
                               bool  *pStop,
                               int   *rResult);
                              
  __fastcall ~_API_FILES_MOVEEX(void);

  //[인수]
  //{
      //[!]{---------------------------------------------------------
      //<_API_Files_MoveEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}------------------------------------------------------------

      char  *srcList;
      char  *dstList;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_FILES_MOVEEX::_API_FILES_MOVEEX(char  *pSrcList,
                                                char  *pDstList,
                                                //[덮어쓰기] 의 경우는 <true>.
                                                bool   pOverWrite,
                                                //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                                bool   pViewDialog,
                                                //사용하지 않는 경우는 NULL.
                                                bool  *pStop,
                                                //처리 결과 반환.
                                                // 0 : false.
                                                // 1 : true.
                                                // 2 : 취소.
                                                //-1 : 처리중.
                                                int   *rResult)
{
  //[2020.12.20.일[생성]

  //[인수 저장]
  //{
      srcList    = pSrcList;
      dstList    = pDstList;
      overWrite  = pOverWrite;
      viewDialog = pViewDialog;
      stop       = pStop;
      result     = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1; 

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_FILES_MOVEEX::~_API_FILES_MOVEEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_FILES_MOVEEX::TimerEvent(TObject *Sender)
{
  //[2020.12.20.일][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리. 
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = Files_MoveEx(srcList,
                               dstList,
                               overWrite,
                               viewDialog,
                               stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_Files_MoveEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcList;         //char           *p출발지_목록
          DTU8  pDstList;         //char           *p도착지_목록
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무
          
          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.20.일][수정]
          DTU8  rResult;          //int            *r처리결과

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------------
  //void _File_고급_이동_(char           *p출발지_경로이름확장자,
  //                      char           *p도착지_경로이름확장자,
  //                      unsigned char   p덮어쓰기유무,
  //                      unsigned char   p진행대화상자유무,
  //                      unsigned char  *p중단요청,
  //                      int            *r처리결과);
  //}-------------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcList, &pSrcList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_목록]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstList)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstList, &pDstList);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}
  
  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[int  *r처리결과]
  //{
      //[2020.12.20.일][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[2020.12.20.일][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_FILES_MOVEEX  *fileProc;

      //}

      fileProc = new _API_FILES_MOVEEX((char *)pSrcList,
                                       (char *)pDstList,
                                       pOverWrite,
                                       pViewDialog,
                                       (bool *)pStop,
                                       (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

  //}
  
}

class _API_DIR_COPYEX
{
  //[2020.l2.20.일][생성]

  private:
  public:

  __fastcall _API_DIR_COPYEX(char  *pSrcPath,
                             char  *pDstPath,
                             bool   pOverWrite,
                             bool   pViewDialog,
                             bool  *pStop,
                             int   *rResult);
                              
  __fastcall ~_API_DIR_COPYEX(void);

  //[인수]
  //{
      //[!]{--------------------------------------------------------
      //<_API_Dir_CopyEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}-----------------------------------------------------------
      
      char  *srcPath;
      char  *dstPath;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_DIR_COPYEX::_API_DIR_COPYEX(char  *pSrcPath,
                                            char  *pDstPath,
                                            //[덮어쓰기] 의 경우는 <true>.
                                            bool   pOverWrite,
                                            //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                            bool   pViewDialog,
                                            //사용하지 않는 경우는 NULL.
                                            bool  *pStop,
                                            //처리 결과 반환.
                                            // 0 : false.
                                            // 1 : true.
                                            // 2 : 취소.
                                            //-1 : 처리중.
                                            int   *rResult)
{
  //[2020.12.20.일][생성]

  //[인수 저장]
  //{
      srcPath    = pSrcPath;
      dstPath    = pDstPath;
      overWrite  = pOverWrite;
      viewDialog = pViewDialog;
      stop       = pStop;
      result     = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1; 

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_DIR_COPYEX::~_API_DIR_COPYEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_DIR_COPYEX::TimerEvent(TObject *Sender)
{
  //[2020.12.20.일][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리. 
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = Dir_CopyEx(srcPath,
                             dstPath,
                             overWrite,
                             viewDialog,
                             stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_Dir_CopyEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcPath;         //char           *p출발지_경로
          DTU8  pDstPath;         //char           *p도착지_경로
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무
          
          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.20.일][수정]
          DTU8  rResult;          //int            *r처리결과
          
      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------
  //void _Dir_고급_복사_(char           *p출발지_경로,
  //                     char           *p도착지_경로,
  //                     unsigned char   p덮어쓰기유무,
  //                     unsigned char   p진행대화상자유무,
  //                     unsigned char  *p중단요청,
  //                     int            *r처리결과);
  //}-------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcPath, &pSrcPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstPath, &pDstPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}
  
  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[int  *r처리결과]
  //{
      //[2020.12.20.일][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      //[2020.12.20.일][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_DIR_COPYEX  *fileProc;

      //}

      fileProc = new _API_DIR_COPYEX((char *)pSrcPath,
                                     (char *)pDstPath,
                                     pOverWrite,
                                     pViewDialog,
                                     (bool *)pStop,
                                     (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

  //}
  
}

class _API_DIR_MOVEEX
{
  //[2020.l2.20.일][생성]

  private:
  public:

  __fastcall _API_DIR_MOVEEX(char  *pSrcPath,
                             char  *pDstPath,
                             bool   pOverWrite,
                             bool   pViewDialog,
                             bool  *pStop,
                             int   *rResult);
                              
  __fastcall ~_API_DIR_MOVEEX(void);

  //[인수]
  //{
      //[!]{--------------------------------------------------------
      //<_API_Dir_MoveEx()> 에서 사용할 인수 정보와 동일하게 선언.
      //생성시 그대로 전달 받는다.
      //}-----------------------------------------------------------
      
      char  *srcPath;
      char  *dstPath;
      bool   overWrite;
      bool   viewDialog;
      bool  *stop;
      int   *result;

  //}

  //[타이머 관련]
  //{
      TTimer  *timer;

      void __fastcall TimerEvent(TObject *Sender);

  //}

};

__fastcall _API_DIR_MOVEEX::_API_DIR_MOVEEX(char  *pSrcPath,
                                            char  *pDstPath,
                                            //[덮어쓰기] 의 경우는 <true>.
                                            bool   pOverWrite,
                                            //[진행대화상자] 를 보일지(true) 말지(false) 선택.
                                            bool   pViewDialog,
                                            //사용하지 않는 경우는 NULL.
                                            bool  *pStop,
                                            //처리 결과 반환.
                                            // 0 : false.
                                            // 1 : true.
                                            // 2 : 취소.
                                            //-1 : 처리중.
                                            int   *rResult)
{
  //[2020.12.20.일][생성]

  //[인수 저장]
  //{
      srcPath    = pSrcPath;
      dstPath    = pDstPath;
      overWrite  = pOverWrite;
      viewDialog = pViewDialog;
      stop       = pStop;
      result     = rResult;

      //[초기화]
      //{
          //[처리중] 으로 초기화.
          *result = -1; 

      //}

  //}

  //[타이머:초기화]
  //{
      timer = new TTimer(NULL);
      timer->OnTimer = TimerEvent;
      timer->Interval = 1; //한번만 사용하므로 1ms 최소 단위로 설정.
      timer->Enabled = true;

  //}

}

__fastcall _API_DIR_MOVEEX::~_API_DIR_MOVEEX(void)
{
  //[2020.12.20.일][생성]
  delete timer; timer = NULL;

}

void __fastcall _API_DIR_MOVEEX::TimerEvent(TObject *Sender)
{
  //[2020.12.20.일][생성]{-----------------------------------------
  //[파일처리] 함수는 이 [이벤트] 안에서 [쓰레드] 로 독립구동된다.
  //}--------------------------------------------------------------

  //가장 먼저 타이머 정지 처리. 
  timer->Enabled = false;

  //[처리]
  //{
      //[!]{---------------------------------------------
      //<(*result)> 의 대상은 실제 [맷돌 C] 상의 변수다.
      //}------------------------------------------------

      (*result) = Dir_MoveEx(srcPath,
                             dstPath,
                             overWrite,
                             viewDialog,
                             stop);

  //}

  //처리후 바로 처리부 삭제.
  delete this;

}

void __fastcall _API_File_Dir_MoveEx(void)
{
  //[2020.10.11.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pSrcPath;         //char           *p출발지_경로
          DTU8  pDstPath;         //char           *p도착지_경로
          DTU1  pOverWrite;       //unsigned char   p덮어쓰기유무
          DTU1  pViewDialog;      //unsigned char   p진행대화상자유무

          //[2020.12.05.토][추가]
          DTU8  pStop;            //unsigned char  *p중단요청

          //[2020.12.20.일][수정]
          DTU8  rResult;          //int            *r처리결과

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------------------
  //void _Dir_고급_이동_(char           *p출발지_경로,
  //                     char           *p도착지_경로,
  //                     unsigned char   p덮어쓰기유무,
  //                     unsigned char   p진행대화상자유무,
  //                     unsigned char  *p중단요청,
  //                     int            *r처리결과);
  //}-------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p출발지_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pSrcPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pSrcPath, &pSrcPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p도착지_경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pDstPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pDstPath, &pDstPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned char  p덮어쓰기유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pOverWrite)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}
  
  //[unsigned char  p진행대화상자유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pViewDialog)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[unsigned char  *p중단요청]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStop)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStop, &pStop);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[int  *r처리결과]
  //{
      //[2020.12.20.일][추가]

      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rResult)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rResult, &rResult);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}
  
  //[명령처리]
  //{
      //[2020.12.20.일][수정]{-------------------
      //[타이머] 를 사용한 새로운 방법으로 수정.
      //}----------------------------------------

      //[VAR]
      //{
          _API_DIR_MOVEEX  *fileProc;

      //}

      fileProc = new _API_DIR_MOVEEX((char *)pSrcPath,
                                     (char *)pDstPath,
                                     pOverWrite,
                                     pViewDialog,
                                     (bool *)pStop,
                                     (int *)rResult);

      //[!]{----------------------------------------------------------------------
      //이 API 는 관련 인수만 전달하고 [파일처리:타이머] 만 생성하고 나오면 된다.
      //나머지는 [타이머:이벤트] 안에서 파일 처리후, 결과까지 포인터로 자동 반환.
      //}-------------------------------------------------------------------------

  //}

}

void __fastcall _API_File_Dir_Exist(void)
{
  //[2020.10.17.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pPath;

          //주소는 전부 MCU 상의 주소다.
          DTU1   rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-----------------------------------
  //unsigned char _Dir_존재확인_(char  *p경로);
  //}-------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[char  *p경로]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPath)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPath, &pPath);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      rReturn = DirectoryExists((AnsiString)((char *)pPath));

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_OpenDialog_MultiSelect(void)
{
  //[2020.10.31.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          DTU1  pUse;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------------------------------
  //void _File_열기대화상자_다중선택_(unsigned char  p사용유무);
  //}------------------------------------------------------------
  
  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[unsigned char  p사용유무]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pUse)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

  //[명령처리]
  //{
      if(pUse == true)
      {
        //[다중선택] 으로 설정.

        main_Form->vmos_OpenDialog->Options.Clear ();

        main_Form->vmos_OpenDialog->Options << ofHideReadOnly << ofAllowMultiSelect << ofEnableSizing;

      }
      else
      {
        //[단일선택] 으로 설정.

        main_Form->vmos_OpenDialog->Options.Clear ();

        main_Form->vmos_OpenDialog->Options << ofHideReadOnly << ofEnableSizing;                                                                                                        

      }

  //}

}

void __fastcall _API_File_OpenDialog_GetSelectCount(void)
{
  //[2020.11.01.일][생성]

  //[VAR]
  //{
      class  VMOS  *vmos;

      //[2011.11.30.수][수정!!!]
      //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
      DTU8   ADR;

      //[API]
      //{
          //반환값
          DTS4   pReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------------------
  //int _File_열기대화상자_선택된_문서개수_얻기_(void);
  //}---------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[명령처리]
  //{
      pReturn = main_Form->vmos_OpenDialog->Files->Count;

  //}

  //[반환값]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&pReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_OpenDialog_FileItem(void)
{
  //[2020.11.01.일][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //[2011.11.29.화][수정!!!]
          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTS4  pIndex;
          DTU8  rPathNameExt;

          DTS4  rReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------------------------
  //int _File_열기대화상자_문서항목_(int    p순번,
  //                                 char  *r경로이름확장자);
  //}---------------------------------------------------------
  
  //[기본주소 얻기]
  //{
      //[2011.11.29.화][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[int  p순번]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pIndex)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[char  *r경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&rPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //<Ide> 내부적으로만 사용되므로 바로 실제 주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(rPathNameExt, &rPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //<pIndex> 의 적합성을 구분해서 처리.
      if((0 <= pIndex) && (pIndex < main_Form->vmos_OpenDialog->Files->Count))
      {
        //범위에 해당하는 경우.

        if(rPathNameExt != NULL)
        {
          //[시뮬레이션] 기능이 아닌 경우만 처리.
          STR_Assign((char *)rPathNameExt, ((AnsiString)(main_Form->vmos_OpenDialog->Files->Strings[pIndex])).c_str());

        }
          
        rReturn = ((AnsiString)(main_Form->vmos_OpenDialog->Files->Strings[pIndex])).Length();

      }
      else
      {
        //범위를 벗어난 경우는 "", 0 을 반환.

        if(rPathNameExt != NULL)
        {
          //[시뮬레이션] 기능이 아닌 경우만 처리.
          STR_Assign((char *)rPathNameExt, "");

        }
        
        rReturn = 0;

      }

  //}

  //[반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_File_OpenDialog_IsMultiSelect(void)
{
  //[2020.11.04.수][생성]

  //[VAR]
  //{
      class  VMOS  *vmos;

      //[2011.11.30.수][수정!!!]
      //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
      DTU8   ADR;

      //[API]
      //{
          //반환값
          DTU1   pReturn;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------------------------------------------
  //unsigned char _File_열기대화상자_다중선택_상태인지_확인_(void);
  //}---------------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[2011.11.30.수][추가!!!]{-----------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[명령처리]
  //{
      //현재 [다중선택] 상태라면 <true> 반환.
      pReturn = main_Form->vmos_OpenDialog->Options.Contains(ofAllowMultiSelect);

  //}

  //[반환값]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&pReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}














