2010년 2월 9일 화요일

외부 dll 함수 호출하여 쓰기

인스톨실드로 작업을 하다가 보면 부득이하게 외부의 기능을 사용할 때가 많습니다.

인스톨스크립트로만 해결하면 좋겠지만 지원하지 않는 기능이 있으면 어쩔수 없이 사용을 해야 되겠죠.

 

이번에는 C++  만든 dll 을 호출하여 사용하는 방법에 대해 말씀드리겠습니다.

 

기능은 간단합니다.

 

두개의 int 형 변수를 넘겼을때 두변수의 합을 구하는 dll 을 호출하여 리턴값을 사용하는 방법입니다.

 

1>먼저 dll 만드는 코드입니다.

생성되는 dll 의 이름은 ParseString.dll 입니다. (다른 기능도 사용하느라 명명이 이렇게 되었네요)

우리가 사용할 함수의 이름은 CalSum 입니다.

소스 코드입니다.

 

extern "C" _declspec(dllexport) int CalSum(int number1,int number2);

 

extern "C" _declspec(dllexport) int CalSum(int number1,int number2)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

 int ret = number1+ number2;
 return ret;
}

 

보시면 아시겠지만 C++을 잘 모르시는 분도 누구나 이해가 가능한 코드입니다.

number1+ number2  의 값을 ret 에 할당하여 리턴해 주는 함수입니다.

 

2>인스톨실드상에서 호출하는 방법

- 아래 그림과 같이 Support Files/Billboard 에 dll 파일을 등록합니다.

 

 

 

등록 후에 스크립트 상에 아래와 같은 코드를 작성합니다.

 

//함수의 원형을 선언해 줍니다  parseString 내부의 CalSum  이라는 함수를 사용한다는 의미

prototype cdecl int parseString.CalSum( BYVAL INT, BYVAL INT);  

 

*외부 함수를 호출할때 BYVAL 과 BYREF 두가지 개념이 있습니다. 첫번째는 값 자체 두번째는 포인터 같은 주소 개념입니다. 여기서는 BYVAL 을 사용했습니다.

 

string szDllPath ;

int nResult, retnum ;

 

szDllPath = SUPPORTDIR^"parseString.dll"; //호출하고자 하는 dll 의 경로를 지정해줍니다.
 nResult = UseDLL(szDllPath);  
 
 
    if( nResult = 0 ) then  //UseDll 함수는 dll 이 정상적으로 로드되었을때 0을 리턴합니다.
     retnum = CalSum(1,2); //여기서 3이 리턴되면 제대로 된 결과가 나온겁니다.    
    endif;
 
  UnUseDLL ( szDllPath );     //사용한 dll 은 언로드 해줍니다.

댓글 없음:

댓글 쓰기