|
일단 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 생성시 어떤 문제가 있었는지 말씀 부탁드립니다.
|