|
안녕하세요. 워프입니다.
VB.NET을 (주)로 하다.. 어떤 계기로 C Builder을 (주)로 잡기로 했습니다.
닷넷에서는 프로젝트를 만들고 exe 에서 dll로 바꾸는것이 너무 쉽고(프로젝트 빌드시에 클래스라이브러리 지정;;)
또한 동적으로 폼을 호출할때에도 어셈블리로드 함수로 dll 참조하여 바로 사용가능하는것이 간단했는데..
빌더에서는 이렇케나 어려운것인지..
4~5일 이것만 고민하고 있습니다. 무엇이 맞는지.. 또 무엇이 해답일지..
저와 같은 초입분들이 많이 계실까요?;; 여하튼.. 아래의 소스를 확인하여 주세요.
사용환경은 Builder XE 입니다. (30)
// dll 프로젝트를 아래와 같이 만들었습니다.
// 그리고 useFrm이라는 폼을 하나 생성하였습니다.
//----- 프로젝트 -> New Project -> Dynamic-link Library -> c++ / Use Vcl체크
################################## File1.cpp 내용#######################
#include <vcl.h>
#include <windows.h>
//USEFORM("Unit1.cpp", Form1); // -> 사용방법을 몰라서 아래처럼.. 컴파일시에
// waring뜨더군요... Unit1.obj 와 File1.obj 충돌경고;;
#include "Unit1.cpp" // 이렇케 하는게 맞는지요.
#pragma hdrstop
/* ....
*/
#pragma argsused
extern "C" {
__declspec(dllexport) void __stdcall showfrm(void){
TForm1* frm = new TForm1(0);
frm->ShowModal();
delete frm;
}
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
#################################################################
// 이제 dll 동적 폼을 위한 테스트를 하기위해 아래와 같이
// 폼위에 버튼을 추가 하여 버튼글릭시 dll을 참조하여 dll폼을 호출하였습니다.
################### Unit2.cpp 소스 부분###############################
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
/*
볼랜드포럼, 구글신, 등등에서 보면 동적호출하는 방법에서 디스크립터(핸들?)
선언하는게 여러가지가 있어서.. 무엇을 써야할지 모르겠습니다.
1. HMODULE dll;
2. HINSTANCE dll;
3. HINSTANCE__ dll;
*/
HINSTANCE dll; // 우선 이 타입으로 선언을 했습니다.
/*
이부분에서도, LoadLibrary로 쓰시는 분들부터.. LoadLibraryEx등 각양각색이던데..
XE 버전에서는 아래와 같이 인텔리센스? 에 나타나는 것은 4개더군요..
무엇을 써야 할까요?
1. LoadLibraryA();
2. LoadLibraryExA();
3. LoadLibraryExW();
4. LoadLibraryW();
*/
dll = LoadLibrary(L"Project1.dll"); // 같은 폴더에 dll파일을 넣었습니다.
// dll = LoadLibrary("Project1.dll") 이렇케 했을경우에는 문제가 나더군요.. XE에서만 그런가요?
typedef __declspec(dllimport) void (*SHOWFORM)(void); // 이부분도.. 여러 해답이;;
// 1. typedef void (*SHOWFORM)(void)
// 2. typedef void __stdcall (*SHOWFORM)(void) // 방식이 도데체 몇개나;;;
SHOWFORM frm = (SHOWFORM)GetProcAddress(dll,"showfrm");
frm(); // 호출부분.. 호출이 이루어집니다. 다만.. dll의 Form1 객체를(클래스)
// 직접가지고 올수 있을까요?
// dll 부분에 Form1(클래스)객체의 포인터를 넘기면 되겠지만..
// type을 명시해줘야 하는데... 고민입니다.
// 제가 하고싶은것은
// 인사과.dll, 총무과.dll, ... 등으로 화면을 별도 개발하여
// 차후 업데이트시에 dll만 배포하려고 합니다.
// 메인(exe)은 넘어오는 dll이름을 가지고 동적메뉴를 생성하게 했습니다.
//
// 닷넷에서는 어셈블리로드 함수로 그 dll 파일을 직접물고 위에 설명드린것처럼
// 여러 dll로 나누어 관리 할수 있었는데..
// 지금 이걸루 거진 4~5일을 씨름하고 있습니다. ㅠㅠ
// bpl로 만들어서 동적으로 폼을 호출하는 방법은 도대체 어찌해야 할까요..
// 그리고 무엇이 더 관리상 편할까요..
// 닷넷에서 넘어와... C Builder에 빠져있는 워프였습니다. ㅠㅠ 도움부탁드리겠습니다.
}
###########################################################################
내용이 길어서 읽어 보시기 힘드시죠?..
보시는 시간에 시각에 알흠다움을 보여드리고 싶지만...
상황봐서요 ㅠㅠ(은;
|