DLL에서 데이터를 가져와야 하는데, 데이터가 가변적(크기가 일정하지 않음)일 경우가 있습니다.
이를 처리하는 방법은 여러 가지가 있는데, 크게 'DLL 외부에서 할당하고 DLL 내부에서 이를 사용하는 방법' 과 'DLL 내부에서 할당하고 DLL 외부에서 이를 사용하는 방법' 으로 나눌 수 있습니다.
전자의 경우 DLL 외부에서 충분한 사이즈의 메모리를 확보하려면 DLL 내부에 메모리를 얼마나 할당해야 하는지 요청해야 하는 번거로움이 생깁니다.(물론, 최대치를 정해버릴 수 있겠지만 가장 나쁜 방법이죠. 고정이 되어 버리기 때문에...)
후자의 경우 DLL 내부에서 사이즈의 메모리를 확보하고 DLL 외부에 메모리를 그대로 보내 주면 되기 때문에 자료를 한 번에 요청할 수 있고, DB 액세스가 필요한 경우 쿼리를 여러 번 실행할 필요가 없기 때문에 더욱 효율적일 수 있습니다.
이 때, 우리가 생각해야 하는 것 중 하나가 메모리 해제인데, DLL 내부에서 메모리를 할당하고 DLL 외부에서 이를 받아서 사용할 경우, 사용은 가능하지만 해제하게 되면 에러가 발생합니다.
이를 해결하기 위해 DLL 외부에서 DLL 내부에 메모리 해제를 요청할 수 있도록 합니다. 메모리 해제를 알려 주고 받아온 메모리 주소를 보내면 DLL 내부에서 메모리를 해제하면 됩니다.
아래는 DLL 내부의 코드와 DLL 외부의 코드입니다.
DLL 내부의 코드
DLL 외부의 코드
위의 두 코드에서 pData, ppData에 대해 메모리 구조(특히 포인터가 가리키는 것)를 직접 그려서 유심히 살펴보기 바랍니다.
메모리 구조만 그려볼 수 있게 되면 100% 이해하게 되는 것입니다.
이를 처리하는 방법은 여러 가지가 있는데, 크게 'DLL 외부에서 할당하고 DLL 내부에서 이를 사용하는 방법' 과 'DLL 내부에서 할당하고 DLL 외부에서 이를 사용하는 방법' 으로 나눌 수 있습니다.
전자의 경우 DLL 외부에서 충분한 사이즈의 메모리를 확보하려면 DLL 내부에 메모리를 얼마나 할당해야 하는지 요청해야 하는 번거로움이 생깁니다.(물론, 최대치를 정해버릴 수 있겠지만 가장 나쁜 방법이죠. 고정이 되어 버리기 때문에...)
후자의 경우 DLL 내부에서 사이즈의 메모리를 확보하고 DLL 외부에 메모리를 그대로 보내 주면 되기 때문에 자료를 한 번에 요청할 수 있고, DB 액세스가 필요한 경우 쿼리를 여러 번 실행할 필요가 없기 때문에 더욱 효율적일 수 있습니다.
이 때, 우리가 생각해야 하는 것 중 하나가 메모리 해제인데, DLL 내부에서 메모리를 할당하고 DLL 외부에서 이를 받아서 사용할 경우, 사용은 가능하지만 해제하게 되면 에러가 발생합니다.
이를 해결하기 위해 DLL 외부에서 DLL 내부에 메모리 해제를 요청할 수 있도록 합니다. 메모리 해제를 알려 주고 받아온 메모리 주소를 보내면 DLL 내부에서 메모리를 해제하면 됩니다.
아래는 DLL 내부의 코드와 DLL 외부의 코드입니다.
DLL 내부의 코드
// TESTDLL_API는 __declspec(dllexport)를 표현하는 define 이다.
TESTDLL_API void testMem(char ** ppData, int * nDataCount);
TESTDLL_API void testMem(char ** ppData, int * nDataCount)
{
// 사이즈를 저장할 수 있는 공간을 NULL로 할당할 때, *ppData 를 메모리 해제
if( !nDataCount )
{
delete [] *ppData;
return;
}
*ppData = new char[10];
for( int i = 0 ; i < 10 ; i++ )
{
*( *(ppData) + i) = i + 'A';
}
*nDataCount = 10;
}
|
DLL 외부의 코드
char * pData;
int nCount;
testMem(&pData, &nCount);
for( int i = 0 ; i < nCount ; i++ )
{
printf("-- %c\n", *(pData + i));
}
testMem(&pData, NULL);
|
위의 두 코드에서 pData, ppData에 대해 메모리 구조(특히 포인터가 가리키는 것)를 직접 그려서 유심히 살펴보기 바랍니다.
메모리 구조만 그려볼 수 있게 되면 100% 이해하게 되는 것입니다.
'Dev.Programming > Lang.C_CPP' 카테고리의 다른 글
| [C/C++]함수 포인터를 이용한 DLL과 사용 프로그램 간의 양방향 호출 (0) | 2007/07/12 |
|---|---|
| [C/C++]DLL 외부에서 DLL 내부의 가변 크기 데이터를 가져오는 방법 (0) | 2007/05/29 |
| [C/C++] char *(*(**foo [][8])())[]; 를 해석할 줄 아는가? (0) | 2006/12/22 |
| [퍼옴]ActiveX 컨트롤에서의 IObjectSafety 인터페이스 구현 (0) | 2006/12/19 |
| [MFC]CListCtrl에 Drag & Drop 기능을 추가하는 방법 (0) | 2005/11/25 |
| [MFC]CListCtrl에 CUSTOM DRAW를 적용하는 방법 (0) | 2005/11/25 |


