Q&A

  • Dll 내부에서 TNotifyEvent 문제임돠...
이 문제로 거의 한달간 끙끙대구 있습니다... ㅠ.ㅠ

Dll 에서 Timer를 사용하려 하고 있는데 왕처보인 저로서는 엄청 어렵네여...

ㅠ.ㅠ

고수님들 조언좀 부탁드립니다...

소스를 보시면 아시겠지만 현재 Timer의 OnTimer 를 지정하기 위한 이벤트를 생성하지 못해서 헤매고 있습니다..

Dll 내부에서 Timer를 동적생성하여 사용하려 하는데 OnTimer 이벤트 처리를 어떻게 해야할지...6-.-

지난번에도 질문을 올렸었는데 조언을 받아도 헤매이게 되네여... ㅠ.ㅠ

고수님들 조언좀 부탁드립니다....

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
  ExtCtrls, Registry;

type
  TMyTimer = class(TTimer)
  private
   FOnTimer : TNotifyEvent;
  {private declarations}
  protected
  {protected declarations}
  public
  {public declarations}
  published
   property OnTimer : TNotifyEvent read FOnTimer write FOnTimer;
  {published declarations}
  end;

var
  Time : TTimer;
  Reg : TRegistry;
{$R *.RES}

function HookSHELL : Boolean; external 'HookDll.dll';
function UnHookSHELL : Boolean; external 'HookDll.dll';

procedure OnTimer(Sender : Tobject; OnTimer : TNotifyEvent);
begin
  ShowMessage('11');
  Reg := TRegistry.Create;
  ShowMessage('12');
  Reg.RootKey := HKEY_CURRENT_USER;
  ShowMessage('13');
  Reg.OpenKey('SOFTWAREMJ', True);
  ShowMessage('14');

  if Reg.ValueExists('suc') then
    begin
      ShowMessage('15');
      UnHookSHELL;
      ShowMessage('16');
      Sleep(1000);
      ShowMessage('17');
      Reg.DeleteValue('suc');
      ShowMessage('18');
      Sleep(1000);
      ShowMessage('19');
      Reg.CloseKey;
      ShowMessage('20');
      Sleep(1000);
      ShowMessage('21');
      Reg.Free;
      ShowMessage('22');
      HookSHELL;
      ShowMessage('23');
    end;
end;

begin
  Time := TTimer.Create(nil);
  Showmessage('1');
  Time.Enabled := False;
  ShowMessage('2');
  Time.Interval := 1000;
  ShowMessage('3');
  Time.OnTimer := OnTimer;
// 이곳에서 [Error] NZDll.dpr(84): Incompatible types: method pointer and regular procedure 가 나고 있습니다.. Type이 안맞는거는 알겠는뎅..ㅠ.ㅠ
  ShowMessage('4');
  Time.Enabled := True;
  ShowMessage('5');
