Q&A

  • DLL에서 컴포넌트 사용시 이벤트 링크 문제?
Comport 라는 통신 컴포넌트가 있을때,
메세지를 받았을때 다음과 같은 이벤트가 발생합니다.
procedure Tform1.ComportRxChar();

그런데 이걸 dll로 만들었을때(즉 폼이 없을때)
이벤트가 발생했을때 프로시져로 대입을 해야 하는데 어떻게
해야 하나요?
즉...
아래 소스에서 Read라는 프로시져에서 메세지를 받는
OnRxChar이벤트가 발생했을때 ComportRxChar프로시져로
대입을 해주었는데...
Incompatible Type 에러가 발생하네요...
어렵지 않는 문제인거 같은데 좀 도와주세요...

procedure ComportRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
end;

procedure Read(Sender: TObject);
begin
  Comport.OnRxChar:=ComportRxChar;
end;
4  COMMENTS
  • Profile
    KDDG_Drop 2003.04.08 04:31
    안녕하세요. 주삼식입니다.

    꼭 그 프로시져를 넘길려고 하지마시구요. 특정 사용자 함수를 만듭니다. 이렇게 하는것이 마음대로 콘트롤할 수 있어서 더 좋습니다.

    DLL에 포함되는 선언부 유닛에 아래와 같이 선언하구요.
    unit XXXX;

    type
      TCTIDetectEvent = procedure(RingCount: Integer; DTMFNumber, CallerID: PChar; AStopPlay: Boolean); stdcall;

    function SetCTIDetect(ACTIDetect: TCTIDetectEvent): Integer; stdcall;
    begin
      Result := 1;
      try
        with FrmDVRServer do
        begin
          FOnCTIDetectEvent := ACTIDetect;
          Result := 0;
        end;
      except
      end;
    end;

    DLL에 포함되는 메인유닛에 아래와 같이 코딩하구요.
      public
        { Public declarations }
        FOnCTIDetectEvent: TCTIDetectEvent;

    procedure TfrmDVRServer.CTIEventHandlerRingDetect(Sender: TObject;
      RingCount: Integer);
    begin
      try
        if Assigned(FOnCTIDetectEvent) then
           FOnCTIDetectEvent(RingCount, '', '', False);
      except
      end;
    end;


    실행프로그램(exe)에 포함되는 Unit에는 아래와 같이 가져가면 됩니다.

    unit EEEE;
    type
      TCTIDetectEvent = procedure(RingCount: Integer; DTMFNumber, CallerID: PChar; AStopPlay: Boolean); stdcall;

    function SetCTIDetect(ACTIDetect: TCTIDetectEvent): Integer; stdcall; external DLLNAME;

    그리고, 메인에서는 이렇게 이벤트를 받아올 함수를 선언해두고 아래와 같이 부르면 되죠.
    implementation

    {$R *.DFM}

    procedure CTIDetect(RingCount: Integer; DTMFNumber, CallerID: PChar; AStopPlay: Boolean); stdcall;
    begin
    end;

    if SetCTIDetect(@CTIDetect) <> 0 then
      ...;

    소스를 다 올릴수는 없고 추린다고 추렸는데 복잡하다면 죄송합니다.
    참고적으로 DLL를 만들때는 String을 사용하지 마시구요. API의 표준인 PChar를 사용하세요. 그래야만 다른 언어(VB, C++, PB 등등)에서 무리없이 사용할 수 있습니다.

    감사합니다.

    최용일씨가 심플한 소스를 가지고 있는데 자료실에 올리라니까 아직 안 올렸네여. ㅎㅎㅎㅎ

  • Profile
    최남선 2003.04.08 00:08
    방금 어떤 분이 답변을 해주셨다가 지우셨네여...
    비슷한 야그인데...
    Incompatible Type 에러가 나는 이유는
    메소드 포인터와 프로시저 포인터는 타입이 다르기 때문입니다.
    아래에서
    Comport.OnRxChar := ComportRxChar;
    Comport.OnRxChar는 메소드 포인터 타입이고
    ComportRxChar는 프로시저 포인터 타입입니다.
    오브젝트 파스칼에서 프로시저 포인터 타입은 항상 메소드 포인터 타입과
    호환되지 않습니다. 이유는 프로시저 포인터 타입은 4바이트이고
    메소드 포인터 타입은 8바이트(메소드의 주소 4바이트 + 메소드가 속한 객체에 대한 참조 4바이트) 입니다.
    해결방법은 임의의 클래스를 만들어 사용할 수 있습니다.
    임의의 클래스 보다 더 좋은건 컴포넌트 클래스를 상속 받아 사용하는게
    더욱 좋겠구요...

  • Profile
    타락천사 2003.04.07 21:41
    안녕하세요. 타락임다..

    에러로 봐서.. 두 프로시저의 타입이 안맞는 것 같습니다.

    즉, Comport.OnRxChar 가 procedure (Sender: TObject; Count: Integer);
    타입이 아닌것 같습니다.

    문제는 파라미터 중 Sender: TObject 에 적절한 값이 와야 겠죠. TObject 타입은 델파이와 씨빌더에만 있다고 보시면 됩니다.
    제 생각에는 어떤 타입도 안맞을 테니, 걍 NIL 을 넘기면 해결될것으로 보입니다.

    어렵지 않아여. Sender 대신 NIL만 넘겨주면 되여.

    즐푸하세여..

    타락천사..

  • Profile
    김민수 2003.04.07 22:09
    Comport.OnRxChar:=ComportRxChar(nil,count)
    같이 nil을 넘겼는데도 컴파일 에러가 나네요...
    다시 한번 부탁드려요...

    • 이정택
    • 2003.04.07 22:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Drop
      2003.04.08 03:38
      안녕하세요. 주삼식입니다. 있는데 못 찾은 것 뿐이네요. MaxPage를 설정하셔야 되구요. FromPage, T...
    • 박상호
    • 2003.04.07 21:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김희곤
    • 2003.04.07 21:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.04.08 00:06
      안녕하세요. 최용일입니다. 걍 ShellExecute로 실행하세요... uses     ShellA...
    • 김민수
    • 2003.04.07 19:22
    • 4 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Drop
      2003.04.08 04:31
      안녕하세요. 주삼식입니다. 꼭 그 프로시져를 넘길려고 하지마시구요. 특정 사용자 함수를 만듭니다. ...
    • 최남선
      2003.04.08 00:08
      방금 어떤 분이 답변을 해주셨다가 지우셨네여... 비슷한 야그인데... Incompatible Type 에러가 나는 이...
    • 타락천사
      2003.04.07 21:41
      안녕하세요. 타락임다.. 에러로 봐서.. 두 프로시저의 타입이 안맞는 것 같습니다. 즉, Comport.OnRx...
    • 김민수
      2003.04.07 22:09
      Comport.OnRxChar:=ComportRxChar(nil,count) 같이 nil을 넘겼는데도 컴파일 에러가 나네요... 다시 한번...
    • nilriri™
      2003.04.07 18:35
      좌측에 Left로 Panel하나 놓고 우측에 Client로 Panel 하나 놓고 촤측 Panel위에 트리뷰를 Client로 놓고...
    • SEN
      2003.04.07 18:21
      showmessage(IntToStr(i)); 하시면 메세지 보실수 있습니다~
    • 정재호
    • 2003.04.07 04:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2003.04.07 19:17
      안녕하세요 하얀까마귀 입니다. 제가 그책을 안봐서 정확한건 아니겠지만 아마  일반적인 윈...
    • 박헤정
    • 2003.04.07 02:33
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 신연근
      2003.04.07 18:43
      답변하는 사람들은 전혀 급하지 않느뎅..^^ keypreview를 true로 하시구요 프로퍼티에서 해도 되구 직접...
    • SEN
      2003.04.07 18:33
      F3 의 VirtualKey 는 VK_F3 입니다. KeyDown 이벤트에서 쓰시면 될것같습니다~~
    • 조태근
    • 2003.04.06 23:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2003.04.07 18:54
      Visible 의 속성 True False 가 안되면 크기를 변환시켜줘 보세요. 예를 들어 width =0 height=0 으로 주...
    • 장태원
      2003.04.07 18:56
      폼을 Create 해서 showmodal 하여 주십시오. 보통 Create 문장이 project 파일에 삽입되어잇는데..이부분...
    • 이병훈
      2003.04.09 10:50
      안녕하세요. 전 이렇게 함 풀어 봤습니다. CREATE TABLE TMP1 (    dday VARCHAR2(10)...
    • 오선배
      2003.04.06 23:23
      델마당에 있어요 그렇게   ????
    • 타락천사
      2003.04.06 22:29
      안녕하세여.. 타락임다.. 답변이 없는 것은, 쿼리 사용법의 문제가 아니라고 보기 때문입니다. 이런 ...
    • 궁금이
    • 2003.04.06 04:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2003.04.07 19:08
      ListBox1.ItemIndex := ListBox1.count-1;
    • 이우준
    • 2003.04.06 03:51
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2003.04.06 20:02
      안녕하세여.. 타락임다..ㅡㅡ 5 : if ADOQuery.Recordcount <= 0 then 를 if ADOQuery1.Recordcou...
    • 이우준
      2003.04.08 05:58
      ㅜ.ㅜ 흑.. 5 : <- 요고는 설명하려고 제가 임의로 넣은건뎅.. ㅠ.ㅠ 실제 코드에는 없어요.. ㅠ.ㅠ ...
    • 이승근
    • 2003.04.06 01:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2003.04.07 19:11
      책을 사세요. 질문하신것들은 데이타베이스를 전혀 모르시는듯 합니다. 알고자하는것만 물어서 답을 ...
    • 그냥
    • 2003.04.05 20:55
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2003.04.08 00:22
      ^^ 그거는 DirectX가 아니구 DirectShow입니다. Show는 기본적으로 DirectX의 기반위에 있기는 하지만은....
    • 그냥
      2003.04.08 02:34
      캬 박상윤님..DX쪽은 박상윤님의 답글이 많더니.. 역쉬 예상대로 박상윤님이 답변을 해 주시네요..^^ Dir...
    • 박상윤
      2003.04.10 00:11
      감솨 합니다.... msn 쓰구 잇으니  아뒤 멜이나 쪽지로 날려 주세여... 그리구 시간내서 한번 ...
    • 그냥
      2003.04.10 06:54
      ... 국방의 의무를 하러...8월에 간다..ㅋㅋ
    • SEN
      2003.04.07 19:01
      procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin    if (key >= #...
    • 정욱
    • 2003.04.05 05:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 벤지
      2003.04.05 06:52
      bin 안에 bpl 를 선택하시면 Tab 에 나타나구요오 다른 bpl 들도 지원은 하지만 Tab 에만 안 나타날뿐이예...
    • 타락천사
      2003.04.05 05:58
      안녕하세요. 타락임다.. 델파이의 리소스 편집기라고 붙어 있는 ImageEditor는 별로 입니다. 16 Bit 시...
    • 벤지
      2003.04.05 06:09
      답변 진심으로 감사 들입니다. 유명하신 타락천사님에게 설명 받으니 기분이 좋은데요 ( 거의 아~부~지요...
    • 타락천사
      2003.04.05 10:49
      안녕하세요. 타락임다.. VC++ 쪽으로는 기본 툴만 씁니다. 델파이는 컴파일러와 디버거로 쓰고, 다른...
    • 벤지
      2003.04.06 00:32
    • 박헤정
    • 2003.04.05 04:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 벤지
      2003.04.05 05:10
      방법은 많거든요오 1) 리소스를 로딩해서 사용하는 방법하구요    implementation  ...
    • 우소
      2003.04.07 23:44
      Beep 간단히 삐 소리가 나구요.. MessageBeep함수가 있음 ..좀더 다양함..