C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[64909] Re:가변인자 함수를 갖는 DLL 관련 문의입니다.
장성호 [nasilso] 1904 읽음    2011-08-02 16:40
출장갔다가 서울올라가는 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 프로그램을 잘못 만든 것인지...코딩이 잘 못 한 것인지... 실행을 잘 못한 것인지...고수님들의 좋은 답변 부탁드립니다.

+ -

관련 글 리스트
64902 가변인자 함수를 갖는 DLL 관련 문의입니다. SEM80 1234 2011/08/02
64909     Re:가변인자 함수를 갖는 DLL 관련 문의입니다. 장성호 1904 2011/08/02
64916         감사합니다.^^ SEM80 1106 2011/08/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.