Hi! 방가방가..... 부산 DT&C의 박영목 입니다. ㅋㅋㅋㅋㅋ.............
델파이에서는 아주 잘 되더니(아주 간단히 되더군요... 그런데 변수명칭이 달라.. 조금 귀찮음)
.... 이게 빌더에서는
잘 안된다. lib의 형식 COFF를 OMF로 바꾸어야 한다.
그런데 COFF2OMF.exe가 이상하다는 등의 Q&A에 도배가 되어 있네요,...
하긴 저도 COFF2OMF.exe 이것은 뭔가 이상해 HEX로 보면 거의 0x00으로 채워져 있어요....
정도 이게 사용할 일이 생겨서... 어제부터 이것 저것 해보다....
오늘 잘 되네요....
동적으로 하는 것은 잘 되더군요....
1. VC++에서 DLL을 하나 만든다. 물론 Release 모드로..... 이런 형태로 -> void WINAPI VC_Draw( HDC hdc )
2. DLL을 사용하고자는 C++Builder의 현재 작업 폴더로 복사... lib 파일은 필요없음
3. 명령 프롬프트를 사용해서 아니면 도스모드에서
작업폴더에 ExDll.dll이 있다고 가정하고... implib ExDll ExDll.dll (Enter) ExDll.lib 생성
4. C++ Builder 프로젝터에 ExDll.lib을 Add 하세요....
5. extern "C" __declspec(dllexport) void __stdcall VC_Draw( HDC hdc ); //이런 형태로 소스 상단에 선언해 주세요...
6. 실행하시면 됩니다.
//---------------------------------------------------------------------------
VC++ DLL에서 class 사용하던 어쨌던 모든 것을 만들고....
그것을 호출하는 함수는
void WINAPI VC_Draw( HDC hdc ) 이런 형태로 만들고
이 함수 내부에서 VC++ Class로 만든 것을 호출하는 식으로 하시면 VC++의 모든 것을 사용할 수 있습니다. 너무 쉽게 설명하는 것 같다...
다 아실 것인데.... ㅋㅋㅋㅋㅋㅋ
//---------------------------------------------------------------------------
C++ Builder소스는 환경이 다른면 컴파일이 잘 되어 초보자는 힘들어 하더군요..... 실행만 해 보고 직접 만들어 보세요... 안되면
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct stNameAdd {
char name[12+1];
char add[60+1];
};
extern "C" __declspec(dllexport) bool __stdcall ExeGetPah(LPCTSTR Path);
extern "C" __declspec(dllexport) stNameAdd __stdcall ExeInputDlg( stNameAdd data );
extern "C" __declspec(dllexport) void __stdcall VC_Draw( HDC hdc );
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnExeGetPahClick(TObject *Sender)
{
//ExeGetPah( "Project2.exe" ); 외부프로그램 실행
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnExeInputDlgClick(TObject *Sender)
{
stNameAdd data;
AnsiString str;
strcpy( data.name, "gsbsoft" );
strcpy( data.add, "Busan City" );
data = ExeInputDlg( data ); // VC++로 만든 Dialog에 매개변수를 집어넣고 바뀐 값을 다시 Return
str = data.name;
str += ", ";
str += data.add;
ShowMessage( str );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnVCDrawClick(TObject *Sender)
{
VC_Draw( Image1->Canvas->Handle ); //그림에 원을 그려준다.
Image1->Refresh(); //현재 VC++로 된 고도의 지형을 그려주는 루틴이 있습니다.
} //이것을 C++ Builder로 바꿀려고 하니 골치가 아파.. 시간도 별로 없고... 그래서 .. 이 방법으로 하려고 합니다.
//---------------------------------------------------------------------------
|
str += ", ";
str += data.add;
+_+ 옵티마이징 코드로군요 ~ 불필요한 임시변수를 사용하지 않도록 한다는^^