有请高手......

S海鸥 2003-08-14 10:32:36
代码理解-------------
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);中 ,
提到互斥体对象, 怎样理解?

...全文
33 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
S海鸥 2003-09-20
  • 打赏
  • 举报
回复
1.函数 CheckInstance('PURCHASE') 在此处的作用?
答:先注册一个消息标识,然后将此标识作为一个互斥量返回句柄,在返回的时候对不同的情况做相应处理:如果此消息标识不是一个互斥量则创建,否则调用BroadcastFocusMessage----这个过程的代码不清楚,无法回答!


非常感谢你(FrameSniper)的提醒, 刚才没仔细看. 请版主扣elilor(elilor)2分,liqth(liqth)30分 加到 (FrameSniper).


FrameSniper 2003-09-20
  • 打赏
  • 举报
回复
楼上几个朋友说第一个问题的作用是检测是否有进程实例的说法完全不正确!
FrameSniper 2003-09-20
  • 打赏
  • 举报
回复
我都怀疑这个帖子是不是倒分啊!
liqth 2003-09-20
  • 打赏
  • 举报
回复
-------------------------------------------------------------------------------
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仅仅是返回存在的互斥量句柄, 一般用于不允许有重复的实例运行.

FrameSniper 2003-09-20
  • 打赏
  • 举报
回复
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函数手动维护!
S海鸥 2003-09-20
  • 打赏
  • 举报
回复
up
pankun 2003-08-14
  • 打赏
  • 举报
回复
2:没有写到注册表中。
3:是类型转化,@WPRoc := pointer(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)))也可以
4:互斥体对象在你上面这段程序中是为了检查进程是否已运行。互斥体对象还可以用在线程同步等上,看看API大全吧 :)
elilor 2003-08-14
  • 打赏
  • 举报
回复
1.检查是否已经存在一份进程实例;
2.不会

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