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
[71215] Re:Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?[답변감사합니다.]
[] 3459 읽음    2014-04-14 10:00
pwrlove님 관심있는 답변 너무 감사드립니다.
DLL을 직접 바인딩해서 사용한 적이 없어서 너무 무지했습니다.
항상 LIB파일을 가지고 사용다하보니... ㅠㅠ

답변을 보고 역시 아직 갈길이 멀구나 하는 생각이 드네요.
항상 즐거운 프로그래밍하시기 바랍니다.

pwrlove 님이 쓰신 글 :
: LoadLibrary -> GetProcAddress -> FreeLibrary
:
: 동적 바인딩을 이용하는 방법이 맞습니다.
: 그렇게하면 함수 프로토 타입을 콜백 형식으로 임의로 재정의가 가능하게 되고,
: Symbolic pool 에 중복이 되지 않게 됩니다.
:
: 동적바인딩을 사용하게 되면 헤더파일의
: : namespace dllsou
: : {
: :     extern "C" HANDLE OpenPrinter(unsigned int nIndex);
: :     extern "C" void ClosePrinter(HANDLE hPrinter);
: : }
: :
:
: 이 부분은 인클루드 하지 않으셔도 됩니다. 필요 없습니다.
: 그 부분을 했다는 것은 DLL을 사용하기 위해서 빈껍데기에 해당하는 *.lib을 사용하셨다는 것인데
: 이걸 빼시고 그냥 콜백 포인터만 선언하시고, LoadLibrary 해서 동적으로 사용하시길 바랍니다.
:
: 그리고, 아래의 소스를 자세히 볼 수 없어서 판단하기는 쉽지 않지만,
:
: for (i = 0; i < 2; i++)
: {
:     Test();
: }
:
: 처음 호출했을때 되었다고 말씀하신걸 봐서는
: DLL 내부에서 어떤 리소스 초기화가 되지 않은 상태에서
: 재 호출하여 발생된 문제로 추정이 됩니다.
:
: DLL API 사용법을 좀 더 정확히 점검해 보시는게 좋을 듯 합니다.
:
:
:
: 나그네 님이 쓰신 글 :
: : 안녕하세요.
: :
: : 항상 포럼에서 도움만 받는거 같아 죄송스럽습니다.
: :
: : 제목에 나와있듯이,
: :
: : 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의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요? 나그네 5215 2014/04/07
71185     Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요? pwrlove 3604 2014/04/11
71215         Re:Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?[답변감사합니다.] 3459 2014/04/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.