代码理解-------------
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);中 ,
提到互斥体对象, 怎样理解?
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);中 ,
提到互斥体对象, 怎样理解?
3:是类型转化,@WPRoc := pointer(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)))也可以
4:互斥体对象在你上面这段程序中是为了检查进程是否已运行。互斥体对象还可以用在线程同步等上,看看API大全吧 :)
答:先注册一个消息标识,然后将此标识作为一个互斥量返回句柄,在返回的时候对不同的情况做相应处理:如果此消息标识不是一个互斥量则创建,否则调用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函数手动维护!
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仅仅是返回存在的互斥量句柄, 一般用于不允许有重复的实例运行.
答:先注册一个消息标识,然后将此标识作为一个互斥量返回句柄,在返回的时候对不同的情况做相应处理:如果此消息标识不是一个互斥量则创建,否则调用BroadcastFocusMessage----这个过程的代码不清楚,无法回答!
非常感谢你(FrameSniper)的提醒, 刚才没仔细看. 请版主扣elilor(elilor)2分,liqth(liqth)30分 加到 (FrameSniper).