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
[64767] Re:Re:Re:[질문]DLL 생성시..
이용태 [] 1419 읽음    2011-07-07 17:59
일단 SayHello()에 대한 구현은 하신거죠?

그리고 클래스를 정의한 후, 함수를 호출할려면 객체를 하나 맹글어주셔야 합니다.

전역변수로 클래스 객체 하나 만들고요...

Cdll aa;

extern "C" __declspec(dllexport) void 클래스 생성함수
{
       aa = new Cdll;
}

extern "C" __declspec(dllexport) void hello호출함수
{
       aa->SayHello();
}

일케 해보시죠...



그리고 전 DLL을 동적으로 불러오는게 아닌 걍 플램 실행시 다 올라오도록 했습니다.(lib 추가에 따른 DLL 자동 로딩-정적방법이군요.)

만약 만들어진 DLL을 implib를 이용해서 lib 맹글면 정적으로 사용할 수도 있을거 같네요.



unitas 님이 쓰신 글 :
: 답변 감사합니다.
:
: class를 만들때 (dll에 헤더 파일이 없기때문에 New - Text로 해서 dll3.h로 저장했습니다.)
: 기본변수와 함수를 추가하라고 하셨는데 아래처럼 만들면 되는건가요? (변수는 없습니다)
: class Cdll
: {
:     public:       
:             void SayHello();
: };
:
: dll 파일은
: #include <vcl.h>
: #pragma hdrstop
: #include "dll3.h"
: extern "C" __declspec(dllexport) void SayHello()
: {
:     ShowMessage("Hello World !");
: }
: int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
: {
:     return 1;
: }
: //---------------------------------------------------------------------------
:
: 호출하는 프로그램에 lib 파일 추가하고 같은 path에 dll파일 넣어도 결과는 마찬가지 입니다.
: 말씀하신 방법대로 했는지 모르겠습니다.
:
: 그런데 말씀하신 방법은 정적 DLL 방식입니까?
: DLL을 처음 사용하는거라  여기있는 게시판을 몇일동안 읽어보니 동적 DLL은 LIB 추가없이
: 아래의 함수로 접근할 수 있다는 글을 읽은것 같은데 맞습니까?
: HINSTANCE hDll;
: LoadLibrary();
: typedef __declspec(dllimport) void (*SayHello)(void);
: SayHello Test;
: GetProcAddress(hDll,"SayHello");
: FreeLibrary(hDll);
:
: 업체에서 DLL파일을 준다고 했습니다.  아직 일정은 잡히지 않았고 어떤 Tool로 만드는지도 아직 모름니다.
:
: 그전에 Dll 에 대해서 준비를 하려고 시작을 했는데 잘 안되네요.
: 그리고 lib 파일은 헤더파일(class)없이도 make 하면 만들어 지지 않나요?
: 없으면 implib로 만들수도 있구요?
:
: 그리고 궁금한것은 tdump -ee로 export 함수들을 보면은
: hellow 예제는 단 두줄 SayHello 와 __CPPdebugHook 이렇게 나옵니다.
: 제가 만든것도 위에 두줄 부분이 나오지만 그전에 EXPORT 함수들이 많이 나옵니다.
: 저는 hellow 예제와 똑같이 했는데요 
: dll 파일을 만들때 제가 빠뜨린것은 있는지? 무엇이 잘못되었는지 궁금합니다.
:
: 게시판에서 다운받은 파일로 만든 dll 파일로 하면 정상적으로 잘 동작합니다. (class, lib 없어도 정상동작합니다.)
: 제가 만든 dll에 문제가 있는것 같은데 예제와 똑같이 한다고 했는데 어디에서 잘못되었는지 모르겠습니다.
:
:
:
:
:
: 이용태 님이 쓰신 글 :
: : 저같은 경우는 DLL을 만들때
: :
: : 일단 클래스(기본 변수 및 함수 포함)를 만들어 놓고... (<--- 요 부분이 숨기고 싶어하는 핵심 부분이겠죠..)
: :
: : 이 클래스의 함수를 외부에서 사용할 수 있도록 한번더 wrapping 작업을 합니다.
: : extern "C" __declspec(dllexport) 어떤 함수
: : {
: :        클래스 함수();
: : }
: :
: : 이렇게 만든 것에 대해 dll를 만들고..(그럼 lib도 자동으로 맹글어집니다.)
: :
: : 프로젝트에 lib 추가하고 dll 집어넣은 후, 헤더 화일(extern "C" __declspec(dllexport) 어떤 함수 목록)을 통해 dll안의 함수들을 접근해서 쓰곤 합니다.
: :
: :
: : 일단 님께서 SayHello()를 위에서 제가 얘기한 방법대로 만들어 보신 후, 테스트를 해보세요..
: :
: :
: :
: :
: :
: : unitas 님이 쓰신 글 :
: : : DLL 을 처음 사용하게 되었는데 처음부터 쉽지가 않네요.
: : : 이 게시판에 있는 예제를 가지고 만들어 봤습니다.
: : :
: : : Hellow 예제를 가지고 똑같이 만들어 보려고 했는데 잘 되지 않습니다.
: : : 아무래도 DLL 생성에 문제가 있는것 같은데요.
: : : DLL Wizard로 해서 BOX가 나타날때 C++,  Use VCL를 선택해서 했습니다.
: : :
: : : DLL Source는 아래처럼 게시판에 있는 예제와 똑같이 했습니다.
: : : #include <vcl.h>
: : : #pragma hdrstop
: : :
: : : extern "C" __export __stdcall void SayHello()
: : : {
: : :     ShowMessage("Hello World !");
: : : }
: : : int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
: : : {
: : :     return 1;
: : : }
: : :
: : : Make를 하면 dll 파일크기가 574 kb 나옵니다.  다운받은 예제로 make 하면  크기가 468 kb 나옵니다.
: : :
: : : dll를 호출하는 프로그램 소스는 아래와 같이 했습니다.
: : : 그러면 첨부한 그림 Error 메세지가 나타납니다.
: : :
: : : 다운받은 예제로 만든 dll를 호출하면 정상적으로 처리가 됩니다.
: : :
: : : hDll = LoadLibrary("C:\\TEMP\\DLL\\TestDll\\DynamicHelloDll.dll"); => 로 하면 정상 처리 됩니다.
: : :
: : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : {
: : :     Label1->Caption = "";
: : :    
: : :     HINSTANCE hDll;
: : :     hDll = LoadLibrary("C:\\TEMP\\DLL\\TestDll\\dll3.dll");  => 이부분에서 Error 나타납니다.
: : :
: : :     if(hDll==NULL)
: : :     {
: : :         ShowMessage("Can't load dll");
: : :         return;
: : :     }
: : :     typedef __declspec(dllimport) void (*SayHello)(void);
: : :     SayHello Test;
: : :
: : :     Test = (SayHello)GetProcAddress(hDll,"SayHello");
: : :     if(Test)
: : :     {
: : :         (*Test)();
: : :     }
: : :     FreeLibrary(hDll);
: : : }
: : : //---------------------------------------------------------------------------
: : :
: : : tdump -ee 로 내용을 봤습니다.
: : : 첨부한 그림중 Hellow는 다운받아서 만든 dll 입니다. 결과는 두줄 나옵니다.
: : : 제가만든 dll은 dlltest_1, dlltest_2 처럼 내용 많이 나옵니다. (양이 많아서 두개의 파일로 첨부했습니다.)
: : :
: : : 옵션에서 Linker에서 Use dynamic RTC와  Packages Runtime부분 UnCheck 하고
: : : Directories/Conditionals에서도 Include / Library path도 필요없는것 다 삭제 했습니다.
: : :
: : : 다운받은 예제는 C++ Builder 6.0 이전 버전에서 만든것 같습니다.
: : : 저는 C++ Builder 6.0을 사용합니다.
: : :
: : : DLL 생성시 어떤 문제가 있었는지 말씀 부탁드립니다.

+ -

관련 글 리스트
64761 [질문]DLL 생성시.. unitas 1677 2011/07/07
64798     Re:[질문]DLL 생성시 - 자답 unitas 1935 2011/07/13
64779     Re:[질문]DLL 생성시.. aa 1850 2011/07/08
64780         Re:Re:[질문]DLL 생성시.. unitas 1573 2011/07/09
64769     Re:[질문]DLL 생성시.. aa 1364 2011/07/07
64771         Re:Re:[질문]DLL 생성시.. unitas 1727 2011/07/08
64762     Re:[질문]DLL 생성시.. 이용태 1550 2011/07/07
64766         Re:Re:[질문]DLL 생성시.. unitas 1217 2011/07/07
64767             Re:Re:Re:[질문]DLL 생성시.. 이용태 1419 2011/07/07
64768                 Re:Re:Re:Re:[질문]DLL 생성시.. unitas 1901 2011/07/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.