|
장성호님 감사합니다.^^
확인해본 결과 calling convertions하고
DLL 함수의 Name Mangling이 잘 못 되었습니다.
궁금했던 사항이 풀려서 속이 시원합니다.
좋은 답변 감사드립니다.
장성호 님이 쓰신 글 :
: 출장갔다가 서울올라가는 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 프로그램을 잘못 만든 것인지...코딩이 잘 못 한 것인지... 실행을 잘 못한 것인지...고수님들의 좋은 답변 부탁드립니다.
|