|
extern "C" HWND __stdcall CreateAndShow()
{
TForm2* pRtn = new TForm2(NULL);
pRtn->Show();
return pRtn->Handle;
}
이 함수에서 HWND를 Return 하시는데요
Handle 이 TFrom2 인스턴스 자체는 아닙니다.
pRtn 과 pRtn->Handle 는 다른놈 입니다.
pRtn은 TForm2 클래스( 폼위에 올려진 모든 Control을 포함한 ...) 놈이고
pRtn->Handle 은 TForm2 클래서의 메인 윈도우의 핸들일 뿐입니다.
그냥
return (void *)pRtn; //이렇게 하십시요
[TForm2::ModifyText () 까지 간것은?]
TForm2::ModifyText 함수 입구까지 간것은?
그냥 멤ㅣ버 함수는 instance가 없더라도 사용할수 있기에
ShowMessage까지는 간것입니다.
그러나 Label1->Caption = text; //==> 이부분에서
TForm2의 Label1에 접그해야하는데.. instance 포인터가 잘못되어있으니....
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm1 *frm; //new로 Instance를 생성하지 않았음
frm->ShowText("adadfasfd");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowText(String str)
{
ShowMessage(str); // 여기까지는 정상
this->Caption=str; // 여기서 에러남
}
//---------------------------------------------------------------------------
그럼...
시몬 님이 쓰신 글 :
: 안녕하세요.
:
: 폼을 포함한 DLL을 만들었습니다.
:
: Unit1.cpp파일==============================================
:
: #include <vcl.h>
: #include <windows.h>
: #pragma hdrstop
: #include "Unit2.h"
: #pragma argsused
: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
: {
: ShowMessage("Called DllMain");
: return 1;
: }
: extern "C" HWND __stdcall CreateAndShow()
: {
: TForm2* pRtn = new TForm2(NULL);
: pRtn->Show();
: return pRtn->Handle;
: }
: extern "C" void __stdcall ModifyText(HWND hwnd, const char* text)
: {
: ((TForm2*)hwnd)->ModifyText(text);
: }
:
: 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::ModifyText(AnsiString text)
: {
: ShowMessage("Here! TForm2 : "+text);
: Label1->Caption = text;
: Label1->Refresh();
: }
: void __fastcall TForm2::Button1Click(TObject *Sender)
: {
: Label1->Caption ="이름변경 성공";
: }
:
: 위와 같이 작성하였습니다.
: 이걸 VC++에서 호출하는데요 CreateAndShow()함수로 폼은 제대로 생성됩니다.
: 그런데 ModifyText()을 호출하면...
: TForm2에서 ShowMessage("Here! TForm2 : "+text);까지는 제대로 들어갑니다.
: 그렇지만 Label1->Caption = text; 이쪽에 들어가자 마자 DllMain()이 호출되면서 종료됩니다.
:
: 아래만든 버튼 Button1Click()로는 제대로 동작하는데 말이죠...
: 왜 이런 현상이 발생할까요???
|