|
출장갔다가 서울올라가는 KTX안입니다. ㅋㅋ
1. 가변인자 함수는 콜링컨벤션이 cdecl만 가능합니다.
stdcall이나 fastcall 등은 안됩니다.
2. GetProcAddress로 못찾는것은 콜링컨벤션 문제가 아니라
네임멩글링 문제입니다.
Dependency 같은 프로그램으로 dll 을 열어보시면 어떤 name으로 export되어있는지 확인하실수 있습니다.
그럼..
SEM80 님이 쓰신 글 :
: 안녕하세요^^
: 처음으로 볼랜드 포럼에 문의를 하게 되었습니다.
: 항상 볼랜드 포럼의 Q&A정보란을 통해서 많은 일들을 해결하였습니다.
: 하지만 갑자기 안되는 일이 발생해서요...아무리 볼랜드 포럼을 검색하고
: 구글링을 해도 찾을 수 없어서 이렇게 도움을 청하고자 합니다.
: 부디 고수님들의 많은 도움 부탁드립니다.
: 제가 문의 드리고자 하는 내용은 DLL관련 문의입니다.
: 다음과 같이 간단하게 가변함수를 갖는 DLL를 만들었습니다. =>Sample도 첨부하였습니다.(2010에서 사용)
: /_______________________________________________________________________________________/
: extern "C" __declspec(dllexport) unsigned int __stdcall _AddTestV (int Count, ...)
: {
: va_list ap;
: int i, sum;
:
: va_start (ap, Count);
:
: sum = 0;
: for (i = 0; i < Count; i++)
: sum += va_arg (ap, int);
:
: va_end (ap);
:
: return sum;
: }
: /_______________________________________________________________________________________/
: 그리고 DLL 안에 있는 가변함수를 다음과 같이 폼에서 불러 왔습니다.
: /_______________________________________________________________________________________/
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
: unsigned int (*AddTestV)(int Count, ...);
:
: int iResult = 0;
: HINSTANCE hDll;
:
: bool Success = False;
:
: hDll = LoadLibrary("TestDLL.dll");
: if(hDll!=NULL)
: {
: AddTestV =(unsigned int(*)(int,...)) GetProcAddress(hDll,"_AddTestV");
: Success = (AddTestV != NULL);
: if(Success)
: {
: iResult = (*AddTestV)(5,10,20,30,40,57);
: }
: }
: Edit2->Text = iResult;
: }
: /_______________________________________________________________________________________/
:
: 그런데 GetProcAddress로 함수를 읽어오면 null 값이 들어옵니다.
: 첨부한 sample에 보시면 고정변수는 별문제없이 값이 넘어오지만 이상하게 가변인자를 갖는 함수만은 넘어 오지를 못합니다..
: 혹시나해서...잘 못한게 아닌가 싶어서...VC++로도 DLL를 만들어보았습니다...그런데 VC++에서도 똑같이 가변인자 함수가 있는 DLL를 만들어 C++Builder를 이용하여서 가변인자 함수를 불러오면 이상없이 값이 제대로 넘어옵니다.
: 그래서 콜백문제인가 싶어서 __cdecl, __stdcall를 바꾸어 가면서도 실험을 해보았으나 값이 넘어오지 않는 문제가 동일하게 발생하였습니다. 도저히 몇일 동안 검색을 해보고 찾아보고 했으나 제대로 된 답을 찾지 못해서 이렇게 부득이하게 문의 드립니다.
: 제가 혹시 sample 프로그램을 잘못 만든 것인지...코딩이 잘 못 한 것인지... 실행을 잘 못한 것인지...고수님들의 좋은 답변 부탁드립니다.
|