代码理解-------------
if CheckInstance('PURCHASE') then
 Begin
…….
End;
-------------------------------------------------------------------------------
function CheckInstance(sApp : string) : boolean;
begin
  UniqueAppStr := PChar(sApp);
  MessageID := RegisterWindowMessage(UniqueAppStr);
  if InitInstance then result := true
  else result := false;
end;
-------------------------------------------------------------------------------
function InitInstance: boolean;
begin
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS,False,UniqueAppStr);
  if MutHandle = 0 then begin
    DoFirstInstance;
    result := true;
  end
  else begin
    BroadcastFocusMessage;
    result := false;
  end
end;
-------------------------------------------------------------------------------
procedure DoFirstInstance;
begin
  SubClassApplication;
  MutHandle := CreateMutex(Nil, False, UniqueAppStr);
  if MutHandle = 0 then
 MIError := MIError or MI_FAIL_CREATE_MUTEX;
end;
-------------------------------------------------------------------------------
procedure SubClassApplication;
begin
  WPRoc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));
  if WProc = Nil then MIError := MIError or MI_FAIL_SUBCLASS;
end;
-------------------------------------------------------------------------------
1.函数 CheckInstance('PURCHASE') 在此处的作用? 
2.RegisterWindowMessage(UniqueAppStr); 有没有写到注册表中?
3. TFNWndProc(SetWindowLong(Appli…(@NewWndProc)))
TFNWndProc 是什么?(是不是强制类型转化,如是那是什么类型?)
4.OpenMutex(MUTEX_ALL_ACCESS,False,UniqueAppStr); 和
CreateMutex(Nil, False, UniqueAppStr);中 ,
提到互斥体对象, 怎样理解?
    

解决方案 »

  1.   

    2:没有写到注册表中。
    3:是类型转化,@WPRoc := pointer(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)))也可以
    4:互斥体对象在你上面这段程序中是为了检查进程是否已运行。互斥体对象还可以用在线程同步等上,看看API大全吧 :)
      

  2.   

    1.函数 CheckInstance('PURCHASE') 在此处的作用? 
    答:先注册一个消息标识,然后将此标识作为一个互斥量返回句柄,在返回的时候对不同的情况做相应处理:如果此消息标识不是一个互斥量则创建,否则调用BroadcastFocusMessage----这个过程的代码不清楚,无法回答!2.RegisterWindowMessage(UniqueAppStr); 有没有写到注册表中?
    答:这个和注册表没有任何关系,仅仅是定义一个消息标识,以备将来作为互斥量使用或调用消息发送函数如SendMessage等来进行发送等操作3. TFNWndProc(SetWindowLong(Appli…(@NewWndProc)))
    TFNWndProc 是什么?(是不是强制类型转化,如是那是什么类型?)
    答:这里是强制类型转换,但这个类型应该是你程序自定义类型,无类型申明的情况下无法判断!4.OpenMutex(MUTEX_ALL_ACCESS,False,UniqueAppStr); 和
    CreateMutex(Nil, False, UniqueAppStr);中 ,
    提到互斥体对象, 怎样理解?
    答:OpenMuteX仅仅是返回一个已存在的互斥量的句柄
    CreateMuteX则是创建一个互斥量
    所有对互斥量的维护都应该由程序员调用相应API函数手动维护!
      

  3.   

    -------------------------------------------------------------------------------
    1.函数 CheckInstance('PURCHASE') 在此处的作用? 
    2.RegisterWindowMessage(UniqueAppStr); 有没有写到注册表中?
    3. TFNWndProc(SetWindowLong(Appli…(@NewWndProc)))
    TFNWndProc 是什么?(是不是强制类型转化,如是那是什么类型?)
    4.OpenMutex(MUTEX_ALL_ACCESS,False,UniqueAppStr); 和
    CreateMutex(Nil, False, UniqueAppStr);中 ,
    提到互斥体对象, 怎样理解?解:
    1.函数 CheckInstance('PURCHASE') 在此处的作用? 
      是否已经存在一份进程实例2.RegisterWindowMessage(UniqueAppStr); 有没有写到注册表中?
      没有写到注册表3.TFNWndProc(SetWindowLong(Appli…(@NewWndProc)))
      TFNWndProc 是什么?(是不是强制类型转化,如是那是什么类型?)
      是强制类型转换
    4. OpenMutex(MUTEX_ALL_ACCESS,False,UniqueAppStr); 和
       CreateMutex(Nil, False, UniqueAppStr);中 ,
       OpenMuteX仅仅是返回存在的互斥量句柄, 一般用于不允许有重复的实例运行.
      

  4.   

    1.函数 CheckInstance('PURCHASE') 在此处的作用? 
    答:先注册一个消息标识,然后将此标识作为一个互斥量返回句柄,在返回的时候对不同的情况做相应处理:如果此消息标识不是一个互斥量则创建,否则调用BroadcastFocusMessage----这个过程的代码不清楚,无法回答!
    非常感谢你(FrameSniper)的提醒, 刚才没仔细看.   请版主扣elilor(elilor)2分,liqth(liqth)30分 加到 (FrameSniper).