안녕하세요.
dll 에 클래스 넣어서 쓰는 방법 상당히 쉽습니다.
여러 dll 을 만들면서 VC++ 에서나 빌더에서 클래스를 포함하여
dll 을 만들어 보았는데 문제는 없습니다.
다만 클래스 형태라 델파이나 비베 쪽에서는 약간 쓰기 곤란할지도 모르겠네여.
VC++ 에서 만든 DLL 을 빌더에서 호출할때나
빌더에서 만든 DLL 을 VC++ 에서 호출하거나
빌더에서 빌더로 호출하는것도 마찬가지 입니다.
extern "C" __export __stdcall
void CreateFTPServer(TFTPServer **FTP)
{
*FTP = new TFTPServer;
}
extern "C" __declspec(dllexport) TSerialComm* CreateSerialComm()
{
TSerialComm *Comm = new TSerialComm();
return Comm;
}
위에껀 빌더에서 dll 안에서 만들어 놓은 함수이구
아래쪽은 vc++ 에서 dll 안에 만들어 놓은 함수입니다.
저 함수 하나를 호출하여 생성한 클래스 메모리 포인터를 넘기게 되구요.
위에 TFTPServer 나 TSerialComm 의 경우 아래의 헤더처럼 만드시면 됩니다.
class TCodeShuffle
{
public:
TCodeShuffle();
virtual void Free();
virtual void SetOptHideComment(int value);
virtual void SetOptShuffle(int value);
virtual void SetOptVarAddString(int value);
virtual void SetVarAddString(char *String);
virtual void SetUnchangeFile(char *FileName);
virtual void SetChangeFile(char *FileName);
virtual char *Run(char *SourceFileName, char *ChangeVarFileName, char *UnchangeFileName, int *OutputLength);
};
외부에서 호출해야 할 함수들을 virtual 을 지정하여서 작성하시면 됩니다.
헤더 선언시에만 저렇게 사용을 하며
void TCodeShuffle :: SetOptHideComment(int value)
{
...
}
처럼. 코드 안에서는 virtual 을 선언할 필요는 없이 헤더에서만 virtual 을 선언합니다.
이제 dll 을 위처럼 만들었으면 호출하는 곳에서는 아래처럼 활용합니다.
void main()
{
// DLL 로드
HINSTANCE hInst = LoadLibrary ("CodeShuffle.dll");
typedef TCodeShuffle* (*PFNCreateA1)();
// 클래스 적재 함수 받음
PFNCreateA1 pfnCreateA1 = (PFNCreateA1)GetProcAddress(hInst, TEXT("CreateCodeShuffle"));
// 클래스 생성
TCodeShuffle* a = (pfnCreateA1)();
int OutputLength;
a->SetOptHideComment(true);
a->SetOptShuffle(true);
a->SetOptVarAddString(true);
//a->SetVarAddString("BProject_");
a->SetChangeFile("D:\\Mobile Top\\서버팀\\Project\\Code Shuffle\\Output\\change.txt");
a->SetUnchangeFile("D:\\Mobile Top\\서버팀\\Project\\Code Shuffle\\Output\\unchange.txt");
char *Output = a->Run("D:\\Mobile Top\\서버팀\\Project\\Code Shuffle\\Output\\main.cpp", "", "", &OutputLength);
char *Output = a->Run("D:\\Mobile Top\\서버팀\\Project\\Code Shuffle\\Output\\main.cpp", "", "", &OutputLength);
char *Output = a->Run("D:\\Mobile Top\\서버팀\\Project\\Code Shuffle\\Output\\main.cpp", "", "", &OutputLength);
FILE *fp = fopen("c:\\a.out.h", "w");
fwrite(Output, OutputLength, 1, fp);
fclose(fp);
}
그러 도움이 되셨는지~~
제가 개인적으로 계속해서 모아둔 빌더 팁은
http://www.wanny.co.kr 에 계속해서
쌓아놓고 있답니다. (홍보해서뤼 죄송~!)
그럼 이만!
니엘이~~* 님이 쓰신 글 :
: 안녕하세요.
:
: 현재 만들고 있는 라이브러리를 DLL로 만들어서 배포하려고 해요.
:
: 물론 VC++에서나 BCB에서나 모두 사용할 수 있는 라이브러리를 목적으루..
:
: 그래서 제가 다음과 같이 했습니다.
:
: [소스파일]------------------------------------------------
:
: extern "C" {
: __declspec(dllexport) __stdcall int func1();
: __declspec(dllexport) __stdcall int func2();
: }
:
: __declspec(dllexport) __stdcall int func1() {
: //..
: }
:
: __declspec(dllexport) __stdcall int func2() {
: //..
: }
:
: [배포용 해더파일]------------------------------------------------
: extern "C" {
: __declspec(dllimport) __stdcall int func1();
: __declspec(dllimport) __stdcall int func2();
: }
:
: --------------------------------------------------------------
:
: 위와 같이 소스 파일만들구 *.dll 파일과 *.lib 파일을 만든후..
:
: 헤더파일과 같이 배포하여 사용해본 결과...
:
: 예상대로 잘 되더군요..
:
: 그런데요...
:
: 제가 한 게 맞게 잘 한건가요?? 뭔가 이상하다는 느낌이...
:
: 그리구요...
:
: DLL에 클래스를 넣을 수는 없을까요??
:
: bcbdev에서 본것처럼 클래스 flattening이나 COM을 이용하는 방법 이외에요..
:
: 아시는 분 좀 가르쳐주세요~~!!