|
안녕하세요.
항상 포럼에서 도움만 받는거 같아 죄송스럽습니다.
제목에 나와있듯이,
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를 고치지 않고 사용하려면 어떻게 해야 하는지 입니다.
기초가 부족하여 이런 부분에 닥치면, 갑갑한 마음만 드네요.
고수님들의 자세한(?) 답변 꼭 부탁드립니다.
|