본문 바로가기
SAS/SAS 함수

[SAS 함수] 42. CALL MODULE 함수

by 기서무나구물 2018. 11. 20.

포스팅 목차

    42. CALL MODULE

     


    return code 없이 외부 루틴(windows API : WINDOWS에서 제공하는 함수)을 호출하여 사용한다.

    Category: 외부 루틴

     


    MAIN

    문 법


    CALL MODULE
     (<cntl-string,>module-name<,argument-1, ..., argument-n>);

     

    Arguments

    cntl-string
         는 선택적 통제 열을 지정.

     

    module-name
         는 이용될 외부 모듈 이름 지정.

     

         

    argument
         는 외부 루틴에 대한 인수 지정.

     


    참 고

     

    자세한 사항은 SAS도움말과 다음 페이지를 참고하시기를 
     ( http://www.devenezia.com/downloads/sas/sascbtbl )


    * MODULE 함수를 사용해 외부의 DLL 루틴을 데이터 스텝이나 SCL 프로그램중으로부터 이용할 수 있습니다.
    * 간단한 DOS명령어보다 WIN32 API(Application Programming Interfaces)를 선호하는 이유.
    1. WIN32 API는 DOS명령어보다 빠르다;
    2. DOS 명령어는 명령어 실행동안 Pop-up창이 뜬다.
     

     * Some Module 정의

    SAS Statements Results
    ExitWindowsEX 이 함수는 윈도우 O/S에게 윈도우가 종료되어야 함을 알려 윈도우 O/S가 종료되게 한다.
    GetDiskFreeSpace 디스크 용량을 알아낸다.
    GetDriveType 드라이브의 종류를 취득한다.
    GetModuleFileName 현재 실행 중인 파일의 파일경로를 반환한다.
    GetModuleHandle 활성 메모리의 모듈이나 dll의 핸들을 return합니다.
    GetPrivateProfileInt INI파일의 정보를 읽고 쓴다.
    GetPrivateProfileString INI파일의 정보를 읽고 쓴다.
    GetProfileInt WIN.INI파일의 정보를 읽고 쓴다.
    GetProfileString WIN.INI파일의 정보를 읽고 쓴다.
    GetSystemDirectory 시스템 디렉토리를 반환한다.
    GetTempPathTEMP  폴더의 경로를 반환한다.
    GetTempFileName TEMP파일을 생성한다.
    GetUserNameA 현재 유저의 로그온 네임을 return합니다.
    GetVersion 운영시스템의 버전 정보를 반환한다.
    GetVersionEx 운영시스템의 버전의 확장된 정보를 반환한다.
    GetVolumeInformation 드라이브 관련 정보들, 즉 볼륨이름, 볼륨 시리얼넘버, 파일 시스템 이름 등을 알려줍니다.
    GetWindowsDirectory 이 함수는 윈도우즈 디렉토리를 반환한다.GetSystemInfo시스템 정보를 반환한다.
    MessageBeep 소리를 발생한다.
    MessageBox 메시지 박스를 출력합니다.
    SwapMouseButton 마우스의 오른쪽 버튼과 왼쪽 버튼을 서로 교환한다.
    WritePrivateProfileString INI파일에 정보를 복사한다.
    WriteProfileString WIN.INI파일에 정보를 복사한다.
    GetWin32sInfo 현재 인스톨된 WIN32의 버전 정보를 반환한다.


     


    예 제

     

    예 제 1 :

    외부루틴(Beep)을 사용하여서 소리를 발생시킨다.

    SAS Statements
    FILENAME back "c:\back.dat";

    data _null_; file back;
           put "routine Beep";
           put "minarg=2";
           put "maxarg=102";
           put "stackpop=called";
           put "callseq=byvalue";
           put "module=kernel32;";
           put "arg 1 num format=pib4.;";
           put "arg 2 num format=pib4.;";
    run;


    filename sascbtbl "c:\back.dat";

    data _null_;
           call module ("Beep",1980,500);
           * rc = modulen("Beep",1980,500);
    run;

     


    예 제 2 :

    외부루틴(GetUserNameA)을 사용하여서 사용자 이름을 획득하자.
    * 외부 DLL 호출의 기능을 사용하여, Win32 API GetUserName 함수에 의해서 유저 ID를 취득한다.

    SAS Statements
    filename SASCBTBL 'c:\tmp.txt';

    /* 속성 테이블의 작성 */

    data _null_;
           file sascbtbl; put 'routine GetUserNameA';

           put ' minarg=2';
           put ' maxarg=2';
           put ' stackpop=called';
           put ' module=advapi32';
           put ' returns=short;';
           put 'arg 1 update format=$cstr200.; ';
           put 'arg 2 num input format=pib4.; ';
    run;

    data _null_;
           length userid $20;
           userid = ' ';

           * OS(WIN_PRO)의 판정;
           if "&sysscpl" ne 'WIN_PRO' then do;
              put 'Windows 95 or Windows NT환경에서만 동작합니다.';
              stop;
           end;

           * 유저 ID의 획득;
           * call module ('GetUserNameA', userid, 20);
           rc = modulen('GetUserNameA', userid, 20);
           if rc=0 then put '특정의 유저 ID로 로그 온 하고 있지 않습니다.';
           else put userid=;
    run;

     


    예 제 3 :

    외부루틴(MessageBoxA)을 이용하여서 POP-UP창 만들어 보자.

    SAS Statements
    filename SASCBTBL 'c:\tmp.txt';
    /* 속성 테이블의 작성 */
    data _null_;
         file sascbtbl;
         put 'routine MessageBoxA';
         put 'module=USER32'; * dll이름;
         put 'minarg=4'; * 인수 최소개수;
         put 'maxarg=4'; * 인수 최대개수;
         put 'stackpop=called'; * 모든 win32 서비스 루틴이 이속성을 필요로함(루틴호출);
         put 'returns=short'; * dll루틴 반환타입;
         put ';';
         put 'arg 1 input num format=pib4. byvalue;';
         put 'arg 2 input char format=$cstr200.;';
         put 'arg 3 input char format=$cstr200.;';
         put 'arg 4 input num format=pib4. byvalue;';
    run;
    data back;
         call module("MessageBoxA",0,'백승민사랑하십니까?','만만세',0);
    run;

     


    예 제 4 :

    외부루틴(CopyFileA)을 사용하여서 DATA FILE 복사하자. 즉, back.txt 파일을 copyfile.txt 파일로 복사한다.

    SAS Statements 비 교
    filename sascbtbl 'c:\back.txt'; 

    data back;
         file sascbtbl; put 'Routine CopyFileA';
         put 'module=KERNEL32'; put 'minarg=3 maxarg=3  stackpop=called';
         put 'returns=ushort;';
         put 'arg 1 input char format=$cstr200.; * FROM ;';
         put 'arg 2 input char format=$cstr200.; * TO ;';
         put 'arg 3 input num format=pib4. byvalue;';
    run;

    filename sascbtbl 'c:\back.txt'; 
    data _null_; 
         rc = modulen('*e','CopyFileA','c:\back.txt', 'c:\copyfile.txt', 0); 
    run; 
    filename sascbtbl clear;
     * system(도스) 명령어사용하여서 파일을 복사하자;
    Data _null_;
         rc = system('copy c:\back.txt c:\copyfile.txt');
    Run;

     


    예 제 5 :

    외부루틴(GetTempPathA)을 사용하여서 TEMP 루트 위치를 파악하자.

    SAS Statements
    filename sascbtbl "c:\back.txt";
     data _null_;
         file sascbtbl; 
         put 'routine GetTempPathA'; put 'minarg=2';
         put 'maxarg=2'; put 'stackpop=called';
         put 'returns=long;'; put 'arg 1 input byvalue format=pib4.;';
         put 'arg 2 update format=$cstr200.;';
    run;


    filename sascbtbl "c:\back.txt";
    data _null_;
         length path $200;
         path='';
         n = modulen( "*ie","KERNEL32,GetTempPathA", 199, path );
         put n= path=;
    run;

     


    예 제 6 :

    외부루틴(lstrcat)을 이용하여서 문자열 결합하자.

    다음의 예제는 외부 루틴을 사용하여서 변수 string1과 변수 string2를 결합하여 출력한다.

    SAS Statements
    filename sascbtbl "c:\back.txt";
     data _null_;
         file sascbtbl; 
         put 'routine lstrcat'; put 'minarg=2';
         put 'maxarg=2'; put 'stackpop=called';
         put 'module=KERNEL32'; put 'returns=ulong;';
         put 'arg 1 char format=$cstr200.;'; put 'arg 2 char format=$cstr200.;';
    run;

    filename sascbtbl 'c:\back.txt';
    data _null_;
         length string1 string2 conctstr $200;
         string1 = 'This is';
         string2 = ' a test!';
         rc = modulen('lstrcat',string1,string2);
         conctstr = peekc(rc,200);
         put conctstr=;
    run;

     


    함수 비교

      Functions:
      043.CALL MODULEI
      272.MODULEC
      273.MODULEIC
      274.MODULEIN
      275.MODULEN

    SAS 함수(SAS Function) 리스트 링크

     

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 데이터 스텝 구문 리스트(SAS Data Step Statement)
    반응형

    댓글