C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50001] Re:폼을 포함한 DLL을 VC에서 호출할때...
장성호 [nasilso] 1193 읽음    2007-07-20 16:59
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()로는 제대로 동작하는데 말이죠...
: 왜 이런 현상이 발생할까요???

+ -

관련 글 리스트
49994 폼을 포함한 DLL을 VC에서 호출할때... 시몬 1051 2007/07/20
50001     Re:폼을 포함한 DLL을 VC에서 호출할때... 장성호 1193 2007/07/20
50000     [자답] 헉 제가 잠시 미쳤었나 보네요 ㅡㅜ 시몬 1069 2007/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.