C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[71161] DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?
나그네 [] 5214 읽음    2014-04-07 17:30
안녕하세요.

항상 포럼에서 도움만 받는거 같아 죄송스럽습니다.

제목에 나와있듯이,

DLL은 외부에서 제공하는 것이라 함수명을 바꿀 수는 없습니다. (ㅠㅠ)

DLL 파일과 헤더 파일을 제공받아 사용하는데요.

불행하게도 DLL에서 사용한 함수가 MSDN에 버젓이 있는 API 함수와 동일한 이름입니다.

<헤더 파일에 프로토타입 내용>

extern "C" HANDLE OpenPrinter(unsigned int nIndex);
extern "C" void ClosePrinter(HANDLE hPrinter);

<MSDN에서 검색한 내용>

BOOL OpenPrinter(
  _In_   LPTSTR pPrinterName,
  _Out_  LPHANDLE phPrinter,
  _In_   LPPRINTER_DEFAULTS pDefault
);

BOOL ClosePrinter(
    HANDLE hPrinter     // handle to printer object
   );   


이렇게 저렇게 해 보다가, namespace 라는 기능(?)을 찾게 되어

헤더 파일을 아래와 같이 변경했습니다.

namespace dllsou
{
    extern "C" HANDLE OpenPrinter(unsigned int nIndex);
    extern "C" void ClosePrinter(HANDLE hPrinter);
}

namespace dllsou 이걸로 2줄을 묶었습니다.
(이렇게 안하면 Earlier declaration 에러가 납니다.)

그 다음 소스에서
    (헤더파일의 내용)
    typedef HANDLE (CALLBACK* LPFNOPENPRINTER)(unsigned int);
    LPFNOPENPRINTER             dll_OpenPrinter;
    typedef int (CALLBACK* LPFNCLOSEPRINTER)(HANDLE);
    LPFNCLOSEPRINTER            dll_ClosePrinter;
   
    (소스파일의 LoadLibrary 내용)
    dll_OpenPrinter = (LPFNOPENPRINTER)GetProcAddress(FHwdPrtDLL,"OpenPrinter");
    dll_ClosePrinter = (LPFNCLOSEPRINTER)GetProcAddress(FHwdPrtDLL,"ClosePrinter");

이렇게 LoadLibrary 를 하여 코딩해 보니,

정상적으로 동작되는 거 같았으나,

엄청난 문제가 발생했습니다.

for (i = 0; i < 2; i++)
{
    Test();
}

Test() 에는 dll_OpenPrinter와 dll_ClosePrinter 를 한번씩 호출했습니다.

그런데, for 문 없이 1번만 버튼 이벤트에서 Test() 를 코딩했을 때는 문제가 없는듯이 보였는데,

위와 같이 for문으로 2번을 돌리자, Access violation 에러가 나타납니다.

질문의 요지를 정리하면,

DLL의 함수명이 WIN API 함수명과 같았을 때, DLL를 고치지 않고 사용하려면 어떻게 해야 하는지 입니다.

기초가 부족하여 이런 부분에 닥치면, 갑갑한 마음만 드네요.

고수님들의 자세한(?) 답변 꼭 부탁드립니다.


+ -

관련 글 리스트
71161 DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요? 나그네 5214 2014/04/07
71185     Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요? pwrlove 3603 2014/04/11
71215         Re:Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?[답변감사합니다.] 3459 2014/04/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.