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
[71185] Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?
pwrlove [pwrlove] 3603 읽음    2014-04-11 10:11
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 3603 2014/04/11
71215         Re:Re:DLL의 함수 이름이 중복되었을 때 처리를 어떻게 해야 하나요?[답변감사합니다.] 3459 2014/04/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.