做了一个托盘程序,里面使用了spcomm组件获取数据,在程序运行时操作系统无法关闭,必须先退出托盘程序系统才能关闭;
开始以为是托盘程序造成的,后来发现没有使用spcomm组件的托盘程序可以正常关闭操作系统.
  然后我做了一个很简单的测试程序,就是一个一般的程序一个页面(非托盘程序),放了一个spcomm组件,无任何操作,没有对spcomm进行任何操作,在程序运行时操作系统也不能正常关闭;
  另外程序截获不到关机消息WM_QUERYENDSESSION
  spcomm版本是2.5的
  这个问题好像很久以前也有人遇到过,但是没找到解决的办法  下面是我的测试程序代码unit Unit3;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SPComm;type
  TForm3 = class(TForm)
    Comm: TComm;
  procedure  WMQueryEndSession(var Message:TMessage);message WM_QUERYENDSESSION;
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form3: TForm3;implementation{$R *.dfm}Function  WriteLog(LogStr:string):Boolean;
var
  F:TextFile;
  Filename: string;
begin  try
    Filename:=ExtractFilePath(LowerCase(ParamStr(0)))+'log.txt' ;
    AssignFile(F,FileName);    if not FileExists(Filename) then
      begin
        Rewrite(F);
      end else
      begin
        Append(F);
      end;    Writeln(F, FormatdateTime('yymmdd hh:mm:ss',now)+':'+LogStr);
    CloseFile(F);    result:=true;
  except
    result:=false;
  end;
end;procedure   TForm3.WMQueryEndSession(var Message:TMessage);
begin
  WriteLog('TForm3-WMQueryEndSession');
end;end.

解决方案 »

  1.   

    可以响应OnClose事件么?在OnClose事件里面关闭你的spcomm看看
      

  2.   

    spcomm我没有打开(Startcomm)过关机的时候没有触发OnClose事件
      

  3.   

    打开spcomm.pas文件找到CommWndProc方法,补充红色部分代码procedure TComm.CommWndProc( var msg: TMessage );
    begin
         case msg.msg of
              PWM_GOTCOMMDATA:
              begin
                   ReceiveData( PChar(msg.LParam), msg.WParam );
                   LocalFree( msg.LParam )
              end;
              PWM_RECEIVEERROR:    ReceiveError( msg.LParam );
              PWM_MODEMSTATECHANGE:ModemStateChange( msg.LParam );
              PWM_REQUESTHANGUP:   RequestHangup;
              PWM_SENDDATAEMPTY:   _SendDataEmpty
         else
            with msg do
            Result := DefWindowProc(FHWnd, Msg, WParam, LParam);

         end
    end;
      

  4.   

    我用的SPCOMM2.5修正版,没有出现任何问题
    http://download.csdn.net/source/1338963
      

  5.   

    TComm截获了系统消息,
    但是不是自己需要的消息时却没有将此消息还给系统,导致系统无法关机    else
            with msg do
            Result := DefWindowProc(FHWnd, Msg, WParam, LParam); 
    这段就起到了这个作用吧修正版应该已经处理过这个问题所以没有问题