허걱~!
님께서 잘못한것은
FreeLibrary에 있습니다.
DLL에 있는 폼을 종료(free)하지 않은 상태에서 Project1.dll을 FreeLibrary해버리면
당연히 error가 나죠
Form2의 동작 코드가 Dll에 다 있는데
그놈을 메모리에서 날려버렸으니 에러가 안나면 이상하죠..
(에러가 안나는 경우는 Project1.dll이 한군데 이상 load된 경우...)
그리고 vcl 중복 load문제는 dll 프로젝트 옵션 뿐만 아니라
exe 프로젝트 옵션에도 똑같이 build with runtime package 를 체크해줘야 합니다.
참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=808
그럼..
라이손레종ㅎ 님이 쓰신 글 :
: extern "C" __declspec(dllexport) void __stdcall testfunc( TComponent *pParent )
: {
: Form2=new TForm2(pParent );
: Form2->Show();
: }
: 이렇게 하니 DLL 생성은 오류 없이 되었습니다.
: 이것만 수정해서 DLL 로드 하여 버튼 클릭하면
: Access violation at address 400058FE in module 'rtl60.bpl'.Read of address 83EC8B25.
: 오류 메시지가 뜹니다.
:
:
: void TestForm::OnClickButton( TObject *Sender )
: {
: // TestForm 이 메인 Form 이라면...
: testfunc( this );
: }
:
: 또 위의 내용처럼 아래 이부분을 수정 하시라 해서 따라 해보았습니다.
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:
: HMODULE hDll;
: hDll = LoadLibrary("Project1.dll");
: if(hDll==NULL)
: {
: ShowMessage("Can't load dll");
: return;
: }
: typedef __declspec(dllimport) void (*TestFunc)(void);
: TestFunc Test;
:
: Test = (TestFunc)GetProcAddress(hDll,"testfunc");
: if(Test)
: {
: (*Test)(this); // <----이렇게 하라는 거 맞는지요 ?
: }
:
: FreeLibrary(hDll);
:
: }
:
: 이렇게 하니... 안되네요.. ㅜ.ㅜ