end.
1  COMMENTS
  • Profile
    최용일 2002.04.25 04:08
    안녕하세요. 최용일입니다.

    잘 알고 계시네요... 타입이 안맞아서 그럽니다.

    님이 작성하신거는 그냥 함수이고, OnTimer이벤트는 메소드포인터입니다. 객체 내부에 있는 함수를 쓸수 있는 포인터죠...

    메소드포인터는 함수포인터에 객체의 Self값이 들어가 있습니다. 당근 호환이 안됩니다. 메소드포인터 형선언부분을 보시면 뒤에 of object가 들어가 있죠..
    형변환하시면 되지만 아래거 사용해보세요...

    그리고 델파이에 있는 TTimer는 OnTimer이벤트가 nil이 아닐때만 작동하도록 되어 있습니다. 그러니까 이부분만 바꾸시면 되겠네요.

    걍 델파이의 TTimer소스보고 대강 작성했는데 DLL에서도 잘 작동하네요...
    TMyTimer의 Timer메소드에다 원하시는 코딩을 해주시면 됩니다...

    이것보다는 멀티미디어타이머를 쓰시라고 권하고 싶군요. 멀티미디어타이머쓰는 방법은 팁모아나 강의실에 찾아보시면 있을겁니다...

    type
      TMyTimer = class(TComponent)
      private
        FInterval: Cardinal;
        FWindowHandle: HWND;
        FOnTimer: TNotifyEvent;
        FEnabled: Boolean;
        procedure UpdateTimer;
        procedure SetEnabled(Value: Boolean);
        procedure SetInterval(Value: Cardinal);
        procedure SetOnTimer(Value: TNotifyEvent);
        procedure WndProc(var Msg: TMessage);
      protected
        procedure Timer; dynamic;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property Enabled: Boolean read FEnabled write SetEnabled default True;
        property Interval: Cardinal read FInterval write SetInterval default 1000;
        property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
      end;

    implementation

    constructor TMyTimer.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FEnabled := True;
      FInterval := 1000;
      FWindowHandle := AllocateHWnd(WndProc);
    end;

    destructor TMyTimer.Destroy;
    begin
      FEnabled := False;
      UpdateTimer;
      DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;

    procedure TMyTimer.WndProc(var Msg: TMessage);
    begin
      with Msg do
        if Msg = WM_TIMER then
          try
            Timer;
          except
            Application.HandleException(Self);
          end
        else
          Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
    end;

    procedure TMyTimer.UpdateTimer;
    begin
      KillTimer(FWindowHandle, 1);
      if (FInterval <> 0) and FEnabled then
        if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
          raise EOutOfResources.Create('Not enough timers available');
    end;

    procedure TMyTimer.SetEnabled(Value: Boolean);
    begin
      if Value <> FEnabled then
      begin
        FEnabled := Value;
        UpdateTimer;
      end;
    end;

    procedure TMyTimer.SetInterval(Value: Cardinal);
    begin
      if Value <> FInterval then
      begin
        FInterval := Value;
        UpdateTimer;
      end;
    end;

    procedure TMyTimer.SetOnTimer(Value: TNotifyEvent);
    begin
      FOnTimer := Value;
      UpdateTimer;
    end;

    procedure TMyTimer.Timer;
    begin
      // 여기에서 OnTimer 내용 쓰시면 됩니다...
      ShowMessage('Timer event...');
    end;

    ^^ 항상 즐코하세요...



    • mute
      2002.04.25 21:34
      쩝 아냐세염 전 돌파리 입니다. 걍 참고만 하세요 캬캬캬.. 우선 문제의 원인은 이부분입니다. 쩝 뭐...
    • 프로초보
      2002.04.26 01:21
      하하.. 이처럼 답변을 해주시니..어렴풋이 이해가 갈듯(?)하네요.. 딱 저의 수준에 맞는 설명이었슴다..ㅋ...
    • mute
      2002.04.26 20:13
      아따 그냥반 참말로 지가 엄청나게 생각하는거 싫어하는 넘인데 이케 또 질문을 던져 불믄 머리가 참말로 ...
    • 프로초보
      2002.04.27 00:46
      고맙습니다~!!!! 항상 행복하시길.......
    • 이승준
    • 2002.04.25 19:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영철
      2002.04.26 02:44
      혹시 인터넷으로 사용하는 프로그램이 ASP 아닌가요?? 그렇다면 IIS에 설정된 SetsoTimeOut(맞나?) 설정을...
    • 서종환
    • 2002.04.25 18:47
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Tk
      2002.04.26 00:04
      date ->  timestamp
    • 송효철
    • 2002.04.25 15:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신석기
      2002.04.25 19:18
      uses절에   ShellAPI을 추가하시고 클릭적에 ShellExecute(Handle,'open','화일명',nil,nil,S...
    • 유은진
    • 2002.04.25 12:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김영철
    • 2002.04.25 11:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최은석
      2002.04.26 20:58
      in-line view & group by, having을 사용하시면 될듯하네여... 먼저 테이블명을 sample 라 가정하고... ...
    • 공성환
      2002.04.25 18:32
      데이타베이스가 뭔가요? 서브쿼리를 이용하면 될것같은데...
    • 원유훈
    • 2002.04.25 09:27
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박현수
    • 2002.04.25 08:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정규성
    • 2002.04.25 05:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • mute
      2002.04.25 20:47
      자... 걍 허접 답변 들어주세요... ^_^ 이부분에 틀린 부분은 2개 있습니다. 우선 문법상 틀린점은 For...
    • 김상래
    • 2002.04.25 05:49
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.04.25 19:04
      quickRep 에 dataset이 지정 안되서 그런거에여.. 지정하세여..그럼..다 나와여..
    • 김상래
      2002.04.25 19:54
      답변은 고맙습니다. 근데요 DateSet 정의 했는데요. db에 데이타가 5건 있습니다. 근데 출력을 해보면 ...
    • 나원용
    • 2002.04.25 04:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.04.25 19:28
      dbgrid의 onCellClick이벤트에 datetimepicker1.visible:=true;
    • 최수림
    • 2002.04.25 04:26
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이기택
      2002.04.25 06:39
      제가 정확히 해보진 않았지만 format 함수를 쓰신거면 풀로 적어 주어보세요 Cells[0,i] := Formatda...
    • 최용일
      2002.04.25 04:30
      안녕하세요. 최용일입니다. 그냥 Now함수 쓰시면 안되나요? Now함수는 날짜와 시간을 구하는 함수인데.....
    • 최수림
      2002.04.25 04:58
      ^^ 감사합니다..!! 근에요..!! 날짜 시간 현재 날짜로 구해지는데요..!! 날짜와 시간사이..!! 그러니까...
    • 유현성
    • 2002.04.25 03:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:28
      안녕하세요. 최용일입니다. 그냥 TSpeedButton쓰시죠... 자료실에 FlatStyle컴포넌트가 있는데 그것...
    • 박선지
    • 2002.04.25 03:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:16
      안녕하세요. 최용일입니다. 엑셀 쉬트의 마지막 셀을 얻는 함수입니다... 조금 수정해서 사용하세요... ...
    • 전영민
      2002.04.25 03:15
      델파이가 아니라 vba로 예전에 개발했던중에서.. 저도 마지막 row를 알 수가 없어서 for 대신에 whil...
    • 최용일
      2002.04.25 04:08
      안녕하세요. 최용일입니다. 잘 알고 계시네요... 타입이 안맞아서 그럽니다. 님이 작성하신거는 그냥...
    • 정진영
    • 2002.04.25 02:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:33
      안녕하세요. 최용일입니다. EAccessViolation는 메모리 참조 오류인데... 생성되지 않은 객체나 이미 해...
    • 정진영
      2002.04.25 19:46
      close하기전에 폼을 변수로 선언하고 닫아주니 되네요.. 근데 거기서 문제가... 닫고자 하는 폼이 TfrmA...
    • 신석기
      2002.04.25 02:26
      if DBGrid1.SelectedField.FieldName = 'Field1' then begin // end; 위방법은 이상이 없습니다. G...
    • 서종환
      2002.04.25 18:15
      우선 답변에 감사드립니다. 음, RowSelect가 True인 상태이더군요... False로 하면 다 먹습니다. 그러나 ...
    • 이희정
    • 2002.04.25 01:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신석기
      2002.04.25 02:13
      환경설정을 검사해봐야 정확히 진단을 할 수 있을것 같습니다 일반적으로 import/Export 할때 option문제...