program test;uses
  SysUtils,
  Windows;
var
  HMutex: THandle;
  h:THandle;  //应用程序句柄begin
  
  //程序只执行一次
  HMutex := CreateMutex(nil, False, '54BAB749-13BA-4468-84D6-08ABC2A6F837');
  if WaitForSingleObject(hMutex, 0) = wait_TimeOut then
  begin
    Exit;
  end;
  
  h := //这里怎么取应用程序句柄
  //这里不用Application.Handle; 这种方式。因为有些原因需要应用程序比较小。用 Application 对象的话,就可引用Forms单元,应用程序就会变大了很多。
  //没有引用Forms时只有40K多,用了Forms后就变成360多K了~~想看这里有没有直接用API函数来取得的end.

解决方案 »

  1.   

    to liangqingzhi : 
      GetCurrentProcess取到的值和Application.Handle值是不一样的?Application.Handle是主窗口的句柄吗?有时候GetCurrentProcess取到期是-1或0是怎么回事?
      

  2.   

    建议你看一下DELPHI源码分析.那里首页就讲了 hello word的最小程序.
      

  3.   

    《Delphi源代码分析》第一章就是讲最小化内核的,楼主可以去找本电子书看看
      

  4.   

    见http://www.delphibbs.com/keylife/iblog_show.asp?xid=523:
    application.handle是程序在TaskBar上的窗体的句柄
      

  5.   

    为什么必须要取到句柄呢?换一种方式不行吗?
    无窗口的话,ClassName类名总有吧?应该可以用FindWindow来查找
      

  6.   

    不知道你要实现什么功能,所以都不好回答。
    Application.Handle应用程序句柄,实际上是一个窗口句柄,创建过程是这么一句:    FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);你的是无窗口(Console)程序,并没有创建窗口,无法使用它来取到句柄。
    而它也不是主窗口句柄,Application.MainForm.Handle才是主窗口句柄。进程句柄和窗口句柄是完全不同的。如果GetCurrentProcess取不到,用GetCurrentProcessId取进程Id,再用OpenProcess取句柄