|
안녕하세요^^
처음으로 볼랜드 포럼에 문의를 하게 되었습니다.
항상 볼랜드 포럼의 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 프로그램을 잘못 만든 것인지...코딩이 잘 못 한 것인지... 실행을 잘 못한 것인지...고수님들의 좋은 답변 부탁드립니다.
|