글 수 204
MFC를 그대로 써야하는지라
API용의 기본틀을 쓸순 없어서 새로 만들었는데,
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer);
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginOption();
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginClose();
extern "C" __declspec(dllexport) BOOL __stdcall Translate(LPCSTR cszJapanese, LPSTR szKorean, int nBufSize);
이게 ezTransXP 플러그인 소스 헤더에서 함수 규격과 관련된 유일한 부분
그래서
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer);
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginOption();
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginClose();
extern "C" __declspec(dllexport) BOOL __stdcall PreTranslate(LPCSTR cszInJapanese, LPSTR szOutJapanese, int nBufSize);
extern "C" __declspec(dllexport) BOOL __stdcall PostTranslate(LPCSTR cszInKorean, LPSTR szOutKorean, int nBufSize);
extern "C" __declspec(dllexport) const ATPLUGIN_VERSION * __stdcall OnPluginVersion();
요~렇게 대충 흉내를 내줬는데,
기본 함수가 로드 되지 않았다면서 안되더군요;;;
그래서
ATPlugin에서
#pragma comment(linker, "/EXPORT:OnPluginInit=_OnPluginInit@8")
#pragma comment(linker, "/EXPORT:OnPluginOption=_OnPluginOption@0")
#pragma comment(linker, "/EXPORT:OnPluginClose=_OnPluginClose@0")
#pragma comment(linker, "/EXPORT:OnPluginVersion=_OnPluginVersion@0")
#pragma comment(linker, "/EXPORT:PreTranslate=_PreTranslate@12")
#pragma comment(linker, "/EXPORT:PostTranslate=_PostTranslate@12")
이부분을 추가해 주니까 잘 되더라구요
저 아래쪽이 이지트랜스에는 없어도 돌아가는데,
새로 만든 녀석에는 왜 저게 있어야 돌앙가는거죠?
API용의 기본틀을 쓸순 없어서 새로 만들었는데,
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer);
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginOption();
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginClose();
extern "C" __declspec(dllexport) BOOL __stdcall Translate(LPCSTR cszJapanese, LPSTR szKorean, int nBufSize);
이게 ezTransXP 플러그인 소스 헤더에서 함수 규격과 관련된 유일한 부분
그래서
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer);
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginOption();
extern "C" __declspec(dllexport) BOOL __stdcall OnPluginClose();
extern "C" __declspec(dllexport) BOOL __stdcall PreTranslate(LPCSTR cszInJapanese, LPSTR szOutJapanese, int nBufSize);
extern "C" __declspec(dllexport) BOOL __stdcall PostTranslate(LPCSTR cszInKorean, LPSTR szOutKorean, int nBufSize);
extern "C" __declspec(dllexport) const ATPLUGIN_VERSION * __stdcall OnPluginVersion();
요~렇게 대충 흉내를 내줬는데,
기본 함수가 로드 되지 않았다면서 안되더군요;;;
그래서
ATPlugin에서
#pragma comment(linker, "/EXPORT:OnPluginInit=_OnPluginInit@8")
#pragma comment(linker, "/EXPORT:OnPluginOption=_OnPluginOption@0")
#pragma comment(linker, "/EXPORT:OnPluginClose=_OnPluginClose@0")
#pragma comment(linker, "/EXPORT:OnPluginVersion=_OnPluginVersion@0")
#pragma comment(linker, "/EXPORT:PreTranslate=_PreTranslate@12")
#pragma comment(linker, "/EXPORT:PostTranslate=_PostTranslate@12")
이부분을 추가해 주니까 잘 되더라구요
저 아래쪽이 이지트랜스에는 없어도 돌아가는데,
새로 만든 녀석에는 왜 저게 있어야 돌앙가는거죠?
함수 익스포트에는 여러가지 방법이 있는데요, 그냥 __declspec(dllexport) 로 익스포트를 하면 함수 이름이 그냥 쓰여지지 않고 특정 법칙에 의거하여 쓰여집니다. 예를 들면 OnPluginInit 라는 함수는_OnPluginInit@8 이라는 이름으로 익스포트되지요.
그것을 OnPluginInit 라는 이름으로 고쳐주는 것이 저 #pragma comment 세트입니다. 사실 저것보다는 .def 파일을 통해 고쳐주는 것이 좀 더 일반화 된 방법인데요 (ezTransXP 플러그인 소스 내에 ezTransXP.def 파일을 참조하세요), 플러그인 프레임워크에서는 사용자가 원하는 방식의 플러그인을 만들기 위해 동적으로 익스포트할 필요가 있어 #pragma comment 방법을 쓰는 것입니다. .def 파일을 통한 방법은 고정되어 있기 때문에 반드시 적혀있는 모든 함수를 익스포트해야 하거든요.
참고링크.
DLL 에서 내보내기(익스포트) http://msdn.microsoft.com/ko-kr/library/z4zxe9k8(VS.80).aspx
데코레이팅된 이름 http://msdn.microsoft.com/ko-kr/library/56h2zst2(VS.80).aspx
링커 옵션 /EXPORT http://msdn.microsoft.com/ko-kr/library/7k30y2k5(VS.80).aspx